gpt4 book ai didi

Android 在启用热点的设备上发送 UDP 广播

转载 作者:太空狗 更新时间:2023-10-29 16:41:15 31 4
gpt4 key购买 nike

在我的应用程序中,我想广播一些 UDP 数据包。我目前正在使用此方法获取所需的广播地址:

InetAddress getBroadcastAddress() throws IOException {
WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = wifi.getDhcpInfo();
// handle null somehow

int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
return InetAddress.getByAddress(quads);
}

-> https://code.google.com/p/boxeeremote/wiki/AndroidUDP

这工作正常,但如果设备已激活热点并尝试在抛出 SocketException 后广播数据包:SocketException: sendto failed: ENETUNREACH (Network is unreachable)
如何在“提供”热点的设备上获得正确的广播地址?我尝试过的所有单播地址都工作正常......

谢谢和问候

PS:最低 SDK 为 API 8!

最佳答案

我使用这段代码解决了这个问题:

private InetAddress getBroadcastAddress(WifiManager wm, int ipAddress) throws IOException {
DhcpInfo dhcp = wm.getDhcpInfo();
if(dhcp == null)
return InetAddress.getByName("255.255.255.255");
int broadcast = (ipAddress & dhcp.netmask) | ~dhcp.netmask;
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
return InetAddress.getByAddress(quads);
}

重要的是你用“真实”的 ip 地址调用 getBroadcastAddress(我见过的一些方法不能在热点上提供):

public static int getCodecIpAddress(WifiManager wm, NetworkInfo wifi){
WifiInfo wi = wm.getConnectionInfo();
if(wifi.isConnected())
return wi.getIpAddress(); //normal wifi
Method method = null;
try {
method = wm.getClass().getDeclaredMethod("getWifiApState");
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(method != null)
method.setAccessible(true);
int actualState = -1;
try {
if(method!=null)
actualState = (Integer) method.invoke(wm, (Object[]) null);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if(actualState==13){ //if wifiAP is enabled
return "192.168.43.1" //hardcoded WifiAP ip
}
return 0;
}
public static int convertIP2Int(byte[] ipAddress){
return (int) (Math.pow(256, 3)*Integer.valueOf(ipAddress[3] & 0xFF)+Math.pow(256, 2)*Integer.valueOf(ipAddress[2] & 0xFF)+256*Integer.valueOf(ipAddress[1] & 0xFF)+Integer.valueOf(ipAddress[0] & 0xFF));
}

关于Android 在启用热点的设备上发送 UDP 广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17514115/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com