P2P(Wi-Fi Direct)とは?
これまでに、hostapのwpa_supplicant(clientモード)の使い方 や hostapd(APモード)の使い方 について説明しました。
今回は wpa_supplicant(P2Pモード)の使い方 について説明したいと思います。
P2P(Wi-Fi Direct)は、P2P対応デバイス同士で接続しP2Pgroupを形成し、APへの接続なしにPeer-to-Peer接続で使用する機能になります。
アドホックとは異なり、それぞれでGC(GroupClient) / GO(GroupOwner)のロールを割り振り通信します。
※GC=Client/GO=APと考えられます。
P2P使用時に登場するデバイスには以下の3種類があります。
- P2P device:P2P groupを形成していないP2P対応デバイス
- Group client:P2P groupを形成済みでGroup clientとして動作するデバイス
- Group owner:P2P groupを形成済みでGroup ownerとして動作するデバイス
P2Pの動作
P2Pの接続手順としてはいくつか存在します。今回は、1, 2の接続手順について説明します。
1. P2P device -> P2P device
新たにP2P groupを作成する:P2P groupを形成していないP2P device同士の接続
2. P2P device -> P2P GO
形成済みのP2P groupに接続する:P2P deviceがP2P groupにGroup clientとして接続
3. P2P GO -> P2P device
形成済みのP2P groupにGroup ownerから招待する:P2P groupにGroup ownerからP2P deviceを招待し接続
4. P2P GO - P2P device ->P2P device
形成済みのP2P groupにGroup clientから招待:P2P groupにGroup clientからP2P deviceを招待し接続
基本的な接続シーケンスは以下のようになります。
(1).Search/listen
P2Pデバイスを探します。2台のデバイスがそれぞれSearch/listenを繰り返しお互いを探します。
(2).ProvisionDiscovery
接続時に使用するWPSメソッド(PBC/PIN display/PIN keypadなど)を通知します。
(3).GO negotiation
どちらのデバイスがGOになるのか決定します。(go_intentの値が大きい方がGOになります。)
(4).Provisioning
WPSを実行しCredentialを実行します。
(5).4Way-handshake
鍵情報を交換します。
環境
今回、使用する環境はUbuntu16.04+Kernel4.9.11+QCA9377(Qualcomm Wireless LAN製品)の組み合わせになります。
wpa_supplicantの設定・起動
p2pモードの起動方法についてはいくつかありますが、今回はP2P用のインターフェースを使用して起動します。
wpa_supplicant -ip2p0 -Dnl80211 -c p2p_supplicant.conf
p2p_supplicant.confは以下のように設定します。
ctrl_interface=/var/run/p2p_supplicant
country=JP
device_name=Test device2 <= ユーザーフレンドリーなデバイス名を設定します。
persistent_reconnect=1 <= "persistent"の招待時に自動で接続します。
p2p_no_group_iface=1 <= p2p0をP2P Groupのコントロール用インターフェースとして使用します。設定しない場合“p2p-p2p0-0”のようなインターフェースが、P2P Groupができたときに生成されます。
wpa_cliの起動
wpa_supplicant起動時のインターフェース名に併せます。
wpa_cli -ip2p0 -p/var/run/p2p_supplicant
Scanの実行
P2Pでは、“scan”ではなく“p2p_find”を実行します。
Client/AP(以後Legacy Wi-Fi)とは異なり、見つかったデバイス情報を随時コールバックしてきます。
主なデバイス情報
p2p_dev_addr:P2P接続用のアドレス
pri_dev_type:デバイス情報
name:デバイス名
config_methods:対応しているWPSのメソッド情報
dev_capab:デバイスのcapability情報
gtoup_capab:グループのcapability情報
> p2p_find
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>P2P-DEVICE-FOUND 11:22:33:44:55:66 p2p_dev_addr=11:22:33:44:55:66 pri_dev_type=0-00000000-0 name='' config_methods=0x1108 dev_capab=0x25 group_capab=0x0 vendor_elems=1 new=1
接続
接続先がP2P deviceの場合:
p2p_connect <p2pデバイスアドレス> <config_method>:接続処理を実行します。
今回は、わかりやすいPBC(PushButton)で接続します。
まず、接続要求(GO negotiation request)を接続先に送ります。(接続先がいつ返答してくるかわからないため、接続先からのGO negotiation requestを待つ状態になります。)
接続先は、接続を受け入れる場合、接続元に対してGO negotiation requestを送り返します。
接続元は、接続先からのGO negotiation requestをトリガーに、どちらのデバイスがGroup client/Group ownerを担当するのかを決め、選択したconfig_method(PBC)でWPSを実行し接続します。
接続元のP2P device
> p2p_connect 11:22:33:44:55:66 pbc <= 接続先にGO negotiation requestを送信します。
OK
<3>P2P-FIND-STOPPED
<3>P2P-GO-NEG-SUCCESS role=client freq=5240 ht40=0 peer_dev=11:22:33:44:55:66 peer_iface=11:22:33:44:55:66 wps_method=PBC <= P2P clientでconfig_methodとして“PBC”を選択。
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>P2P-GROUP-FORMATION-SUCCESS <= 接続先からのGO negotiation requestを受けGroup client/Group ownerを決定します。
<3>CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
<3>CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=JP
<3>P2P-GROUP-STARTED p2p0 client ssid="DIRECT-Eb" freq=5240 psk=57c0f5512daa0d44399bc35d530212721885abcad660850a9ea0ff0fbad86291 go_dev_addr=11:22:33:44:55:66 <= 接続元がGroup clientとして接続完了。P2P groupのSSIDは“DIRECT-Eb”(Legacy clientからもpskで接続可能)。
接続先のP2P device
<3>CTRL-EVENT-SCAN-STARTED
> P2P-GO-NEG-REQUEST 66:55:44:33:22:11 dev_passwd_id=4 go_intent=7 <= 接続元からのGO negotiation requestを受信。
<3>P2P-GO-NEG-REQUEST 66:55:44:33:22:11 dev_passwd_id=4 go_intent=7
<3>CTRL-EVENT-SCAN-STARTED
> p2p_connect 66:55:44:33:22:11 pbc <= 受け入れるため接続コマンドを実行します。
P2P-FIND-STOPPED
OK
<3>P2P-FIND-STOPPED
> P2P-GO-NEG-SUCCESS role=GO freq=5240 ht40=0 peer_dev=66:55:44:33:22:11 peer_iface=66:55:44:33:22:11 wps_method=PBC <= 接続先がGroup ownerとしてP2P Groupを形成。
[ 1303.755698] IPv6: ADDRCONF(NETDEV_UP): p2p0: link is not ready
<3>P2P-GO-NEG-SUCCESS role=GO freq=5240 ht40=0 peer_dev66:55:44:33:22:11 peer_iface=66:55:44:33:22:11 wps_method=PBC
[ 1303.901587] IPv6: ADDRCONF(NETDEV_CHANGE): p2p0: link becomes ready
p2p0: interface state UNINITIALIZED->ENABLED
p2p0: AP-ENABLED
p2p0: CTRL-EVENT-CONNECTED - Connection to 11:22:33:44:55:66 completed [id=0 id_str=]
p2p0: WPS-PBC-ACTIVE
p2p0: CTRL-EVENT-CHANNEL-SWITCH freq=5240 ht_enabled=1 ch_offset=0 ch_width=20 MHz cf1=5240 cf2=0
p2p0: CTRL-EVENT-CHANNEL-SWITCH freq=5240 ht_enabled=1 ch_offset=0 ch_width=20 MHz cf1=5240 cf2=0 dfs=0
p2p0: AP-CSA-FINISHED freq=5240 dfs=0
p2p0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
p2p0: CTRL-EVENT-EAP-STARTED 66:55:44:33:22:11
p2p0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=1
p2p0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=254
p2p0: WPS-REG-SUCCESS 66:55:44:33:22:11 8a9b5c52-863a-503b-9335-5c200b832f0e
P2P-GROUP-FORMATION-SUCCESS
<3>P2P-GROUP-FORMATION-SUCCESS
> P2P-GROUP-STARTED p2p0 GO ssid="DIRECT-Eb" freq=5240 go_dev_addr=11:22:33:44:55:66
<3>P2P-GROUP-STARTED p2p0 GO ssid="DIRECT-Eb" freq=5240 passphrase="CLgJ3w4j" go_dev_addr=11:22:33:44:55:66
> p2p0: WPS-PBC-DISABLE
p2p0: WPS-SUCCESS
p2p0: CTRL-EVENT-EAP-FAILURE 66:55:44:33:22:11
p2p0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
p2p0: AP-STA-CONNECTED 66:55:44:33:22:11 p2p_dev_addr=66:55:44:33:22:11
AP-STA-CONNECTED 66:55:44:33:22:11 p2p_dev_addr=66:55:44:33:22:11
p2p0: EAPOL-4WAY-HS-COMPLETED 66:55:44:33:22:11
<3>AP-STA-CONNECTED 66:55:44:33:22:11 p2p_dev_addr=66:55:44:33:22:11
接続先がP2P GOの場合:
p2p_connect <p2pデバイスアドレス> <config_method> join:接続処理を実行します。
内部では、選択したconfig_methodでWPSを実行し接続します。
接続先がGOの場合、すでにロールが決まっているためGO negotiationは実行されません。
GCからProvisionDiscoveryRequestが送信され、GO側でWPSを開始します。
接続元のP2P device
> p2p_find
OK
<3>CTRL-EVENT-SCAN-STARTED
> P2P-DEVICE-FOUND 11:22:33:44:55:66 p2p_dev_addr=11:22:33:44:55:66 pri_dev_type=0-00000000-0 name='' config_methods=0x1108 dev_capab=0x25 group_capab=0x9 vendor_elems=1 new=1
<3>P2P-DEVICE-FOUND 11:22:33:44:55:66 p2p_dev_addr=11:22:33:44:55:66 pri_dev_type=0-00000000-0 name='' config_methods=0x1108 dev_capab=0x25 group_capab=0x9 vendor_elems=1 new=1
<3>CTRL-EVENT-SCAN-STARTED
> p2p_connect 11:22:33:44:55:66 pbc join <= PBCでGOに対して接続要求を出します。
P2P-FIND-STOPPED
OK
<3>P2P-FIND-STOPPED
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
> p2p0: WPS-PBC-ACTIVE
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
> p2p0: Trying to associate with 11:22:33:44:55:66 (SSID='DIRECT-dP' freq=5180 MHz)
p2p0: Associated with 11:22:33:44:55:66
p2p0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
p2p0: CTRL-EVENT-EAP-STARTED EAP authentication started
p2p0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=1
p2p0: CTRL-EVENT-EAP-METHOD EAP vendor 14122 method 1 (WSC) selected
p2p0: WPS-CRED-RECEIVED
p2p0: WPS-SUCCESS
P2P-GROUP-FORMATION-SUCCESS
<3>P2P-GROUP-FORMATION-SUCCESS
> p2p0: CTRL-EVENT-EAP-FAILURE EAP authentication failed
p2p0: CTRL-EVENT-DISCONNECTED bssid=11:22:33:44:55:66 reason=3 locally_generated=1
p2p0: CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
<3>CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
> p2p0: Trying to associate with SSID 'DIRECT-dP'
p2p0: Associated with 11:22:33:44:55:66
p2p0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
p2p0: WPA: Key negotiation completed with 11:22:33:44:55:66 [PTK=CCMP GTK=CCMP]
p2p0: CTRL-EVENT-CONNECTED - Connection to 11:22:33:44:55:66 completed [id=0 id_str=]
P2P-GROUP-STARTED p2p0 client ssid="DIRECT-dP" freq=5180 go_dev_addr=11:22:33:44:55:66
<3>P2P-GROUP-STARTED p2p0 client ssid="DIRECT-dP" freq=5180 psk=ee5fb984cc62fb35f6d05a18232e0f991b3c88b4787c0ae64863e3363413b0f4 go_dev_addr=11:22:33:44:55:66
接続先のGroup owner
<3>P2P-PROV-DISC-PBC-REQ 66:55:44:33:22:11 p2p_dev_addr=66:55:44:33:22:11 pri_dev_type=0-00000000-0 name='' config_methods=0x1108 dev_capab=0x25 group_capab=0x0 group=p2p0 <= 接続元からの接続要求。
> wps_pbc <= PBCを実行します。
p2p0: WPS-PBC-ACTIVE
OK
<3>WPS-PBC-ACTIVE
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-ENROLLEE-SEEN 66:55:44:33:22:11 bfb33606-2998-5883-8bc0-66d39f85d094 0-00000000-0 0x3148 4 1 [ ]
<3>RX-PROBE-REQUEST sa=66:55:44:33:22:11 signal=-4000
<3>WPS-ENROLLEE-SEEN 66:55:44:33:22:11 bfb33606-2998-5883-8bc0-66d39f85d094 0-00000000-0 0x3148 4 1 [ ]
<3>RX-PROBE-REQUEST sa=66:55:44:33:22:11 signal=-3900
<3>WPS-ENROLLEE-SEEN 66:55:44:33:22:11 bfb33606-2998-5883-8bc0-66d39f85d094 0-00000000-0 0x3148 4 1 [ ]
<3>RX-PROBE-REQUEST sa=66:55:44:33:22:11 signal=-3800
p2p0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
p2p0: CTRL-EVENT-EAP-STARTED 66:55:44:33:22:11
p2p0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=1
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>CTRL-EVENT-EAP-STARTED 66:55:44:33:22:11
<3>CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=1
> p2p0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=254
<3>CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=254
> p2p0: WPS-REG-SUCCESS 66:55:44:33:22:11 bfb33606-2998-5883-8bc0-66d39f85d094
<3>WPS-REG-SUCCESS 66:55:44:33:22:11 bfb33606-2998-5883-8bc0-66d39f85d094
> p2p0: WPS-PBC-DISABLE
p2p0: WPS-SUCCESS
p2p0: CTRL-EVENT-EAP-FAILURE 66:55:44:33:22:11
<3>WPS-PBC-DISABLE
<3>WPS-SUCCESS
<3>CTRL-EVENT-EAP-FAILURE 66:55:44:33:22:11
> p2p0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
> p2p0: AP-STA-CONNECTED 66:55:44:33:22:11 p2p_dev_addr=66:55:44:33:22:11
AP-STA-CONNECTED 66:55:44:33:22:11 p2p_dev_addr=66:55:44:33:22:11
p2p0: EAPOL-4WAY-HS-COMPLETED 66:55:44:33:22:11
<3>AP-STA-CONNECTED 66:55:44:33:22:11 p2p_dev_addr=66:55:44:33:22:11
<3>EAPOL-4WAY-HS-COMPLETED 66:55:44:33:22:11
切断
P2P groupの終了 / P2P groupからの離脱
p2p_group_remove <P2P groupのインターフェース名>:Group ownerの場合、P2P Groupの終了。Group clientの場合、P2P groupからの離脱。
Group Client側
> p2p_group_remove p2p0
p2p0: CTRL-EVENT-DISCONNECTED bssid=11:22:33:44:55:66 reason=3 locally_generated=1
P2P-GROUP-REMOVED p2p0 client reason=REQUESTED
OK
<3>P2P-GROUP-REMOVED p2p0 client reason=REQUESTED
Group owner側
> p2p_group_remove p2p0
P2P-GROUP-REMOVED p2p0 GO reason=REQUESTED
OK
> p2p0: interface state ENABLED->DISABLED
p2p0: AP-DISABLED
<3>AP-DISABLED
> p2p0: CTRL-EVENT-DISCONNECTED bssid=11:22:33:44:55:66 reason=3 locally_generated=1
<3>CTRL-EVENT-DISCONNECTED bssid=11:22:33:44:55:66 reason=3 locally_generated=1
P2Pネットワークの保存
Legacy Wi-FiのようにP2Pネットワークをconfファイルに保存しておくと、次回接続時にGO negotiation / WPSなしで前回のロールで高速に接続できます。
コマンド:
p2p_connect 11:22:33:44:55:66 pbc persistent
接続すると以下のように、p2p_supplicant.conf内にネットワークブロックが作成されます。
ctrl_interface=/var/run/p2p_supplicant
update_config=1
device_name=Test device1
persistent_reconnect=1
p2p_no_group_iface=1
country=JP
network={
ssid="DIRECT-v6"
bssid=66:55:44:33:22:11 <= GOのデバイスアドレス。
psk="43FGe2rD"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
auth_alg=OPEN
mode=3
disabled=2
p2p_client_list=11:22:33:44:55:66 <= 自分がGOの場合、Clientデバイスのリストが表示されます。
}
p2p_connect 11:22:33:44:55:66 pbc persistent
> P2P-GROUP-STARTED p2p0 client ssid="DIRECT-v6" freq=5180 go_dev_addr=66:55:44:33:22:11 [PERSISTENT] <- P2P-GROUP-STARTEDで[PERSISTENT]となっている場合はP2P Group情報が保存されています。
保存されているP2P Group情報で再度P2P Groupを作成する場合
> list_networks
network id / ssid / bssid / flags
1 DIRECT-v6 66:55:44:33:22:11 [DISABLED][P2P-PERSISTENT]
> p2p_invite persistent=1 peer=11:22:33:44:55:66 <= persistentの’1’はlist_networksの“network ID”
OK
<3>P2P-FIND-STOPPED
<3>P2P-INVITATION-RESULT status=0 <= p2p_inviteの受信側のp2p_supplicant.confに“persistent_reconnect=1”が設定されていれば自動で接続されます。
<3>AP-ENABLED
<3>CTRL-EVENT-CONNECTED - Connection to 66:55:44:33:22:11 completed [id=2 id_str=]
<3>P2P-GROUP-STARTED p2p0 GO ssid="DIRECT-v6" freq=5180 passphrase="43FGe2rD" go_dev_addr=66:55:44:33:22:11 [PERSISTENT]
<3>CTRL-EVENT-CHANNEL-SWITCH freq=5180 ht_enabled=1 ch_offset=1 ch_width=80 MHz cf1=5210 cf2=0
<3>CTRL-EVENT-CHANNEL-SWITCH freq=5180 ht_enabled=1 ch_offset=1 ch_width=80 MHz cf1=5210 cf2=0 dfs=0
<3>AP-CSA-FINISHED freq=5180 dfs=0
<3>WPS-ENROLLEE-SEEN 11:22:33:44:55:66 484189fc-758a-513e-bd71-8d1a51775c6c 0-00000000-0 0x3148 0 0 [Test device2]
<3>RX-PROBE-REQUEST sa=11:22:33:44:55:66 signal=-3500
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>AP-STA-CONNECTED 11:22:33:44:55:66 p2p_dev_addr=11:22:33:44:55:66
<3>EAPOL-4WAY-HS-COMPLETED 11:22:33:44:55:66
まとめ
今回は、P2Pの基本的な使い方について説明してきました。
P2Pは、Legacy Wi-Fiと比べると接続手順が複雑でわかりにくいですが、Client(Group client) / AP(Group owner)の役割を決める部分が追加されているのみで、あとはLegacy Wi-Fiと同じように接続しているだけです。
P2Pを使用することのメリットは、APが存在しない環境でも大容量のデータ通信が可能なことです。(MiracastなどもP2P上で使用可能です。)
Androidデバイスも対応しているものが多いので試してみてはいかがでしょうか。
また、今回説明はしませんでしたが、QualcommデバイスではClient側とP2P側で別々のインターフェースを使用することでコンカレント(Legacy Wi-FiとP2Pを同時に使用)で接続することも可能です。
※QCA9377ではSCC(Same channel conccurent)限定
ご興味がありましたら、以下より是非お問い合わせください。
お問い合わせ
Qualcomm製品に関するご質問等がございましたら、以下リンクよりお問い合わせください。
Qualcomm メーカー情報Topへ
Qualcomm メーカー情報Topページへ戻りたい方は、以下をクリックしてください。