android - 最新android不再发送UDP广播包

标签 android sockets udp cordova-plugins

所以我们一直在 android(三星 Note 4)和 iOS 上运行以下代码,直到最新的手机开始出现 android 7+(三星 S8,OnePlus3T)。我们将发送我们的广播来识别将响应此消息的其他系统。现在我们发现UDP在手机上被屏蔽了。

我们已经使用 Evothings 测试 UDP 是否被阻止。以编程方式,我认为我没有遗漏任何东西来完成这项工作。

我们注意到 Android 上 WiFi 的工作方式发生了变化。如果 WiFi 连接没有互联网,系统的行为似乎会有所不同。

    chrome.system.network.getNetworkInterfaces(function (networkIfaceArray) {
         for (var i = 0; i < networkIfaceArray.length; i++) {
                var iface = networkIfaceArray[i];
                if (iface.prefixLength < 32) {
                    addr_array = parseIP(iface.address);
                    mask = 32 - iface.prefixLength;
                    mask = Math.pow(2, mask) - 1;
                    pointer = 3;
                    while (mask > 255) {
                        addr_array[pointer++] = 255;
                        mask -= 255;
                    }
                    addr_array[pointer] = mask;
                    udp_sock.send(app.socketId, message,
                    addr_array.join("."), 5000, function (sendInfo) {
                        //check for response
                });
            }
        }
    });

我们试过了this answer他们建议不同的端口。这里的大多数帖子都早于版本 7,因此没有解决我们的问题。

同样,它仍然适用于旧版本的 android 和 iOS。如果您遇到此问题,请分享。

最佳答案

您应该尝试使用 setBroadcast() 函数。旧版本的 cordova 插件没有实现,请参阅 https://github.com/MobileChromeApps/cordova-plugin-chrome-apps-sockets-udp/issues/7 ,因此您可能必须在使用它之前检查它是否已定义。可能 Evothings 应用程序使用旧版本的 cordova 插件。也许较新的 Android 设备默认关闭广播选项,因此调用 setBroadcast() 应该允许它工作。

// Set Broadcast (if available)
if (chrome.sockets.udp.setBroadcast != undefined) {
   chrome.sockets.udp.setBroadcast(app.socketId, true, function (result) {
      if (result < 0) {
       console.log("setBroadcast failed");
      }
      else {
       console.log("setBroadcast worked");
      }
   });
}

关于android - 最新android不再发送UDP广播包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44509371/

相关文章:

android - Google Cloud Messaging 向所有设备发送通知

android - 启用 ACTIVE_TILE 时启动时处于 ACTIVE 状态的快速设置磁贴

delphi - 如何使用Indy10 TIdUDPClient接收广播包?

c - Linux C 编程 - FTP 服务器不会通过套接字响应

performance - 本地 IPC 的平均性能测量

linux - mplayer 无法读取 udp 视频流

C#包结构系统

java - 我如何控制android mediaplayer?

android - 看不懂 Android WebView 文档

sockets - 如何从套接字读取数据直到什么都没有?