我正在使用
public static String getLocalIPAddress(WifiManager wm){
return Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
}
获取执行设备的IP地址。如果设备连接到“公共”wlan网络,并且设备连接到由其他Android设备通过热点托管的wifi网络,则工作正常。如果设备未连接到任何wifi网络,则返回“0.0.0.0”(正确)。但是,如果设备通过提供热点来托管wifi网络,则该方法仍然返回“0.0.0.0”。如何在“自己的wifi网络”中获取热点提供设备的真实IP地址?
thx&问候
答案 0 :(得分:24)
你几乎是对的,热点的默认IP地址是192.168.43.1
(如果设备制造商没有改变。)
您可以查看Android框架(AOSP)的源代码。
/frameworks/base/services/java/com/android/server/connectivity/Tethering.java
/frameworks/base/wifi/java/android/net/wifi/WifiStateMachine.java
在Tethering.java中,
private static final String USB_NEAR_IFACE_ADDR = "192.168.42.129";
private static final int USB_PREFIX_LENGTH = 24;
// USB is 192.168.42.1 and 255.255.255.0
// Wifi is 192.168.43.1 and 255.255.255.0
// BT is limited to max default of 5 connections. 192.168.44.1 to 192.168.48.1
// with 255.255.255.0
private String[] mDhcpRange;
private static final String[] DHCP_DEFAULT_RANGE = {
"192.168.42.2", "192.168.42.254", "192.168.43.2", "192.168.43.254",
"192.168.44.2", "192.168.44.254", "192.168.45.2", "192.168.45.254",
"192.168.46.2", "192.168.46.254", "192.168.47.2", "192.168.47.254",
"192.168.48.2", "192.168.48.254",
};
另外,在WifiStateMachine.java
中private boolean startTethering(ArrayList<String> available) {
boolean wifiAvailable = false;
checkAndSetConnectivityInstance();
String[] wifiRegexs = mCm.getTetherableWifiRegexs();
for (String intf : available) {
for (String regex : wifiRegexs) {
if (intf.matches(regex)) {
InterfaceConfiguration ifcg = null;
try {
ifcg = mNwService.getInterfaceConfig(intf);
if (ifcg != null) {
/* IP/netmask: 192.168.43.1/255.255.255.0 */
ifcg.setLinkAddress(new LinkAddress(
NetworkUtils.numericToInetAddress("192.168.43.1"), 24));
ifcg.setInterfaceUp();
mNwService.setInterfaceConfig(intf, ifcg);
}
} catch (Exception e) {
loge("Error configuring interface " + intf + ", :" + e);
return false;
}
if(mCm.tether(intf) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
loge("Error tethering on " + intf);
return false;
}
mTetherInterfaceName = intf;
return true;
}
}
}
// We found no interfaces to tether
return false;
}
因此,默认值为192.168.43.1
。
答案 1 :(得分:12)
我测试了一小部分不同的设备,似乎热点提供设备在其网络上始终具有IP 192.168.43.1
。有人可以检查/确认这个假设吗?
答案 2 :(得分:5)
Hotspot可能充当DHCP服务器。所以,
连接到远程(客户端)后调用wifi方法获取wifi热点的IP地址(服务器)
<script type="text/javascript">
$("#userform").submit(function(e) {
e.preventDefault();
var url = $(this).attr('action');
var formData = new FormData($(this)[0]);
$.ajax({
type: "POST",
url: url,
data: formData,
processData: false,
dataType: 'json',
success: function(data)
{
console.log(data);
$('#message').html(data.message);
}
});
});
</script>
然后
intToInetAddress(wifiManager.getDhcpInfo().serverAddress);// get hotspot ip
将返回已连接热点的IP地址,是的,热点的大多数默认IP地址为192.168.43.1
答案 3 :(得分:2)
尽管这是一个古老的问题,但这可能会对某人有所帮助。只要您打开了热点,它就会返回设备的IP地址。
private String getIpAddress() {
String ip = "";
try {
Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
.getNetworkInterfaces();
while (enumNetworkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = enumNetworkInterfaces
.nextElement();
Enumeration<InetAddress> enumInetAddress = networkInterface
.getInetAddresses();
while (enumInetAddress.hasMoreElements()) {
InetAddress inetAddress = enumInetAddress.nextElement();
if (inetAddress.isSiteLocalAddress()) {
ip += "SiteLocalAddress: "
+ inetAddress.getHostAddress() + "\n";
}
}
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ip += "Something Wrong! " + e.toString() + "\n";
}
return ip;
}
答案 4 :(得分:0)
我还检查了几个设备,所有设备的IP地址均为192.168.43.1 你可以试试这个地址 但在android pie中变成了192.168.43.68
答案 5 :(得分:0)
打开termux并运行
pkg install net-tools
ifconfig -a | grep 192.168.43.
您会得到的:
inet 192.168.43.248 netmask 255.255.255.0 broadcast 192.168.43.255