Android Найти ip-адрес устройства, когда он принимает хот-спот
Мне нужно найти ip-адрес устройства, когда он принимает хот-спот. Я использовал этот код до сих пор:
//if is using Hotspot
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
if (intf.getName().contains("wlan")) {
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && (inetAddress.getAddress().length == 4)) {
return inetAddress.getHostAddress();
}
}
}
}
Это работает отлично, но имя wifi NetworkInterface
отличается на некоторых устройствах. Поэтому сначала нужно найти имя устройства wifi NetworkInterface
(для его точки доступа). Как я могу найти это имя? Или есть лучший подход для поиска IP-адреса устройства?
///Поиск правильного IP-адреса с помощью MAC также не работает
Ответы
Ответ 1
Недавно я выяснил, что IP-адрес WifiAP жестко запрограммирован в Android. Если пользователь не изменил это значение вручную (я думаю, что это очень редко), использование жестко заданного значения является абсолютно достаточным. Я думаю, что это лучший способ пойти. IP-адрес: "192.168.43.1": https://github.com/CyanogenMod/android_frameworks_base/blob/cm-10.1/wifi/java/android/net/wifi/WifiStateMachine.java?source=c#L1299
Ответ 2
Сначала я попытался получить MAC-адрес интерфейса WiFi, чтобы сравнить его с MAC-адресом каждого интерфейса. Но оказывается, что по крайней мере на моем N4 запуске CM MAC-адрес интерфейса WiFi изменяется при включении Точки доступа.
Итак, я написал некоторый код, чтобы ходить по списку устройств, чтобы найти что-то, чтобы идентифицировать интерфейс wifi. Этот код отлично работает на моем N4:
private String getWifiIp() throws SocketException {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
if (intf.isLoopback()) {
continue;
}
if (intf.isVirtual()) {
continue;
}
if (!intf.isUp()) {
continue;
}
if (intf.isPointToPoint()) {
continue;
}
if (intf.getHardwareAddress() == null) {
continue;
}
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses();
enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (inetAddress.getAddress().length == 4) {
return inetAddress.getHostAddress();
}
}
}
return null;
}
Только один интерфейс соответствует всем условиям: wlan0
.
Возможное другое решение:
Пройдите по наиболее распространенным именам интерфейсов и попробуйте найти их в списке: new String[] { "wlan0", "eth0", ...];
Ответ 3
Это может помочь вам.
Выполняя вызов оболочки, чтобы спросить сетевые адаптеры и проверить те, которые вам нужны, в этом случае это wlan, поэтому следуйте этому коду
Process p=Runtime.getRuntime().exec("ip link show | grep -o \": wlan[0-9]:\" ");
BufferedReader readCommandOutput =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line=null;
while((line=readCommandOutput.readLine())!=null){
// Lines containing wlan will be returned
// parse to get the name of that interface.
String interface=line.split(":")[1];
//this is the interface you need.
}
if (line==null){
//nothing was found.
}
readCommandOutput.close();
Прилагаемые примечания
Или вы можете использовать эмулятор терминала Android из магазина воспроизведения, чтобы запустить эту команду в оболочке Android.
Для получения IP-адреса
WifiManager wifi=(WifiManager)getSystemService(WIFI_SERVICE);
int address=wifi.getDhcpInfo().ipAddress;
Toast.makeText(this,intToIP(address),1).show();
public String intToIP(int i) {
return ((i & 0xFF)
+ "." + ((i >> 8) & 0xFF)
+ "." + ((i >> 16) & 0xFF)
+ "." + ((i >> 24) & 0xFF));
}
Ответ 4
это решение работает, когда вы хотите получить ip-адрес устройства hotspot на том же устройстве, но не знаете, как его получить на подключенном устройстве
(в основном IP-сервер - 192.168.43.1, вы можете выполнить работу с помощью жесткого кодирования)
public void serverip()
{
DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();
if (dhcpInfo==null){
Toast.makeText(MainActivity.this, "No ip for server", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "ip of server "+android.text.format.Formatter.formatIpAddress(dhcpInfo.gateway), Toast.LENGTH_SHORT).show();
}
}
Ответ 5
Пожалуйста, замените intf.getName()
на intf.getDisplayName()
, а затем попробуйте.
Ответ 6
Попробуйте этот код:
public String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
String ip = Formatter.formatIpAddress(inetAddress.hashCode());
Toast.makeText(getApplicationContext(), "***** IP="+ ip, 1).show();
return ip;
}
}
}
} catch (SocketException ex) {
Toast.makeText(getApplicationContext(), "***** IP="+ex.toString(), 1).show();
}
return null;
}
Введите код в oncreat для проверки, hotspot is Enable не.....
WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
wifiManager.setWifiEnabled(false);
boolean wifiEnabled = wifiManager.isWifiEnabled();
if (wifiEnabled) {
Toast.makeText(getApplicationContext(),"on",Toast.LENGTH_SHORT).show();
getLocalIpAddress();
}else {
Toast.makeText(getApplicationContext(),"off",Toast.LENGTH_SHORT).show();
}
Ответ 7
user2224350 сказал: "Недавно я выяснил, что IP-адрес WifiAP жестко закодирован на Android".
Если пользователь не изменил это значение вручную (я думаю, что это очень редко), использование жестко заданного значения является абсолютно достаточным. Я думаю, что это лучший способ пойти. IP-адрес "192.168.43.1", как показано здесь.
Это работает на моем Samsung A3 и Huawei PRA-LX1, но HTC Desires 530 также возвращает 192.168.1.1
.