2023-05-18
Wi-fi Directとは、ピア・ツー・ピア=機器同士1対1で無線通信する規格。Wi-Fi Directに対応した機器(テレビ、オーディオ、エアコンなど)に接続してリモコンがわりに操作したりする目的で使われる。
Raspberry Pi 3以降のオンボードWiFiはWi-Fi Directに対応している。以下のコマンドでそれを確認できる。
iw list ..略.. Supported interface modes: * IBSS * managed * AP * P2P-client * P2P-GO * P2P-device ..略..
P2P-clientが、Wi-Fi Directクライアントとして対応機器に接続できる証しとなる。
Wi-Fi Directクライアントとして接続するサーバーソフトはwpa_supplicantを用いる。
Raspbianにプリインストールされているバイナリパッケージ版の/sbin/wpa_supplicantはWi-Fi Directできるモードでコンパイルされていない可能性があるので無効にし、ソースコードから自分でwpa_supplicantをP2Pオプションを有効にしてコンパイルし、そちらを使うことにする。
https://w1.fi/cgit/hostap/plain/wpa_supplicant/README-P2P
に、すべて記載されている通りの手順で行う。
1、デフォルトの/sbin/wpa_supplicantの起動を無効にする
sudo -s cd /etc/wpa_supplicant mv wpa_supplicant.conf wpa_supplicant.conf.default systemctl disable wpa_supplicant reboot ps aux | grep wpa # wpa_supplicantが居なくなってる事を確認
2、コンパイルに必要なパッケージのインストール
sudo apt install libssl-dev libdbus-1-dev libnl-3-dev libnl-genl-3-dev libnl-route-3-dev
3、wpa_supplicantのコンパイル・インストール
git clone git://w1.fi/srv/git/hostap.git cd hostap/src make clean cd ../wpa_supplicant cp defconfig .config vi .config 以下のコンフィグを有効にする。 CONFIG_DRIVER_NL80211=y CONFIG_CTRL_IFACE=y CONFIG_P2P=y CONFIG_AP=y CONFIG_WPS=y make sudo make install
/usr/local/sbin/{wpa_supplicant,wpa_passphrase,wpa_cli}がインストールされる。
4、Wi-fi Direct(P2Pモード)用の設定ファイルを作成する
/etc/wpa_supplicant/p2p.confを作成する。
country=JP ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev ap_scan=1 device_name=My P2P Device device_type=1-0050F204-1
などとする。
5、wpa_supplicantをP2Pモードで起動する
まず出力を見ながら起動する場合
/usr/local/sbin/wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant/p2p.conf Successfully initialized wpa_supplicant wlan0: CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=JP
安定後、バックグラウンドで起動する場合(出力はsyslog)
/usr/local/sbin/wpa_supplicant -s -B -Dnl80211 -iwlan0 -c/etc/wpa_supplicant/p2p.conf
wpa_supplicantサーバーが立ち上がったので、周辺機器に接続できるようになる。
6、wpa_cliで周辺のWi-fi Direct対応機器を検索する
/usr/local/sbin/wpa_cli p2p_find Selected interface 'wlan0' OK
見つかると、wpa_supplicantの出力に
P2P-DEVICE-FOUND 00:03:69:07:d1:0a p2p_dev_addr=00:03:69:07:d1:0a pri_dev_type=8-0050F204-255 name='DIRECT-P2P-Server0123' config_methods=0x80 dev_capab=0x21 group_capab=0x9 new=1
などと出る。接続可能な機器のMACアドレスを出力するには
/usr/local/sbin/wpa_cli p2p_peers 00:03:69:07:d1:0a
7、Wi-fi Direct接続する
/usr/local/sbin/wpa_cli p2p_stop_find # 探索終了 /usr/local/sbin/wpa_cli p2p_connect 00:03:69:07:d1:0a pbc join
などとする。
相手がグループオーナーでありDHCPサーバーであれば、
May 18 14:20:31 raspberrypi wpa_supplicant[5112]: P2P-FIND-STOPPED May 18 14:20:33 raspberrypi systemd-udevd[8056]: Using default interface naming scheme 'v240'. May 18 14:20:33 raspberrypi kernel: [161450.085950] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save disabled May 18 14:20:33 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: WPS-PBC-ACTIVE May 18 14:20:33 raspberrypi dhcpcd-run-hooks[8064]: p2p-wlan0-0: /etc/wpa_supplicant.conf does not exist May 18 14:20:33 raspberrypi dhcpcd-run-hooks[8065]: p2p-wlan0-0: not interacting with wpa_supplicant(8) May 18 14:20:33 raspberrypi dhcpcd[371]: p2p-wlan0-0: connected to Access Point `' May 18 14:20:33 raspberrypi dhcpcd[371]: p2p-wlan0-0: waiting for carrier May 18 14:20:34 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: Trying to associate with 00:03:69:07:d1:0a (SSID='DIRECT-P2P-Server0123' freq=2462 MHz) May 18 14:20:34 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: Associated with 00:03:69:07:d1:0a May 18 14:20:34 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: CTRL-EVENT-EAP-STARTED EAP authentication started May 18 14:20:34 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0 May 18 14:20:34 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=1 May 18 14:20:34 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: CTRL-EVENT-EAP-METHOD EAP vendor 14122 method 1 (WSC) selected May 18 14:20:36 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: WPS-CRED-RECEIVED May 18 14:20:36 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: WPS-SUCCESS May 18 14:20:36 raspberrypi wpa_supplicant[5112]: P2P-GROUP-FORMATION-SUCCESS May 18 14:20:36 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: CTRL-EVENT-EAP-FAILURE EAP authentication failed May 18 14:20:36 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: CTRL-EVENT-DISCONNECTED bssid=00:03:69:07:d1:0a reason=3 locally_generated=1 May 18 14:20:36 raspberrypi wpa_supplicant[5112]: wlan0: CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD May 18 14:20:36 raspberrypi wpa_supplicant[5112]: wlan0: CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=JP May 18 14:20:36 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: Trying to associate with SSID 'DIRECT-P2P-Server0123' May 18 14:20:37 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: Associated with 00:03:69:07:d1:0a May 18 14:20:37 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: CTRL-EVENT-CONNECTED - Connection to 00:03:69:07:d1:0a completed [id=0 id_str=] May 18 14:20:37 raspberrypi dhcpcd[371]: p2p-wlan0-0: carrier acquired May 18 14:20:37 raspberrypi dhcpcd[371]: p2p-wlan0-0: connected to Access Point `DIRECT-P2P-Server0123' May 18 14:20:37 raspberrypi kernel: [161453.796606] IPv6: ADDRCONF(NETDEV_CHANGE): p2p-wlan0-0: link becomes ready May 18 14:20:37 raspberrypi wpa_supplicant[5112]: P2P-GROUP-STARTED p2p-wlan0-0 client ssid="DIRECT-P2P-Server0123" freq=2462 go_dev_addr=00:03:69:07:d1:0a May 18 14:20:37 raspberrypi wpa_supplicant[5112]: p2p-wlan0-0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0 May 18 14:20:37 raspberrypi dhcpcd[371]: p2p-wlan0-0: IAID ce:98:1d:ca May 18 14:20:37 raspberrypi dhcpcd[371]: p2p-wlan0-0: adding address fe80::fb4c:5750:fb8b:e5f8 May 18 14:20:37 raspberrypi avahi-daemon[317]: Joining mDNS multicast group on interface p2p-wlan0-0.IPv6 with address fe80::fb4c:5750:fb8b:e5f8. May 18 14:20:37 raspberrypi avahi-daemon[317]: New relevant interface p2p-wlan0-0.IPv6 for mDNS. May 18 14:20:37 raspberrypi avahi-daemon[317]: Registering new address record for fe80::fb4c:5750:fb8b:e5f8 on p2p-wlan0-0.*. May 18 14:20:37 raspberrypi dhcpcd[371]: p2p-wlan0-0: soliciting an IPv6 router May 18 14:20:37 raspberrypi dhcpcd[371]: p2p-wlan0-0: soliciting a DHCP lease May 18 14:20:37 raspberrypi dhcpcd[371]: p2p-wlan0-0: offered 192.168.0.2 from 192.168.0.251 May 18 14:20:37 raspberrypi dhcpcd[371]: p2p-wlan0-0: probing address 192.168.0.2/24 May 18 14:20:42 raspberrypi dhcpcd[371]: p2p-wlan0-0: leased 192.168.0.2 for 3600 seconds May 18 14:20:42 raspberrypi avahi-daemon[317]: Joining mDNS multicast group on interface p2p-wlan0-0.IPv4 with address 192.168.0.2. May 18 14:20:42 raspberrypi avahi-daemon[317]: New relevant interface p2p-wlan0-0.IPv4 for mDNS. May 18 14:20:42 raspberrypi avahi-daemon[317]: Registering new address record for 192.168.0.2 on p2p-wlan0-0.IPv4. May 18 14:20:42 raspberrypi dhcpcd[371]: p2p-wlan0-0: adding route to 192.168.0.0/24 May 18 14:20:42 raspberrypi dhcpcd[371]: p2p-wlan0-0: adding default route via 192.168.0.251 May 18 14:20:50 raspberrypi dhcpcd[371]: p2p-wlan0-0: no IPv6 Routers available
などとsyslogに出力され、相手の機器のIPアドレスは192.168.0.251で、自分は192.168.0.2を与えられたことがわかる。以下で確認する。
ifconfig p2p-wlan0-0: flags=4163<up> mtu 1500 inet 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::b1a1:f4b0:308a:73c2 prefixlen 64 scopeid 0x20<link> ether 1a:01:a5:4e:37:c3 txqueuelen 1000 (Ethernet) RX packets 9 bytes 1710 (1.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 32 bytes 5535 (5.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4099<up> mtu 1500 ether b8:27:eb:ae:9a:f6 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 </up></up>
wlan0は何も変わっておらず、トンネルデバイスp2p-wlan0-0に新しく割り当てられていることに注意。
pingで疎通確認する。
ping 192.168.0.251 PING 192.168.0.251 (192.168.0.251) 56(84) bytes of data. 64 bytes from 192.168.0.251: icmp_seq=1 ttl=255 time=6.27 ms 64 bytes from 192.168.0.251: icmp_seq=2 ttl=255 time=2.98 ms 64 bytes from 192.168.0.251: icmp_seq=3 ttl=255 time=5.90 ms 64 bytes from 192.168.0.251: icmp_seq=4 ttl=255 time=5.13 ms ^C --- 192.168.0.251 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 7ms rtt min/avg/max/mdev = 2.984/5.070/6.270/1.274 ms
あとは相手の機器の用途次第でソケット通信なりなんなりする。たいていhttpでページが用意されていたりするので、
wget http://192.168.0.251/index.html などという感じで普通に通信する。
8、切断する
Wi-fi Directは相手と何も通信しないでいると、多くの場合相手側からオートで切断される。
自分から切断する場合、p2p-wlan0-0 をDOWNさせる。
ifconfig p2p-wlan0-0 down
切断された場合のsyslog
May 18 16:19:08 raspberrypi wpa_supplicant[12323]: p2p-wlan0-0: CTRL-EVENT-DISCONNECTED bssid=00:03:69:07:d1:0a reason=3 locally_generated=1 May 18 16:19:08 raspberrypi dhcpcd[371]: p2p-wlan0-0: carrier lost May 18 16:19:08 raspberrypi wpa_supplicant[12323]: wlan0: CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD May 18 16:19:08 raspberrypi wpa_supplicant[12323]: wlan0: CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=JP May 18 16:19:08 raspberrypi dhcpcd[371]: p2p-wlan0-0: deleting address fe80::b1a1:f4b0:308a:73c2 May 18 16:19:08 raspberrypi avahi-daemon[317]: Withdrawing address record for fe80::b1a1:f4b0:308a:73c2 on p2p-wlan0-0. May 18 16:19:08 raspberrypi avahi-daemon[317]: Leaving mDNS multicast group on interface p2p-wlan0-0.IPv6 with address fe80::b1a1:f4b0:308a:73c2. May 18 16:19:08 raspberrypi avahi-daemon[317]: Interface p2p-wlan0-0.IPv6 no longer relevant for mDNS. May 18 16:19:08 raspberrypi avahi-daemon[317]: Withdrawing address record for 192.168.0.2 on p2p-wlan0-0. May 18 16:19:08 raspberrypi avahi-daemon[317]: Leaving mDNS multicast group on interface p2p-wlan0-0.IPv4 with address 192.168.0.2. May 18 16:19:08 raspberrypi avahi-daemon[317]: Interface p2p-wlan0-0.IPv4 no longer relevant for mDNS. May 18 16:19:08 raspberrypi dhcpcd[371]: p2p-wlan0-0: deleting route to 192.168.0.0/24 May 18 16:19:08 raspberrypi dhcpcd[371]: p2p-wlan0-0: deleting default route via 192.168.0.251 May 18 16:19:18 raspberrypi wpa_supplicant[12323]: P2P-GROUP-REMOVED p2p-wlan0-0 client reason=IDLE May 18 16:19:18 raspberrypi wpa_supplicant[12323]: nl80211: deinit ifname=p2p-wlan0-0 disabled_11b_rates=0 May 18 16:19:19 raspberrypi kernel: [168576.089851] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save disabled May 18 16:19:19 raspberrypi kernel: [168576.618636] ieee80211 phy0: brcmf_cfg80211_get_channel: chanspec failed (-52) May 18 16:19:20 raspberrypi dhcpcd[371]: p2p-wlan0-0: removing interface
9、再度の接続が失敗する場合
wpa_supplicantをkillして再度立ち上げた場合や、上記8、のように切断した後、同じ手順で再接続しようとしてもうまくいかない場合がある。
その場合は以下のようにbrcmfmacモジュールを再起動すると治る場合がある。
modprobe -r brcmfmac #ドライバアンロード modprobe brcmfmac #ドライバロード
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
Windowsのデスクトップ画面をそのまま配信するための下準備
WindowsでGPUの状態を確認するには(ASUS系監視ソフトの自動起動を停止する)
CORESERVER v1プランからさくらインターネットスタンダートプランへ引っ越しメモ
さくらインターネットでPython MecabをCGIから使う
さくらインターネットのPHPでAnalytics-G4 APIを使う
インクルードパスの調べ方
【Git】特定ファイルを除外する.gitignore
【Ubuntu/Debian】NVIDIA関係のドライバを自動アップデートさせない
【Python】Spacyを使用して文章から出発地と目的地を抜き出す
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
Windows版Google Driveが使用中と言われアンインストールできない場合
GitLabにHTTPS経由でリポジトリをクローン&読み書きを行う
【Apache】サーバーに同時接続可能なクライアント数を調整する
VirtualBoxの仮想マシンをWindows起動時に自動起動し終了時に自動サスペンドする
【PHP】Mail/mimeDecodeを使ってメールの中身を解析(準備編)
【Linux】iconv/libiconvをソースコードからインストール