写在前面

又开始玩技术了,看来是真爱, 价值观,专注度.

需求

需求是要linux 直连 android phone. 搜寻网内外n多资料,好像没有一个把WIFI P2P讲的特别清的.

同时最好要做到:

1. linux 为GO, 即server. 好处是更安全
2. ip自动分配

ubuntu

  1. 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生成的,不过既然都生成了,就直接写在配置里, 免去一些操作.

  1. 启动wpa_cli
    sudo wpa_cli -ip2p-dev-wlp4s0
    

    注意p2p-dev-wlp4s0是p2p ctrl interface, 这是个隐藏boss, 只有前面的wpa_supplicant配置为正确的p2p模式时,才会出现.

接下来基于wpa_cli的p2p命令进行p2p流程

  1. p2p_find

找到对应的peers

p2p_find

找到了对端的手机:

> p2p_peers
a2:86:c6:92:75:6b

这里手机端应该也要开始discovery的动作,才能完成P2P Probe Frame的交换.

  1. p2p_group_add

将ubuntu做GO,使用conf里已经定义的network:

p2p_group_add persistent=0

成功运行后会发现多了1个interface,这个是真正的通讯用的group interfacep2p-wlp4s0-0

  1. wps_pbc

选择wps的认证方法,这里需要和app端发送的一致. app端connect时选择的就是pbc

这个方法允许具有WPS的对端连接到已存在的GO上. 特别重要,没它不行

  1. 配置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
  1. app connect

前面的步骤6,其实就是为了这里的7准备,根据android的尿性,如果不准备好dhcp server,一定不会connect 成功,也就是broadcast打死也不会有P2P_STATE_CHANGE这个action. 这里是个很大的坑,这算是linux wifi-p2p连接android的难点。