アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【RaspberryPIDebian
【Raspberry Piメモ・3】オンボード無線LANでWi-fi Direct対応機器に接続する
POSTED BY
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 #ドライバロード

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

【キーワード検索】