2013-07-07 3 views
0

В моем приложении я хочу транслировать некоторые UDP-пакеты. Я в настоящее время использую этот Methode, чтобы получить нужный широковещательный адрес:Android-передача 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!

ответ

2

мне удалось эту проблему, используя этот код:

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

Важно то, что вы называете getBroadcastAddress с «реальным» IP-адрес (некоторые методы я видел не может предусмотреть, что на точке доступа):

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