7

Mogę odbierać pakiety emisji bez żadnych problemów w aplikacji Chrome z uruchomionym systemem Windows. Jednakże, kiedy biorę tę aplikację i kompiluję za pomocą narzędzi cordova/crosswalk, nie mogę otrzymywać żadnych pakietów. Widzę wszystkie pakiety w wireshark. Mój pakiet jest przesyłany z: 172.24.0.42 i nadawany na 172.24.255.255 (transmisja na 255.255.255.255 nie działa na Androidzie, ale działa w aplikacji Windows chrome).Jak odbierać pakiety emisji UDP w aplikacji Chrome działającej pod kontrolą systemu Android

To jest mój (manifest.json):

"sockets":{ 
     "udp": { 
      "bind": "*" 
     } 
    }, 
    "permissions":["system.network" , "power"], 

To jest mój kod do mojej sieci:

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(){}) 
    }); 
}); 

To kiedy odbierać pakiety:

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 
}; 

Edycja: starałem się jak najlepiej zrozumieć, dlaczego nie mogę uzyskać żadnych pakietów emisji w aplikacji Chrome na Androida. Niestety, wpadłem na ścianę.

Odpowiedz

0

Czy zainstalowałeś wtyczkę cordova dla chrome-sockets-udp?

Z terminalu w katalogu głównym projektu wpisać:

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

Wtyczka Cordova dla chromowo-apps-gniazd UDP-nie umożliwiać transmitowanie być odbierane domyślnie. Jednak przy pewnych modyfikacjach lokalnego src plug-in (patrz poniżej kroki) można włączyć komunikaty rozgłoszeniowe. Poniższe informacje zostały pomyślnie przetestowane na Androidzie i mam nadzieję, że te informacje są przydatne dla osób, które mogą mieć problemy z otrzymaniem otrzymanych wiadomości.

1) Sprawdź, czy masz zainstalowane wtyczki Cordova dla Chrome-apps-gniazd-udp

cordova plugin list 

jeśli widzisz ta informacja to wtyczka jest już zainstalowana

cordova-plugin-chrome-apps-sockets-udp 1.2.2 "Chrome Apps Sockets UDP API" 

2) Jeśli nie widzisz wtyczki wymienione następnie zainstalować go:

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

3) następnie, upewnij się, że dodany plat forma: (przykład jonowe poniżej PhoneGap ma podobną komendę)

ionic platform android 

4) następnie zbudować dla swojej aplikacji: (przykład jonowe poniżej PhoneGap ma podobną komendę)

ionic build android 

5) Teraz edytować plik src na platformie Android. W edytorze tekstu lub w IDE przejdź do katalogu <appname>/platforms/android/src/org/chromium i otwórz plik ChromeSocketsUdp.java. Wyszukaj tę metodę void bind(String address, int port) i po tej linii channel.socket().setReuseAddress(true); dodaj następującą linię channel.socket().setBroadcast(true);, a następnie zapisz plik.

sposób wiążą powinien wyglądać jak poniżej:

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) Uruchom aplikację np ionic run android i wiadomości rozgłaszania udp powinny być teraz odbierane przez aplikację Android.

UWAGA: te lokalne zmiany wprowadzone powyżej zostaną nadpisane podczas następnego kompilacji. więc jeśli jesteś zadowolony z wyników Twojego testu można następnie zmodyfikować plik plugin src znajdujący się <appname>/plugins/cordova-plugin-chrome-apps-sockets-udp/src/android/ChromeSocketsUdp.java

Oto link GIST do odpowiednich sekcjach kodu jonowego aplikacji pisałem do testowania odbioru audycji UDP na Androida gist.github.com/bfalzarano/e530ca80767a0aea71a145be44943941

+0

Cześć, dzięki za wyczerpującą odpowiedź. Dodałem wiersz 'channel.socket(). SetBroadcast (true);' do ChromeSocketsUdp.java na platformach oraz do katalogów wtyczek. Jednak nadal mogę odbierać tylko nierozgłoszone pakiety UDP. Czy mógłbyś udostępnić swój kod? – stepan

+0

@stepan, czego używasz dla swojego klienta udp do wysyłania pakietów emisji? Napisałem klienta węzła js udp do wysyłania pakietów emisji, aby ułatwić mi rozwiązywanie problemów. należy również nadawać do lokalnej podsieci, ponieważ JParrish88 wskazuje wyżej dla systemu Android, np. jeśli lokalna podsieć to 192.168.0.x/24, wówczas adres rozgłoszeniowy powinien wynosić 192.168.0.255. Czy możesz głosować na moją odpowiedź, jeśli ta informacja była pomocna? czy pomocny byłby samouczek z pełnym kodem serwera udp i niektórymi zrzutami ekranu? jeśli tak, pozwól mi to połączyć i mogę umieścić link powyżej w mojej odpowiedzi. – bfalz

+0

Używam https://packetsender.com/ i działa naprawdę dobrze. Aby mieć pewność, że moje pakiety pakietu udp są poprawnie nadawane, napisałem również prosty skrypt python: https://gist.github.com/stepanmracek/c66c7d794cc856f1f1a1c88cb74100d6 – stepan