2014-09-13 5 views
19

Sto sviluppando un'applicazione mobile (iOS e Android) per controllare un dispositivo tramite Wi-Fi. Il dispositivo crea una rete wireless (SoftAP) ma non fornisce l'accesso a Internet.Android: Come utilizzare una rete Wi-Fi per host specifici ma utilizzare il telefono Rete mobile per tutto il resto

Su iOS, posso connettermi al dispositivo ed effettuare richieste al suo indirizzo IP (192.168.70.1) ma tutte le altre richieste ricadono sulla rete mobile. Ciò consente al telefono di mantenere la connettività Internet mentre è connesso al dispositivo tramite Wi-Fi.

Su Android, se mi collego alla rete wireless del dispositivo, le richieste Internet non ricadono sulla connessione mobile, ma falliscono.

Nella mia app per Android, posso utilizzare ConnectivityManager.requestRouteToHost per forzare le richieste dalla mia app a utilizzare la rete mobile. Tuttavia, le richieste fatte da altre app utilizzano ancora la rete wifi del dispositivo e falliscono.

ho anche cercato di usare il ConnectivityManager per modificare le preferenze di rete con:

ConnectivityManager.setNetworkPreference (ConnectivityManager.TYPE_MOBILE)

Questo fa sì che il telefono per utilizzare la rete cellulare per tutti richieste da tutte le applicazioni. Il Wi-Fi è disabilitato. Sembra che nelle versioni precedenti di Android Wi-Fi potrebbe ancora essere utilizzato anche se non è la rete "preferita", ma questo non sembra funzionare in KitKat. È probabilmente correlato a un cambiamento in Android 4.2: https://code.google.com/p/android/issues/detail?id=73509 "ConnectivityManager dal 4,2 strappa reti che non sono NetworkPreference"

Esiste una soluzione che consente a un'app Android di utilizzare il Wi-Fi per uno specifico indirizzo IP e il rete mobile per tutto il resto? Forse questo può essere fatto tramite l'NDK?

+0

Hai trovato una soluzione per specificare la rete di streghe che desideri utilizzare su tutte le versioni di Android? – DjimOnDev

+0

No. Potrebbe esserci una soluzione per Lollipop ma non ho ancora avuto il tempo di studiarlo. –

+0

@PaulGreyson, come hai fatto questo per iOS? Sto cercando una soluzione simile per fare richieste http sulla rete mobile mentre il dispositivo è su wifi. – keno

risposta

2

Android normalmente elimina le reti che non sono preferenze di rete. Una soluzione alternativa che è possibile utilizzare è creare un AP tramite l'app mobile e consentire al dispositivo di connettersi ad esso. In questo modo il cellulare può mantenere la connettività Internet e comunicare con il dispositivo.

consultare i seguenti link per i dettagli di implementazione:

https://github.com/opengarden/android-tether

https://code.google.com/p/android-wifi-tether/

+0

Grazie per il suggerimento, ma ho bisogno di una soluzione che permetta al dispositivo di agire come AP. –

1

Simile chiesto prima come Enable simultaneouly wifi and 3G interface on Android e risposta rapida era no.

ma in realtà è possibile ed è attuato in alcuni software come SuperDownload (vedi stackexchange)

Che il software necessita di root.

http://geeknizer.com/wp-content/uploads/2012/08/super-download-3g-wifi.jpg

due canali download è anche pubblicizzati in qualche nuovo telefono Android.(Non riesco a trovare il link, hanno usato nuovi termini di marketing per WiFi + 3G usati insieme)

Esiste una soluzione che consente a un'app Android di utilizzare il Wi-Fi per uno specifico indirizzo IP e la rete mobile per tutto il resto ? Forse questo può essere fatto tramite l'NDK?

Forse perché il Wi-Fi è necessario solo per l'indirizzo locale, si potrebbe passare a creare un driver WiFi speciale, ma anche in questo caso non sarebbe semplice.

e andando più in basso nel software:

questa funzione è TCP/pacchetti IP routing. Se sai come implementarlo su Linux, sei a metà. Il prossimo lo farebbe funzionare su Android. Ma suppongo che non sarebbe abilitato per l'app non di sistema, poiché sarebbe semplice sicurezza sfruttabile (ad esempio IP sostitutivo del server di banca)

+0

Richiedere root non è un'opzione per me né creare un driver WiFi speciale. Wrt lavorando direttamente con il routing TCP/IP, la domanda è davvero se riesco a far funzionare il sistema WiFi dopo aver usato ConnectivityManager.setNetworkPreference per forzare il resto del dispositivo sulla rete mobile. –

9

In realtà è possibile, ma solo da Lollipop (API 21).

Dal Android API 21 Documentazione:

Android 5.0 provides new multi-networking APIs that let your app dynamically scan for available 
networks with specific capabilities, and establish a connection to them. This functionality is useful 
when your app requires a specialized network, such as an SUPL, MMS, or carrier-billing network, or if 
you want to send data using a particular type of transport protocol. 

in modo da poter utilizzare la classe NetworkRequest.Builder per creare un NetworkRequest che invia la richiesta per un certo Transport Type.

utilizzare la seguente funzione:

NetworkRequest.Builder addTransportType(int transportType) 

Per impostare tipi di trasporto (WIFI, ETHERNET o CELLULAR per esempio) per le vostre richieste.

+0

Sembra la soluzione giusta. Grazie! –

+0

A pensarci bene, avrò bisogno di testare questo per verificare.La domanda è se questa nuova API può essere utilizzata correttamente in combinazione con ConnectivityManager.setNetworkPreference (ConnectivityManager.TYPE_MOBILE) –

+1

La speranza è che dopo aver richiesto la rete wifi, setNetworkPreference() cambierà il resto del dispositivo nella rete mobile e lascerà il rete wifi in atto. –

0

Questa potrebbe essere una soluzione semplice: imposta il WiFi come interfaccia preferita ogni volta che è necessario controllare il dispositivo e imposta la rete mobile preferita dopo aver terminato il lavoro. Ciò potrebbe interrompere attività Internet simultanee, ma ricorda che TCP e la maggior parte delle app consentono di ritardare fino a pochi secondi (o anche più). L'interruzione è trascurabile se il lavoro di controllo per il dispositivo è sporadico e non richiede mai un'attesa di lunga durata.

Se la situazione di cui sopra non è il caso, fare il contrario: impostare WiFi come interfaccia preferita come predefinita e impostare la rete mobile preferita ogni volta che non è necessario controllare il dispositivo. Ma assicurati di tornare frequentemente alla rete mobile, ad esempio ogni 3 secondi, per evitare il timeout delle attività su Internet.

+0

Sfortunatamente questo non funzionerebbe nel mio scenario perché ho bisogno di mantenere una connessione TCP persistente al dispositivo. –