【问题标题】:Android UDP Packets are sent to the wrong addressAndroid UDP 数据包被发送到错误的地址
【发布时间】:2020-03-11 15:21:06
【问题描述】:

我正在制作一个连接到作为接入点的树莓派的安卓应用程序。手机连接到接入点是这样的:

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 网络而不是移动网络,即使两者都已启用。有没有办法做到这一点?

【问题讨论】:

标签: android sockets udp


【解决方案1】:

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

我很确定这就是 POSIX 套接字公开此功能的方式。我当然在 C 的 Linux 下做过类似的事情。我没有在 Android 中尝试过,但它最终会使用相同的内核接口,所以很有信心说这是你应该寻找的。​​p>

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

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多