如何在 Android 上的 Chrome App 运行 中接收 UDP 广播数据包

How to receive UDP broadcast packets in Chrome App running on Android

我可以在 windows 运行 chrome 应用程序中毫无问题地接收广播数据包。但是,当我使用该应用程序并使用 cordova/crosswalk 工具进行编译时,我似乎无法接收到任何数据包。我在 wireshark 中看到了所有数据包。我的数据包是 t运行 发送自:172.24.0.42 并在 172.24.255.255 上广播(在 255.255.255.255 上的广播在 Android 上不起作用,但在 windows chrome 应用程序)。

这是我的 (manifest.json):

"sockets":{
        "udp": {
            "bind": "*"
        }
    }, 
    "permissions":["system.network" , "power"],

这是我的网络代码:

chrome.sockets.udp.create({}, function(socketInfo) {
    socketId = socketInfo.socketId;
    // Setup event handler and bind socket.
    chrome.sockets.udp.onReceive.addListener(onReceive);
    chrome.sockets.udp.bind(socketId, "0.0.0.0", 4213, function(result) {
        if (result < 0) {
            console.log("Error binding socket.");
            return;
        }
    //chrome.sockets.udp.send(socketId, arrayBuffer, '127.0.0.1', 1337, function(sendInfo) {
    //  console.log("sent " + sendInfo.bytesSent);
    //  })
    //chrome.sockets.udp.setBroadcast(socketId, true, function(){})
    });
});

这是我收到数据包的时间:

var onReceive = function(info) {
    if (info.socketId !== socketId)
        return;
    chrome.sockets.udp.setPaused(socketId, true, function(){}); // Set socket paused; Essentially blocking
    //console.log();

    ///processing of my packet

    chrome.sockets.udp.setPaused(socketId, false, function(){}); //unpause socket
};

编辑:我一直在尽力理解为什么我无法在 Android 上的 chrome 应用程序中获取任何广播数据包。不幸的是,我 运行 撞墙了。

您是否为 chrome-sockets-udp 安装了 cordova 插件?

在项目根目录的终端中,输入:

cordova plugin add cordova-plugin-chrome-apps-sockets-udp

chrome-apps-sockets-udp 的 cordova 插件默认不启用接收广播。但是,通过在本地对插件 src 进行一些修改(请参阅以下步骤),您可以启用接收广播消息。以下信息已在 Android 上成功测试,希望此信息对可能正在努力接收广播消息的其他人有所帮助。

1) 检查是否安装了 chrome-apps-sockets-udp

的 cordova 插件
cordova plugin list

如果您看到此信息,则说明插件已安装

cordova-plugin-chrome-apps-sockets-udp 1.2.2 "Chrome Apps Sockets UDP API"

2) 如果您没有看到列出的插件,请安装它:

cordova plugin add cordova-plugin-chrome-apps-sockets-udp

3) 接下来,确保你已经添加了你的平台:(下面的离子示例,phonegap 有类似的命令)

ionic platform android

4) 然后为您的应用构建:(下面的离子示例,phonegap 有类似的命令)

ionic build android

5) 现在让我们在Android平台编辑src文件。在文本编辑器中或从您的 IDE 浏览到 <appname>/platforms/android/src/org/chromium 目录并打开 ChromeSocketsUdp.java 文件。搜索此方法 void bind(String address, int port) 并在此行 channel.socket().setReuseAddress(true); 之后添加以下行 channel.socket().setBroadcast(true); 然后保存文件。

绑定方法现在应该如下所示:

  void bind(String address, int port) throws SocketException {
    channel.socket().setReuseAddress(true);
    channel.socket().setBroadcast(true);
    channel.socket().bind(new InetSocketAddress(port));

    if (multicastSocket != null) {
      bindMulticastSocket();
    }
  }

6) 运行 您的申请,例如ionic run android 和广播 udp 消息现在应该被您的 Android 应用程序接收。

注意:您在上面所做的这些本地更改将在下一次构建期间被覆盖。因此,如果您对测试结果满意,您可以修改位于 <appname>/plugins/cordova-plugin-chrome-apps-sockets-udp/src/android/ChromeSocketsUdp.java

的插件 src 文件

这是我编写的用于测试在 Android gist.github.com/bfalzarano/e530ca80767a0aea71a145be44943941

上接收 UDP 广播的离子应用程序相关代码部分的要点 link

setBroadcast 已添加到库中。您现在可以调用 setBroadcast() 来启用广播权限。

1.3.0 (Sep 27, 2016)

Adds chrome.udp.setBroadcast()

https://github.com/MobileChromeApps/cordova-plugin-chrome-apps-sockets-udp