2015-04-22 101 views
7

我可以在運行Chrome應用程序的Windows內沒有任何問題地接收廣播數據包。但是,當我使用該應用程序並使用cordova/crosswalk工具進行編譯時,我似乎無法收到任何數據包。我看到wireshark中的所有數據包。我的數據包從172.24.0.42發送,並在172.24.255.255上廣播(255.255.255.255上的廣播在Android上不起作用,但它在Windows chrome應用上工作)。如何在Android上運行的Chrome應用程序中接收UDP廣播數據包

這是我(的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應用程序中獲取任何廣播數據包。不幸的是,我碰到了一堵牆。

回答

0

您是否已經爲chrome-sockets-udp安裝了cordova插件?

從項目的根目錄下的終端,輸入:

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

爲鍍鉻的應用程序的套接字-UDP科爾多瓦插件不支持在默認情況下接收廣播。但是,通過對插件src進行一些本地修改(請參閱下面的步驟),您可以啓用接收廣播消息。以下信息已在Android上成功通過測試,並希望此信息對其他可能難以收到廣播消息的人有所幫助。

1)檢查您是否已經安裝了科爾多瓦插件鉻的應用程序的套接字-UDP

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廣播的相關代碼段

+0

您好,感謝的全面的答案。我在平臺以及插件目錄中添加了'channel.socket()。setBroadcast(true);'這行到ChromeSocketsUdp.java。不過,我仍然只能接收非廣播的UDP數據包。你能分享你的代碼嗎? – stepan

+0

@stepan你用什麼爲你的udp客戶端發送廣播數據包?我寫了一個節點js udp客戶端來發送廣播數據包,以便我排除故障。如JParrish88針對Android所指示的那樣,還要確保廣播到您的本地子網。如果你的本地子網是192.168.0.x/24那麼廣播地址應該是192.168.0.255。你可以投票我的答案,如果該信息是有幫助的?具有完整的udp服務器代碼和一些截圖的教程會有幫助嗎?如果是這樣,讓我把它放在一起,我可以在我的回答中發佈上面的鏈接。 – bfalz

+0

我使用的是https://packetsender.com/,它的效果非常好。爲了確保我的udp數據包能夠正確播出,我還寫了一個簡單的python腳本:https://gist.github.com/stepanmracek/c66c7d794cc856f1f1a1c88cb74100d6 – stepan