初始情况很简单:
我在一台机器上创建了一个热点
Linux
:(nmcli dev wifi hotspot con-name "John"
完整脚本见下文)我显示密码(和二维码):(
nmcli d w s
缩写为nmcli dev wifi show-password
)我的 ( ) 手机上出现了热点
Android 11
,并要求输入密码。我扫描了二维码,但无法连接。(为了以防万一,我还尝试输入了密码)。
我或多或少消除了Broadcom BCM4313
我之前怀疑的问题,因为我创建了两个“实时”版本的操作系统(Slackware64-current
)并且都可以很好地管理热点(至少不需要密码)。
对于实时版本,我找不到如何用密码保护热点。即使在指定 PW(并重新启动热点)后,接入点仍保持打开状态(无需密码即可连接)。
另外,我尝试过wihotspot
- 一个专门用于创建热点的脚本 - 但根本无法让它工作。
(可能相关:QR 码阅读器经常Android
会报告格式错误。但是,如上所述,手动输入密码也会失败。)
我在这里可能做错了什么?这可能是证书问题吗?
更新 使用说明这一页,我设法让热点运行,但前提是我不指定密码(即,如果我不包含步骤 4 中的两行)
我输入密码后,手机立即断开连接,并要求我输入密码。使用二维码或手动输入密码都无法连接。
值得注意的是,电话图标做过通过更改 Wifi 图标来检测网站现在是否受到保护。(为确保万无一失,我首先使用 删除了以前的定义nmcli c del xxx
)
更新2 评论中要求提供一些数据:
- 我尝试了几个密码 - 有特殊字符和没有特殊字符。最后甚至尝试了“password”
- 我让 Android 忘记了所有注册记录
- 甚至让手机彻底重置网络
- journalctl 没有安装在 Slackware 中,但我检查了 /var/log syslog、.../messages 等,没有发现问题迹象。
实际情况:我有这个脚本:
#!/bin/sh
CON_NAME="XXYY"
IF_NAME="wlan0"
case "$1" in
'down')
nmcli c down $CON_NAME
;;
*)
nmcli c down $CON_NAME
nmcli c del $CON_NAME
nmcli c a type wifi ifname $IF_NAME con-name $CON_NAME autoconnect y ssid $CON_NAME
nmcli c m $CON_NAME 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared
#nmcli c m $CON_NAME wifi-sec.key-mgmt wpa-psk
#nmcli c m $CON_NAME wifi-sec.psk SimplePassword
nmcli c up $CON_NAME
;;
如果脚本为./start_ap.sh
,热点运行,可连接,但处于“打开”状态。如果我运行./start_ap.sh down
,热点将被禁用。如果我取消注释末尾附近的两行并将 SimplePassword 放入手机中,我将无法再连接。
更奇怪的是
星期五,我在大学的时候,我问了我的一个学生
- 将他的 Android 9 手机连接到热点(已设置密码),并且连接毫无问题!
- 因为他有笔记本,所以他也尝试从那里连接,但失败了。
因此,这两个案例与我的经验完全相反。
没有解决方案!
考虑到:
- 一些 Android 手机会出现错误,但不是全部(v9 可以运行,v10 和 v11 失败,但每个版本只测试了一部手机),
- 一些笔记本电脑作为客户端时会出现错误,但并非所有笔记本电脑都会出现错误(Windows 客户端出现故障),
- 所有测试均使用(或不使用)相同(简单)密码、同一台笔记本电脑上的热点、使用相同的 Broadcom 芯片进行,
我似乎必须得出这样的结论:
- 这不是直接的硬件问题
- 这不是驱动程序兼容性问题——就驱动程序似乎“驱动”硬件而言。
- 仍有可能存在时间问题,但实际上不是协议问题。
答案1
我们也遇到了这个问题,排查步骤如下:
vi /lib/systemd/system/wpa_supplicant.service
,将-dd
参数添加到wpa_supplicant命令行,并使用刷新配置systemctl daemon-reload && systemctl restart wpa_supplicant
。vi /var/log/syslog
可以看到执行完之后nmcli con up SSID
出现了“Failed to clear default cryptographic keys (ifname=xxx keyidx=n)”等几个提示,说明驱动层无法对wlan网卡ram中存储的密钥进行必要的清理。
我们在 armbian 20.04 系统上遇到了这个问题,同样的硬件在 OpenWRT 19.07 上运行良好。所以这应该是 Linux 内核或驱动程序的问题。
临时解决方案:完全关闭并重新启动(冷启动)设备(这样可以保证WLAN卡内存初始化为干净状态),然后执行nmcli con up SSID
,之后在手机上输入密码就可以正常连接AP了。
彻底解决这个问题可能需要等待Linux内核或者驱动层面的bug修复。
===============================
更新:
我们有两个相同的硬件盒(NanoPi R1)都遇到了这个问题,其中一个盒子安装了 armbian,另一个盒子安装了硬件制造商的官方 Uubntu 20.04。
我们尝试nmcli dev set wlan0 managed no
在两个系统上禁用网络管理器(),然后启动 hostapd 来接管 WLAN 设备(hostapd -dd /etc/hostapd/wlan0_ap.conf
):
- 在 armbian 上,hostapd 无法启动并因 ioctl 错误退出。
- 在盒子厂商提供的ubuntu上,hostapd可以正常启动,完美解决nmcli的密码问题。
进一步观察发现,在盒子厂商提供的ubuntu上,多了一个守护进程,名字叫brcm_patchram_plus
,它的启动命令行是这样的:/bin/brcm_patchram_plus -d --patchram /lib/firmware/ap6212 ....
。我们怀疑这个守护进程就是造成两个系统性能差异的原因。
答案2
您是否尝试过禁用受保护的管理框架? 之后,我开始可以连接到 Android 11 上的 AP:
nmcli c modify $CON_NAME wifi-sec.pmf 1