2016-06-09 8 views
10

Ich schrieb eine App, die eine Sony qx Smartphone ansteckbare Kamera über WLAN auslöst. Allerdings muss ich die Bilder in Echtzeit über ein anderes lokales Netzwerk übertragen. Da die WiFi-Karte für qx-Verbindung verwendet wird, muss ich in der Lage sein, Ethernet über USB zu verwenden, um Bilder vom Telefon zu übertragen. HTTP-Anfragen werden verwendet, um die Kamera auszulösen und die Bilder vom Telefon zu senden.Verwenden Sie mehrere Netzwerkschnittstellen in einer App

Ist es möglich, in einer Android-App auf einem Telefon mit zwei Netzwerkschnittstellen Setup für bestimmte HTTP-Anfragen für die Verwendung einer Netzwerkschnittstelle und für andere eine andere Netzwerkschnittstelle verwenden angeben? Muss dies durch Routing-Tabellen geschehen, nicht durch Java?

Das Telefon, das ich benutze, ist eine verwurzelte Nexus 6p.

Update:

Zeit konnte ich einen Ethernet-Adapter mit dem Gerät (Nexus 6P) zum Laufen bringen. Das Gerät ist über Ethernet mit einem lokalen Netzwerk verbunden. Wenn die Wi-Fi-Schnittstelle ausgeschaltet ist, kann ich alle Geräte im lokalen Netzwerk anpingen, mit denen das Gerät über Ethernet verbunden ist. Ich bin jedoch nicht in der Lage, auf die Webserver (ohne DNS) eines der Geräte in diesem Netzwerk zuzugreifen (von denen ich weiß, dass sie laufen), also HTTP über eine Browser-App. Der Nexus 6p ist über eine Ubiquiti Station über Ethernet mit dem Netzwerk verbunden. Dies scheint ein Routing-Problem zu sein.

Ich kann tether (USB-Schnittstelle) und Wi-Fi in einer App verwenden, so dass mich zu glauben, dass es möglich ist, Ethernet und WLAN zu verwenden.

Update2:

Nach mehr Tests scheint es zu sein, dass es ein Problem mit den Berechtigungen ist. Da beim Ping des Netzwerks das Gerät über Ethernet verbunden ist, ohne zuvor su im Terminal ausgeführt zu haben, existiert das Netzwerk nicht. Wenn ich jedoch su dann ping, kann ich das Netzwerk pingen. Daher scheint es, dass meine App vor dem Zugriff auf Ethernet eine Superuser-Berechtigung erhalten muss. Ich habe es Superuser-Zugriff gewährt, aber nichts hat sich geändert. Ich lese, dass einfach su nicht aus einem der Kommentare in dieser post läuft. Das liegt daran, dass su nur eine root-Shell hervorbringt, die stirbt. Dies erklärt auch, warum ich nicht über eine Browser-App auf einen der Webserver in diesem Netzwerk zugreifen konnte. Ist es möglich, meiner App Zugriff auf die Ethernet-Schnittstelle zu gewähren, wenn sie HTTP-Aufrufe wie HttpURLConnection Root-Zugriff geben, wenn das Sinn macht (läuft su nicht funktioniert)? Es scheint definitiv eine Lösung zu geben, da HttpURLConnection Anrufe über die USB-Tethering-Schnittstelle tätigen kann (Nexus 6P nennt es rndis0).

Update 3:

ich online here gefunden, dass ich meine app eines System-App machen kann (dachte, das das App eth0 Zugang gewähren könnte). Ich habe gerade meine App auf /system/app verschoben und dann neu gestartet. Dies scheint der App jedoch keine Privilegien mehr zu geben (wodurch das Problem nicht gelöst wird), oder es ist etwas anderes erforderlich, um das App-System zu erstellen, als es nur nach /system/app zu kopieren.

Update 4:

So konnte ich Ethernet arbeitet an jeder App, ohne Root-Rechte bekommen! Es scheint, dass es nur über DHCP funktioniert und statische Verbindungen, die ich benutzte, nicht mag. Es funktioniert mit aktiviertem Wi-Fi. Ich kann jedoch keine der Geräte im Wi-Fi-Netzwerk kontaktieren, wenn Ethernet aktiviert ist. Gibt es einen Weg dahin?Hat das mit dem Setzen von zwei Standard-Gateways zu tun?

Antwort

2

Da Sie in Nexus 6P Programmierung wurden, können Sie versuchen, die neue API in ConnectivityManager hinzugefügt zu verwenden, um das Ethernet als bevorzugte Netzwerkverbindung für Ihren Prozess auszuwählen.

Da ich die ähnliche Umgebung wie Ihre nicht erstellen kann, bin ich mir nicht sicher, ob es funktioniert. Es ist nur eine vorgeschlagene Lösung, absolut nicht getestet und verifiziert.

+0

Also habe ich gerade diese Methode ausprobiert. 'connectivityManager.getAllNetworks()' scheint nur die Wi-Fi-Schnittstelle (Länge = 1) zurückzugeben, wenn ich Ethernet und Wi-Fi eingeschaltet habe, und es gibt nichts zurück, wenn nur Ethernet eingeschaltet ist (Länge = 0). Das Gerät hat eindeutig die Schnittstelle auf, da das Ausführen von 'ifconfig'' eth0' als Schnittstelle zurückgibt, und ich kann Geräte pingen, wie ich oben erwähnt habe. Ich habe sogar versucht, meine App auf eine System-App zu verschieben. Allerdings habe ich das Gefühl, dass ich einen Schritt verpasst habe, als ich das App-System gemacht habe, seitdem ich es auf "/ system/app" verschoben habe, schien es absolut nichts zu tun. – dylan7

+0

Wechseln Sie zu root, ändern Sie den Benutzer und den Gruppenbesitzer des APK in root. Ändern Sie dann die Berechtigung von APK in 644. 'su',' chown root.root/system/app/Ihre.apk', 'chmod 644/system/app/your.apk'. Dann könnte die Berechtigung zum Zugriff auf das eth0-Gerät in Ihrem Code vorhanden sein. – alijandro

+0

Wenn Sie der Meinung sind, dass bei der Erstellung der System-App ein Problem auftritt, überprüfen Sie logcat. Sie erhalten einen Berechtigungsfehler, wenn die App versucht, Shell-Befehle auszuführen. – ekilic

0

Die meisten Android-TV-Boxen können WiFi und Ethernet zusammen verwenden. In meinem Gerät kann ich Ethernet von diesem Pfad aktivieren --- Einstellungen -> Mehr ...> Ethernet --- Aber Ihr Gerät wird nicht ein Menü so, wie ich es verstehe. Also solltest du eine App machen, um das zu tun. Diese Anwendung muss auf einige systemspezifische Ressourcen zugreifen, damit das Gerät gerootet werden muss oder die Anwendung mit der Systemsignatur signiert werden muss. Auch dieses Thema helfen Sie link

+0

Es scheint, dass das Nexus 6P keinen Zugriff auf 'getSystemService (" ethernet ") hat, wie es in dem Beitrag, den Sie verlinkt haben, zu verwenden ist. – dylan7

0

Nur um ein wenig mehr zu erklären, wie dies schließlich gelöst wurde.

Mit @ alijandros Antwort konnte ich in einer App zwischen Ethernet und WLAN hin- und herschalten. Aus irgendeinem Grund, damit das Ethernet funktioniert, musste das Netzwerk-Gateway eine DHCP-Adresse bereitstellen, nicht statisch. Da die bindProcessToNetwork, die in @ alijandros Antwort verwendet wird, pro Prozess ist, entschied ich mich, die Kommunikation mit der QX-Kamera in eine Service zu teilen, die in einem separaten Prozess läuft. Die Hauptanwendung (ein anderer Prozess) würde Bilder über Ethernet an ein lokales Netzwerk senden. Ich war erfolgreich in der Lage, die Geräte im lokalen Netzwerk über HTTP über Ethernet zu kontaktieren und gleichzeitig QX über WLAN auszulösen. Zur Zeit habe ich Messenger verwendet, um über IPC zu kommunizieren, um dem QX zu signalisieren, Service welche Methoden aufzurufen.