我需要在Android设备上检测WiFi网络中的本地IP地址和子网掩码,以便严格计算本地子网的UDP广播地址。
当设备连接到接入点时,以下内容正常工作:
// Only works when NOT tethering
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = wifi.getDhcpInfo();
if (dhcp == null)
throw new IOException("No DHCPInfo on WiFi side.");
foo(dhcp.ipAddress, dhcp.netmask);
但是,当安卓设备通过热点共享提供访问点时,它似乎无法正常工作:DhcpInfo似乎包含的信息是由DHCP服务器设置的,当安卓设备作为其客户端时,而不是当安卓设备本身提供DHCP服务时。在热点共享时,我找到的最有前途的解决方案是:
// No way to get subnet mask
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
if (info == null)
throw new IOException("No connection info on WiFi side.");
foo(info.getIpAddress(), info.??? /* netmask*/ );
编辑:错误,根据我的测试,即使是这种情况下,仅在没有使用网络共享时才有效。当使用网络共享时,IP地址始终为0。
但是并没有像WifiInfo.getNetMask()
一样的方法,那么我该如何获取子网掩码呢?(这个缺失让我感到非常奇怪,因为还有其他大量信息可供使用。我是否错过了什么显而易见的东西?)
此外,理想情况下,我希望不需要区分Android设备是否提供网络共享,只需在任何情况下都可以获取WiFi网络上的本地IP地址和子网掩码,无论Android设备是提供者还是Access Point的客户端。
甚至标准Java(即非Android特定的)NetworkInterface.getNetworkInterfaces()
似乎也没有办法获取子网掩码(除了不允许区分哪个对应于WiFi之外)。我错过了什么吗?