2016-06-09 11 views
10

Ho scritto un'app che attiva una fotocamera Sony qx per smartphone collegabile tramite Wi-Fi. Tuttavia ho bisogno di trasferire le immagini dal telefono su un'altra rete locale in tempo reale. Poiché la scheda wifi viene utilizzata per la connessione qx, devo poter utilizzare Ethernet su USB per trasferire le immagini dal telefono. Le richieste Http verranno utilizzate per attivare la fotocamera e inviare le immagini dal telefono.Utilizzare più interfacce di rete in un'app

E 'possibile in una app Android su un telefono con due impostazioni di interfaccia di rete specificare per alcune richieste http di utilizzare un'interfaccia di rete e per gli altri utilizzare un'altra interfaccia di rete? Questo deve essere fatto attraverso le tabelle di routing, non java?

Il telefono che sto utilizzando è un nexus 6p radicato.

Aggiornamento:

Attualmente, sono stato in grado di ottenere un adattatore Ethernet a lavorare con il dispositivo (Nexus 6P). Il dispositivo è connesso a una rete locale tramite Ethernet. Quando l'interfaccia Wi-Fi è spenta, posso eseguire il ping di tutti i dispositivi sulla rete locale su cui il dispositivo è connesso via Ethernet. Tuttavia, non sono in grado di accedere ai server Web (non utilizzando DNS) di nessuno dei dispositivi su tale rete (che so che sono in esecuzione), ad esempio Http tramite un'app browser. Il nexus 6p è connesso alla rete tramite Ethernet tramite una stazione Ubiquiti. Questo sembra essere un problema di routing.

Posso legare (interfaccia usb) e utilizzare il Wi-Fi in un'unica app, quindi mi viene da pensare che sia possibile utilizzare Ethernet e Wi-Fi.

Update2:

Dopo ulteriori test, sembra essere che si tratta di un problema di autorizzazioni. Da quando eseguo il ping della rete, il dispositivo è connesso a Ethernet senza aver prima eseguito su nel terminale, la rete non esiste. Tuttavia, quando corro su quindi ping, posso eseguire il ping della rete. Quindi sembra che la mia app abbia bisogno dell'autorizzazione di superutente prima di accedere a Ethernet. Gli ho concesso l'accesso superutente, ma non è cambiato nulla. Ho letto che semplicemente eseguire su non è sufficiente da uno dei commenti in questo post. Questo perché su genera appena una shell di root che muore. Questo spiega anche perché non ho potuto accedere a nessuno dei server web su questa rete tramite un'app browser. È possibile concedere alla mia app l'accesso all'interfaccia Ethernet quando si effettuano chiamate HTTP come l'accesso root HttpURLConnection, se questo ha senso (l'esecuzione di su non funziona)? Sembra esserci una soluzione definitiva poiché HttpURLConnection può effettuare chiamate tramite l'interfaccia di tethering USB (Nexus 6P la chiama rndis0).

Update 3:

ho trovato online here, che posso fare la mia app un'applicazione di sistema (pensato che questo potrebbe concedere l'applicazione di accesso eth0). Ho appena spostato la mia app su /system/app e quindi riavviato. Tuttavia, questo non sembra dare più privilegi all'app (quindi non risolvere il problema), o c'è qualcos'altro richiesto per rendere il sistema di app appena copiato su /system/app.

Update 4:

così mi è stato in grado di ottenere Ethernet a lavorare su ogni app senza i permessi di root! Sembrava che funzionasse solo su DHCP e non amasse le connessioni statiche, che stavo usando. Funziona con Wi-Fi abilitato, tuttavia, non posso contattare nessuno dei dispositivi sulla rete Wi-Fi quando Ethernet è abilitato. C'è un modo per aggirare questo?Ha a che fare con l'impostazione di due gateway predefiniti?

risposta

2

Dal momento che si stava programmando in Nexus 6P, si può provare a utilizzare la nuova API aggiunto ConnectivityManager per selezionare l'Ethernet come connessione di rete preferita per il vostro processo.

Poiché non riesco a creare l'ambiente simile al tuo, non sono sicuro che funzioni. È solo una soluzione suggerita, totalmente non testata e verificata.

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
Network etherNetwork = null; 
for (Network network : connectivityManager.getAllNetworks()) { 
    NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network); 
    if (networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) { 
     etherNetwork = network; 
    } 
} 
Network boundNetwork = connectivityManager.getBoundNetworkForProcess(); 
if (boundNetwork != null) { 
    NetworkInfo boundNetworkInfo = connectivityManager.getNetworkInfo(boundNetwork); 
    if (boundNetworkInfo.getType() != ConnectivityManager.TYPE_ETHERNET) { 
     if (etherNetwork != null) { 
      connectivityManager.bindProcessToNetwork(etherNetwork); 
     } 
    } 
} 
+0

Quindi ho appena provato questo metodo. 'connectivityManager.getAllNetworks()' sembra restituire solo l'interfaccia Wi-Fi (lunghezza = 1), quando ho Ethernet e Wi-Fi attivo, e non restituisce nulla quando è attiva solo Ethernet (lunghezza = 0). Il dispositivo ha chiaramente l'interfaccia in quanto l'esecuzione di 'ifconfig' restituisce' eth0' come interfaccia, e posso eseguire il ping dei dispositivi come ho detto sopra. Ho persino provato a spostare la mia app su un'app di sistema. Tuttavia, mi sembra di aver perso un passaggio durante la creazione del sistema di app dal momento che spostarlo in '/ system/app' sembrava non fare assolutamente nulla. – dylan7

+0

Passare a root, modificare l'utente dell'APK e il proprietario del gruppo su root. quindi cambia il permesso di APK a 644. 'su',' chown root.root/system/app/your.apk', 'chmod 644/system/app/your.apk'. Quindi potrebbe avere il permesso di accedere al dispositivo eth0 nel tuo codice. – alijandro

+0

Se pensi che ci sia un problema nel fare app di sistema, controlla logcat. Otterrai un errore di autorizzazione quando l'app tenta di eseguire comandi di shell. – ekilic

0

La maggior parte delle scatole di tv Android può utilizzare wifi ed ethernet insieme. Nel mio dispositivo, posso abilitare ethernet da questo percorso --- Impostazioni -> Altro ...> Ethernet --- Ma il tuo dispositivo non avrà un menu come quello che ho capito. Quindi dovresti creare un'app per farlo. Questa applicazione deve accedere ad alcune risorse specifiche del sistema in modo che il dispositivo debba essere rootato o l'applicazione deve essere firmata con la firma del sistema. Anche questo argomento può aiutare a link

+0

Sembra che il Nexus 6P non abbia accesso a 'getSystemService (" ethernet ")' come dice di usare nel post che hai collegato. – dylan7

0

Solo per dare qualche spiegazione in più su come questo finalmente è stato risolto.

Utilizzando la risposta di @ alijandro, sono riuscito a passare avanti e indietro tra Ethernet e Wi-Fi in un'unica app. Per qualche motivo per il funzionamento di Ethernet, era necessario che il gateway di rete fornisse l'indirizzo DHCP, non statico. Quindi, dal momento che il bindProcessToNetwork, utilizzato nella risposta di @ alijandro è per processo, ho deciso di dividere le comunicazioni con la fotocamera QX in un Service che viene eseguito in un processo separato. L'applicazione principale (un altro processo) posterebbe immagini su Ethernet a una rete locale. Sono riuscito a contattare i dispositivi sulla rete locale tramite HTTP su Ethernet, attivando contemporaneamente il QX tramite Wi-Fi. Attualmente, ho usato Messenger per comunicare usando IPC per dire al trigger QX Service quali metodi chiamare.

Problemi correlati