【问题标题】:Android sending UDP broadcast on a hotspot enabling deviceAndroid 在启用热点的设备上发送 UDP 广播
【发布时间】:2013-07-07 16:47:14
【问题描述】:

在我的应用程序中,我想广播一些 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

【问题讨论】:

    标签: android udp wifi broadcast android-networking


    【解决方案1】:

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

    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));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多