【问题标题】:How to receive UDP broadcast packets in Chrome App running on Android如何在 Android 上运行的 Chrome 应用程序中接收 UDP 广播数据包
【发布时间】:2015-04-22 01:39:26
【问题描述】:

我可以在运行 chrome 应用程序的 Windows 中毫无问题地接收广播数据包。但是,当我使用该应用程序并使用cordova/crosswalk 工具进行编译时,我似乎收不到任何数据包。我在wireshark中看到了所有的数据包。我的数据包从: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 应用程序中获取任何广播数据包。不幸的是,我撞到了一堵墙。

【问题讨论】:

    标签: javascript cordova udp google-chrome-app cordova-chrome-app


    【解决方案1】:

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

    1.3.0(2016 年 9 月 27 日)

    添加 chrome.udp.setBroadcast()

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

    【讨论】:

    • 发行说明和/或文档的链接会有所帮助。
    【解决方案2】:

    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 浏览到 &lt;appname&gt;/platforms/android/src/org/chromium 目录并打开 ChromeSocketsUdp.java 文件。搜索此方法 void bind(String address, int port) 并在此行 channel.socket().setReuseAddress(true); 之后添加以下行 channel.socket().setBroadcast(true); 然后保存文件。

    bind 方法现在应该如下所示:

      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 应用程序接收。

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

    这是我为测试 Android 上的 UDP 广播接收而编写的 ionic 应用程序的相关代码部分的要点链接 gist.github.com/bfalzarano/e530ca80767a0aea71a145be44943941

    【讨论】:

    • 您好,感谢您的全面回答。我在平台和插件目录中的 ChromeSocketsUdp.java 中添加了 channel.socket().setBroadcast(true); 行。但是我仍然只能接收非广播的 UDP 数据包。你能分享你的代码吗?
    • @stepan 你用什么让你的 udp 客户端发送广播数据包?我写了一个node js udp客户端来发送广播包,方便我排错。还请务必广播到您的本地子网,因为 JParrish88 在上面为 Android 指示,例如如果您的本地子网是 192.168.0.x/24,那么广播地址应该是 192.168.0.255。如果该信息有帮助,您可以投票给我的答案吗?包含完整 udp 服务器代码和一些屏幕截图的教程会有帮助吗?如果是这样,让我把它放在一起,我可以在我的答案中发布上面的链接。
    • 我正在使用packetsender.com,效果非常好。为了确保我的 udp 数据包被正确广播,我还编写了一个简单的 python 脚本:gist.github.com/stepanmracek/c66c7d794cc856f1f1a1c88cb74100d6
    • @stepan 这是我为测试在 Android 上接收 UDP 广播而编写的 ionic 应用程序的相关代码部分的要点链接 gist.github.com/bfalzarano/e530ca80767a0aea71a145be44943941
    • 非常感谢。我下载了您的代码并从中创建了 Ionic 应用程序。但是它仍然不起作用。经过一番调查,我发现它不适用于我的新 Android 6.0.1 手机。但是,当我在旧的 Android 4.4 手机上尝试相同的 APK 时,它可以完美运行。应用程序配置中可能缺少一些与 Android 6.0 相关的应用程序权限。我会尽力了解更多细节并随时通知您。
    【解决方案3】:

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

    从项目根目录的终端输入:

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

    【讨论】:

      猜你喜欢
      • 2017-01-06
      • 2023-03-23
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多