Как получить IP-адрес Wi-Fi-точки доступа в Android?
Как говорится в заголовке... Я пытаюсь получить IP-адрес wifi iface, когда он настроен как точка доступа. В идеале я хотел бы найти что-то, что работает для всех телефонов.
Конечно, WifiManager бесполезен, когда дело доходит до получения информации от AP.
К счастью, я смог получить IP-адреса всех интерфейсов, выполнив следующие действия:
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()) {
Log.d("IPs", inetAddress.getHostAddress() );
}
}
}
} catch (SocketException ex) {
Log.e(LOG_TAG, ex.toString());
}
return null;
}
Этот кусок кода распечатает весь IP-адрес всех интерфейсов (включая горячую точку Wi-Fi). Основная проблема заключается в том, что я не нахожу способ идентифицировать интерфейс WiFi. Это проблема, поскольку некоторые телефоны имеют несколько интерфейсов (WiMax и т.д.). Это то, что я пробовал до сих пор:
- Фильтрация с помощью отображаемого имени wifi iface: это не очень хороший подход, поскольку отображаемое имя изменяется с одного устройства на другое (wlan0, eth0, wl0.1 и т.д.).
- Фильтрация по его MAC-адресу: почти работает, но на некоторых устройствах точка доступа iface не имеет MAC-адрес (iface.getHardwareAddress() возвращает null)... поэтому недействительное решение.
Любые предложения?
Ответы
Ответ 1
Вот что я сделал, чтобы получить wifi hotspot ip:
public String getWifiApIpAddress() {
try {
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)) {
Log.d(TAG, inetAddress.getHostAddress());
return inetAddress.getHostAddress();
}
}
}
}
} catch (SocketException ex) {
Log.e(TAG, ex.toString());
}
return null;
}
Это даст вам IP-адрес устройства любого wifi, что означает его не только для точки доступа. Если вы подключены к другой сети Wi-Fi (что означает, что вы не находитесь в режиме "горячей точки" ), он вернет IP-адрес.
Сначала вы должны проверить, находитесь ли вы в режиме AP или нет. Вы можете использовать этот класс для этого: http://www.whitebyte.info/android/android-wifi-hotspot-manager-class
Ответ 2
Вы можете использовать это. Он не тестировался, но должен работать.
((WifiManager) mContext.getSystemService(Context.WIFI_SERVICE)).getDhcpInfo().serverAddress
Ответ 3
Вот возможное решение, в котором используется WiFiManager
ConnectionInfo
, чтобы найти соответствующий NetworkInterface
.
Если вам просто нужен IP-адрес, вы можете использовать:
WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
Ответ 4
Когда Wi-Fi не настроен как горячая точка, он имеет имя android-xx7632x324x32423
home
когда горячая точка включена, это имя исчезло. Также изменяется IP-адрес.
Итак, если вы можете получить конфигурацию Wifi перед включением точки доступа, прежде всего, вы можете использовать intf.getName()
, чтобы получить ссылку на нее.
Во-вторых, ip изменился, поэтому, если вы знаете, какой интерфейс Wi-Fi находится в режиме CONNECTED
, вы можете использовать эту информацию, чтобы позже идентифицировать ее после включения точки доступа.
Ниже приведен код, который я использовал для отладки. Я просто выплю все, что могу найти, сделать огромный беспорядок, а затем очистить его, когда я понял, что проблема. GL
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Collections;
import android.net.ConnectivityManager;
textStatus = (TextView) findViewById(R.id.textStatus);
try {
for (NetworkInterface intf : Collections.list(NetworkInterface.getNetworkInterfaces())) {
for (InetAddress addr : Collections.list(intf.getInetAddresses())) {
if (!addr.isLoopbackAddress()){
textStatus.append("\n\n IP Address: " + addr.getHostAddress() );
textStatus.append("\n" + addr.getHostName() );
textStatus.append("\n" + addr.getCanonicalHostName() );
textStatus.append("\n\n" + intf.toString() );
textStatus.append("\n\n" + intf.getName() );
textStatus.append("\n\n" + intf.isUp() );
}
}
}
} catch (Exception ex) {
textStatus.append("\n\n Error getting IP address: " + ex.getLocalizedMessage() );
}
connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
allInfo = connectivity.getAllNetworkInfo();
mobileInfo = connectivity.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
textStatus.append("\n\n TypeName: " + mobileInfo.getTypeName());
textStatus.append("\n State: " + mobileInfo.getState());
textStatus.append("\n Subtype: " + mobileInfo.getSubtype());
textStatus.append("\n SubtypeName: " + mobileInfo.getSubtypeName());
textStatus.append("\n Type: " + mobileInfo.getType());
textStatus.append("\n ConnectedOrConnecting: " + mobileInfo.isConnectedOrConnecting());
textStatus.append("\n DetailedState: " + mobileInfo.getDetailedState());
textStatus.append("\n ExtraInfo: " + mobileInfo.getExtraInfo());
textStatus.append("\n Reason: " + mobileInfo.getReason());
textStatus.append("\n Failover: " + mobileInfo.isFailover());
textStatus.append("\n Roaming: " + mobileInfo.isRoaming());
textStatus.append("\n\n 0: " + allInfo[0].toString());
textStatus.append("\n\n 1: " + allInfo[1].toString());
textStatus.append("\n\n 2: " + allInfo[2].toString());
Ответ 5
private static byte[] convert2Bytes(int hostAddress) {
byte[] addressBytes = { (byte)(0xff & hostAddress),
(byte)(0xff & (hostAddress >> 8)),
(byte)(0xff & (hostAddress >> 16)),
(byte)(0xff & (hostAddress >> 24)) };
return addressBytes;
}
public static String getApIpAddr(Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();
byte[] ipAddress = convert2Bytes(dhcpInfo.serverAddress);
try {
String apIpAddr = InetAddress.getByAddress(ipAddress).getHostAddress();
return apIpAddr;
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
}
Ответ 6
Я использую решение ajma, меняя intf.getName().contains("wlan")
на intf.getName().contains("wl") || intf.getName().contains("ap")
. И он работает для многих мобильных телефонов.
Но он возвращает null, когда вы просто подключены к WiFi.