Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最新的android不再发送UDP广播数据包_Android_Sockets_Udp_Cordova Plugins - Fatal编程技术网

最新的android不再发送UDP广播数据包

最新的android不再发送UDP广播数据包,android,sockets,udp,cordova-plugins,Android,Sockets,Udp,Cordova Plugins,因此,我们一直在安卓系统(三星Note 4)和iOS上运行以下代码,直到最新的手机开始推出安卓7+(三星S8,OnePlus3T)。我们将发送广播,以确定将响应此消息的其他系统。现在我们发现UDP在手机上被阻止了 我们使用Evothings来测试UDP是否被阻止。从编程角度来说,我不认为我缺少任何东西来实现这一点 我们注意到WiFi在android上的工作方式发生了变化。如果WiFi连接没有互联网,则系统的行为似乎有所不同 chrome.system.network.getNetwork

因此,我们一直在安卓系统(三星Note 4)和iOS上运行以下代码,直到最新的手机开始推出安卓7+(三星S8,OnePlus3T)。我们将发送广播,以确定将响应此消息的其他系统。现在我们发现UDP在手机上被阻止了

我们使用Evothings来测试UDP是否被阻止。从编程角度来说,我不认为我缺少任何东西来实现这一点

我们注意到WiFi在android上的工作方式发生了变化。如果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
                });
            }
        }
    });
chrome.system.network.getNetworkInterfaces(函数(networkIfaceArray){
对于(变量i=0;i255){
addr_数组[指针++]=255;
掩码-=255;
}
addr_数组[指针]=掩码;
udp_sock.send(app.socketId,message,
addr_数组.join(“.”),5000,函数(sendInfo){
//检查是否有响应
});
}
}
});
我们尝试了他们建议的不同港口。这里的大多数帖子都比版本7旧,因此没有解决我们的问题


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

您应该尝试使用setBroadcast()函数。旧版本的cordova插件没有实现它,请参阅,因此您可能需要在使用它之前检查它是否已定义。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");
      }
   });
}
//设置广播(如果可用)
if(chrome.sockets.udp.setBroadcast!=未定义){
chrome.sockets.udp.setBroadcast(app.socketId,true,function(result){
如果(结果<0){
console.log(“路演失败”);
}
否则{
控制台日志(“路演工作”);
}
});
}