我正在尝试让 Wifi P2P(也称为“Wifi Direct”)在某些设备上运行。我的目标是让他们成为“组所有者”(即充当接入点)。然而,我在不同的系统上得到了非常不同的结果。请注意,我正在谈论不同的硬件设备,但我思考我的问题是基于Linux的。
我在 Pi 4B 上使用 Raspberry Pi 操作系统取得了成功。然而,当我在运行阿拉伯语的 Banana Pi 上尝试相同的命令时,我得到了截然不同的结果。然而,我认为最终的问题是系统层面的,这就是我在这里问的原因。
因此,以下是 RPi 操作系统上的工作原理(device_name 在 /etc/wpa_supplicant/wpa_supplicant.conf 中设置):
wpa_cli p2p_group_add
ifconfig p2p-wlan0-0 192.168.0.34 metmask 255.255.0.0
dnsmasq -i p2p-wlan0-0 -F192.168.0.40,192.168.0.250 -p0 -z
wpa_cli set p2p_go_intent 15
ifconfig wlan0 down
wpa_cli wps_pbc
从这里开始,如果我从 Android 设备进行连接,它就会工作并收到 DHCP 响应。不幸的是,没有太多的日志记录,所以我无法与其他东西进行比较。此外,通过反复试验,我确定如果我的网络掩码是 255.255.255.0,则此方法不起作用!?!?很奇怪,但无论如何。
如果我在我的 Banana Pi(具有多种操作系统 - Raspbian、Ubuntu 和 Armbian)上尝试相同的命令序列,则会发现一些差异。首先,如果我删除 wlan0,那么之后就没有任何效果了。因此,保留它,除非我发出“wpa_cli p2p_find”,否则它不会开始广告。或“wpa_cli p2p_listen”。我觉得这很奇怪,但无论如何。然而,在这里,Android 设备找到网络并启动,但协商从未完成,也从未给出 DHCP 租约。日志(在 Armbian 上比在 RPiOS 上更好)给出了序列:“P2P-DEVICE-FOUND、P2P-PROV-DISC-PBC-REQ”和“P2P-GO-NEG-REQUEST”,但此后没有任何内容。
无论如何,我尝试了很多变体,不同的内核,不同版本的操作系统等等。可能我的 Banana Pi 出现硬件问题,但我不确定为什么会这样 - 它的 Wifi 一般都很好,而 P2P 我认为只是一种新的帧类型,驱动程序说它支持(使用 brcmfmac)。
与 NetworkManager 的交互也可能很奇怪,但我无法关闭 NetworkManager 并且 wpa_cli 仍然可以工作。在系统日志的早些时候,当我启用 P2P 组时,我会在系统日志中收到一些消息,其中指出:
wpa_supplicant: p2p-wlan0-0: interface state UNINITIALIZED->ENABLED
wpa_supplicant: p2p-wlan0-0: AP-ENABLED
wpa_supplicant: p2p-wlan0-0: CTRL-EVENT_CONNECTED
wpa_supplicant: P2P-GROUP-STARTED p2p-wlan0-0 GO .....
wpa_supplicant: bus: Register group object....
NetworkManager: <warn> device (p2p-dev-wlan0): P2P: WPA supplicant notified a group start but we are not trying to connect! Ignoring the event
wpa_supplicant: p2p-wlan0-0: interface state ENABLED->DISABLED
wpa_supplicant: p2p-wlan0-0: AP-DISABLED
wpa_supplicant: p2p-wlan0-0: CTRL-EVENT-DISCONNECTED
我不知道这些是否正常(因为 RPi 4 没有在此级别记录),但似乎在启用 AP 模式后,它会禁用它。然而,我认为它可能应该保持在 AP 模式,因为它是组所有者。我不知道 NetworkManager 忽略该事件是否会导致任何奇怪的情况。我真的不确定这些互动应该如何进行。
我还尝试了很多变体,例如设置默认路线,但无济于事。如果有人对去哪里有建议,我将不胜感激。遗憾的是,现在我唯一的 Linux 机器是我的 Pi,所以我也无法在普通 PC 上尝试这个。
我也不知道是否可以在较低级别尝试一些东西(使用 iw 或其他东西),因为我真的不熟悉所有层如何协同工作,并且也没有很好的文档,特别是关于Wifi P2P。任何建议表示赞赏。
另外,我尝试关闭 NetworkManager,但是,每当我这样做时,wpa_cli 似乎完全失败。
答案1
所以,事实证明答案非常简单。我确实需要关闭 NetworkManager。但是,当关闭 NetworkManager 时,它要求您为 wpa_supplicant 指定一个配置文件(例如supplicant.conf
),和该文件包含以下行:
ctrl_interface=/run/wpa_supplicant
我对此了解不多,所以我不知道该目录是否特定于发行版。
然后你用这个启动 wpa_supplicant (我把它放在rc.local
):
nohup wpa_supplicant -i wlan0 -c /path/to/supplicant.conf &
然后,您可以运行 Wifi Direct / Wifi P2P 命令,而无需 NetworkManager 关闭您的组。