NetworkManager 定义了热点,无法从 Android 手机连接

NetworkManager 定义了热点,无法从 Android 手机连接

初始情况很简单:

  • 我在一台机器上创建了一个热点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

我们也遇到了这个问题,排查步骤如下:

  1. vi /lib/systemd/system/wpa_supplicant.service,将-dd参数添加到wpa_supplicant命令行,并使用刷新配置systemctl daemon-reload && systemctl restart wpa_supplicant

  2. 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

相关内容