Na tomto problému jsem hodně pracoval a zde jsou odpovědi, které jsem našel:
- Odpověď 1.1 Existuje mnoho možností a ta správná závisí na tom, čeho se snažíte dosáhnout. Různé možnosti naleznete zde:http://processors.wiki.ti.com/index.php/OMAP_Wireless_Connectivity_NLCP_WiFi_Direct_Configuration_Scripts
Chtěl jsem Linux jako GO a Android jako klienta, takže to, co mi v Linuxu fungovalo, je:
// Kill current supplicant and avoid its automatic recreation
system("mv /usr/share/dbus-1/system-services/fi.* .");
system("killall udhcpd");
system("wpa_cli -i wlan0 terminate -B");
usleep(300000);
// Start new supplicant
system("wpa_supplicant -Dnl80211 -iwlan0 -c /etc/p2p_supplicant.conf -B");
system("wpa_cli -iwlan0 p2p_group_add");
system("ifconfig p2p-wlan0-0 192.168.1.2");
// Connect with a peer
for (;;) {
system("wpa_cli -ip2p-wlan0-0 wps_pbc");
system("udhcpd /etc/udhcpd.conf");
// Here start your TCP server on a port
Server server([port]);
server.startServer();
}
N.B. Ke zničení P2P připojení a restartu normálního používám tento skript:
#!/bin/bash
wpa_cli -i wlan0 terminate -B
wpa_cli -i p2p-wlan0-0 terminate -B
cp ./fi.* /usr/share/dbus-1/system-services/
service network-manager restart
Zde server čeká na připojení a klient Android se k němu připojí. Použil jsem velmi snadný server TCP, který jsem našel na prvním webu, a fungoval jako kouzlo. Je důležité spustit udhcpd, jinak se v Androidu nezobrazí ikona „připojeno“. Na straně Androidu jsem se řídil tím, co jsem viděl na http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html a fungovalo to perfektně.
-
Odpověď 1.2 Z wpa_cli můžete získat mnoho různých varování a chyb. Viděl jsem, že pouhým voláním funkce (jako v předchozím úryvku) vše fungovalo navzdory varováním. Ignoroval jsem je.
-
Odpověď 1.3 Připojení pomocí PIN funguje, když jsem to zkoušel, nespouštěl jsem udhcpd a to mi pokaždé zhroutilo připojení. Nebylo to kvůli PIN nebo PBC.
-
Odpověď 2.1 Server i klient přepínají rozhraní. Jedná se o velmi podobné chování, jaké obvykle děláte se sokety. Vytvoříte naslouchací soket, někdo se připojí, vytvoříte nový soket pro obsluhu tohoto klienta v samostatném vláknu, zatímco naslouchací soket stále existuje a čeká na další uživatele. Totéž uděláte s rozhraními. Spuštění wpa_cli, které monitoruje rozhraní wlan0 a jednoho, který monitoruje rozhraní p2p-wlan0-0, poskytuje dobrou představu o tom, co se děje během změny.
-
Odpověď 2.2 Klient "přešel" na druhé rozhraní a je nyní připraven přijmout IP. Spusťte servery DHCP a TCP!
-
Odpověď 2.3 Nepoužívejte statickou IP. Pouze pro server je v pořádku, klient by měl používat DHCP IP. Možná existuje způsob, jak zacházet se statickými adresami IP, ale pro mé cíle to nebylo užitečné.
-
Odpověď 2.4 Hotovo. To byl celý ten problém
-
Odpověď 1.4 Toto funguje perfektně i se systémem Android/linux.
Omlouvám se, pokud jsem ve své odpovědi udělal nějakou chybu, stále nemám úplný obrázek o připojení WiFi-Direct, jen doufám, že to pomůže někomu dalšímu.
(Možná to není úplná odpověď, ale správný směr)
Problém je na straně Linuxu. Setkávám se s podobnými problémy mezi Cyanogenmod (Android 5) a Fedora 22, když se pokouším použít Wifi Direct (Wifi P2P) pro Intel Wireless Display Software pro Linux OS (WDS).
Konkrétně se connman společnosti Intel odchýlil (napsán od nuly) v roce 2009 od toho, co bylo v Linuxu standardem, NetworkManager. Zdá se, že Connman je jedinou implementací Wifi Direct (Wifi P2P) pro Linux a byl napsán pro embedded (mobilní) trh.
Kvůli problému s RPM zůstává connman na mém systému nevyzkoušený, ale software by měl poskytovat komunikaci dbus, kterou Linux potřebuje.
Web:https://01.org/connman