Wifi P2p技术研究
写在前面
又开始玩技术了,看来是真爱, 价值观,专注度.
需求
需求是要linux 直连 android phone
. 搜寻网内外n多资料,好像没有一个把WIFI P2P讲的特别清的.
同时最好要做到:
1. linux 为GO, 即server. 好处是更安全
2. ip自动分配
ubuntu
- wpa_supplicant.conf ```sh ctrl_interface=/run/wpa_supplicant update_config=1 device_name=My-pc device_type=1-0050F204-1 p2p_go_intent=15 p2p_go_ht40=1
network={ ssid=”DIRECT-6r” bssid=a4:34:d9:b0:f2:94 psk=”obTKxnwA” proto=RSN key_mgmt=WPA-PSK pairwise=CCMP auth_alg=OPEN mode=3 disabled=2 p2p_client_list=a2:86:c6:92:75:6b }
可杀掉系统的wpa_supplicant,重新启1个:
```sh
sudo wpa_supplicant -Dnl80211 -iwlp4s0 -c/etc/wpa_supplicant.conf -O /run/wpa_supplicant -u
-u
是ubuntu系统才有的, 实际NetworkManager就是这么跑的, 真正的PC配置文件来自DBUS,这里仅为调试用,增加自己的conf.
网卡指定了-iwlp4s0
,即无线网卡inferface.
network的配置是通过p2p_group_add persistent
生成的,不过既然都生成了,就直接写在配置里,
免去一些操作.
- 启动wpa_cli
sudo wpa_cli -ip2p-dev-wlp4s0
注意
p2p-dev-wlp4s0
是p2p ctrl interface, 这是个隐藏boss, 只有前面的wpa_supplicant配置为正确的p2p模式时,才会出现.
接下来基于wpa_cli
的p2p命令进行p2p流程
- p2p_find
找到对应的peers
p2p_find
找到了对端的手机:
> p2p_peers
a2:86:c6:92:75:6b
这里手机端应该也要开始discovery的动作,才能完成P2P Probe Frame的交换.
- p2p_group_add
将ubuntu做GO,使用conf里已经定义的network:
p2p_group_add persistent=0
成功运行后会发现多了1个interface,这个是真正的通讯用的group interfacep2p-wlp4s0-0
- wps_pbc
选择wps的认证方法,这里需要和app端发送的一致. app端connect时选择的就是pbc
这个方法允许具有WPS的对端连接到已存在的GO上. 特别重要,没它不行
- 配置IP和udhcpd服务
wifi direct仅解决链路层以下的问题,ip层的事情还是得自己来。这里选择udhcpd作为dhcp服务器.
为简单起便,先给interface配置静态ip:
sudo ifconfig p2p-wlp4s0-0 192.168.3.3 netmask 255.255.255.0 up
/etc/udhcpd.conf
里,配置好网段和interface:
# The start and end of the IP lease block
start 192.168.3.20 #default: 192.168.0.20
end 192.168.3.254 #default: 192.168.0.254
# The interface that udhcpd will use
interface p2p-wlp4s0-0 #default: eth0
启动udhcpd,-f
为前台,可观察下ip的分配情况.
sudo udhcpd -f
- app connect
前面的步骤6,其实就是为了这里的7准备,根据android的尿性,如果不准备好dhcp server,一定不会connect 成功,也就是broadcast打死也不会有P2P_STATE_CHANGE这个action. 这里是个很大的坑,这算是linux wifi-p2p连接android的难点。