如何在 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
我可以在 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
这是我编写的用于测试在 Android gist.github.com/bfalzarano/e530ca80767a0aea71a145be44943941
上接收 UDP 广播的离子应用程序相关代码部分的要点 linksetBroadcast
已添加到库中。您现在可以调用 setBroadcast()
来启用广播权限。
1.3.0 (Sep 27, 2016)
Adds chrome.udp.setBroadcast()
https://github.com/MobileChromeApps/cordova-plugin-chrome-apps-sockets-udp