Wi-Fi Direct/P2P można uznać za zwykły Wi-Fi, ale tam, gdzie właściciel grupy (GO) działa jako punkt dostępu do oprogramowania (serwer dhcp, zasilanie itp.). Aby odpowiedzieć na ostatnie pytanie, tak Wi-Fi Direct używa również adresu IP do wysyłania i odbierania danych.
Chcesz wysłać dane do wszystkich członków grupy? Istnieją dwa rozwiązania tego problemu:
- Prześlij wiadomość raz za pomocą multiemisji.
- Wyślij wiadomość do każdego klienta indywidualnego w grupie.
Najbardziej skuteczną metodą byłoby rozwiązanie 1, do transmisji danych za pomocą multiemisji, ponieważ wystarczy wysłać dane tylko raz. Niestety obsługa multiemisji Wi-Fi jest bardzo pofragmentowana w systemie Android, ponieważ wiele urządzeń blokuje ruch nie-unicastowy. Aby uzyskać więcej szczegółowych informacji, przejdź na tę stronę pod numer this article.
Rozwiązanie 2 to najlepsza metoda, jeśli chcesz zagwarantować obsługę wszystkich urządzeń i transmitować tylko niewielką ilość danych. System GO potrzebuje adresów IP klientów w grupie, ale ze względu na sposób implementacji Wi-Fi Direct w systemie Android tylko urządzenia GO IP są znane wszystkim urządzeniom. Jednym z rozwiązań jest umożliwienie klientom podłączyć do gniazdka w podróży, aby uzyskać ich adres IP:
kod Client
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));
}
}
});
Grupa kod Właściciel:
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();
}
}
Teraz trzeba do to uruchom serwerocket na każdym kliencie i przejdź do iteracji poprzez listę klientów, tworząc połączenie z gniazdem i wysyłając wiadomość, którą chcesz nadać.
Czy odniosłeś sukces w swoich wysiłkach? Jeśli tak, proszę dać mi znać, mam ten sam problem i nie mogę znaleźć rozwiązania. Przewierciłem wszystkie możliwe dokumentacje, ale bez powodzenia :(:( –