Wi-Fi Direct/P2P può essere considerato normale Wi-Fi ma il proprietario del gruppo (GO) funge da punto di accesso software (server DHCP, provisioning, ecc.). Quindi per rispondere alla tua ultima domanda, sì, Wi-Fi Direct usa anche l'IP per inviare e ricevere dati.
Si desidera inviare dati a tutti i membri del gruppo? Esistono due soluzioni:
- Trasmettere il messaggio una volta tramite multicast.
- Inviare il messaggio a ciascun singolo cliente del gruppo.
Il metodo più efficiente sarebbe la soluzione 1, per trasmettere i dati tramite multicast, in quanto sarebbe necessario inviare i dati solo una volta. Sfortunatamente il supporto multicast Wi-Fi è molto frammentato in Android, in quanto molti dispositivi sembrano bloccare il traffico non unicast. Vedere this article per ulteriori informazioni approfondite se si desidera percorrere questa rotta.
Soluzione 2 è il metodo migliore se si desidera garantire il supporto su tutti i dispositivi e trasmettere solo una piccola quantità di dati. GO richiede gli indirizzi IP dei client nel gruppo, ma a causa del modo in cui Wi-Fi Direct è implementato in Android, solo l'IP GO è noto a tutti i dispositivi. Una soluzione è quella di lasciare che i client si connettono ad una presa in movimento, per ottenere il loro indirizzo IP:
Codice cliente
private static final int SERVER_PORT = 1030;
... // on group join:
wifiP2pManager.requestConnectionInfo(channel, new ConnectionInfoListener() {
@Override
public void onConnectionInfoAvailable(WifiP2pInfo p2pInfo) {
if (!p2pInfo.isGroupOwner) {
// Joined group as client - connect to GO
Socket socket = new Socket();
socket.connect(new InetSocketAddress(p2pInfo.groupOwnerAddress, SERVER_PORT));
}
}
});
Gruppo code Proprietario:
private static final int SERVER_PORT = 1030;
private ArrayList<InetAddress> clients = new ArrayList<InetAddress>();
public void startServer() {
clients.clear();
ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
// Collect client ip's
while(true) {
Socket clientSocket = serverSocket.accept();
clients.add(clientSocket.getInetAddress());
clientSocket.close();
}
}
Ora tutto è necessario do è avviare un serverocket su ciascun client e fare su GO iterate attraverso l'elenco dei client creando una connessione socket a ciascuno e inviando il messaggio che si desidera trasmettere.
fonte
2013-10-09 20:36:48
hai avuto successo nei tuoi sforzi? Se sì, per favore fatemelo sapere, sto affrontando lo stesso problema e non riesco a ottenere una soluzione. Ho analizzato tutte le possibili documentazioni ma non ha avuto successo :(:( –