Android UDP数据包发送到错误的地址

时间:2019-11-15 12:58:32

标签: android sockets udp

我正在制作一个Android应用程序,该应用程序连接到充当访问点的树莓派。手机将像这样连接到接入点:

String SSID = "Alarm";
String pass = "Alarm123"
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + SSID + "\"";
conf.preSharedKey = "\"" + pass + "\"";

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);

if(!wifiManager.isWifiEnabled()) {
    wifiManager.setWifiEnabled(true);
}

int netId = wifiManager.addNetwork(conf);

wifiManager.disconnect();
wifiManager.enableNetwork(netId, true);
wifiManager.reconnect();

这很好用。之后,电话需要向网络广播UDP数据包,我这样做是这样的:

try {
    DatagramSocket socket = new DatagramSocket();
    socket.setBroadcast(true);
    byte[] message = "013A2610E3882D08".getBytes();
    DatagramPacket packet = new DatagramPacket(message, message.length, InetAddress.getByName("255.255.255.255"), 2002);
    socket.send(packet);

    System.out.println("Packet sent");
    socket.close();

}  catch (IOException e) {
    e.printStackTrace();

}

问题在于,在手机上启用了移动数据后,在需要接收的地方没有收到该数据包。我认为这是由于树莓派的访问点无法访问互联网,因此移动数据也保持启用状态,并且数据包被发送到移动连接而不是wifi网络。当我禁用移动数据时,它确实起作用。

我正在寻找一种以编程方式禁用移动数据的方法,但我发现从Android 4.4开始不再可行。

我当然可以显示一个提示,要求用户禁用移动数据,但是我宁愿找到一种将数据包广播到wifi网络而不是移动网络的方法,即使两者均已启用。有办法吗?

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解您的问题,但是在发送广播数据包之前,您应该能够bind将套接字插入与wifi适配器关联的地址。这样,内核将知道在发送数据包时使用哪个接口。

我很确定这是POSIX套接字公开此功能的方式。我当然已经在C语言的Linux下完成了类似的工作。我还没有在Android上尝试过,但是最终会使用相同的内核接口,因此,您很有信心地说这就是您要寻找的。

这假设移动设备实际上已连接到该wifi网络。您应该能够检入调试器,或者可以在移动设备的外壳中使用ifconfigip