我有一个设备(例如树莓派)运行使用 YOCTO 构建的最小版本的 linux,并且没有可用的网络管理器。在给定时间,文件 /home/root/wpa.conf 中可能存在网络配置,但不保证当配置存在时可以检测到相应的 wifi 网络(设备可以移动)。我想编写一个服务,不断尝试连接到 wifi,并在失败时重试。问题是当找不到 SSID 时 wpa_supplicant 不会退出。
这是我的服务:
[Unit]
After=network.target
[Service]
ExecStart=/home/root/connect_to_wifi.sh
Restart=always # this would be useful if wpa_supplicant exited on fail
StandardOutput=file:/home/root/connect_to_wifi.log
StandardError=file:/home/root/connect_to_wifi_error.log
[Install]
WantedBy=default.target
这是脚本:
#!/bin/bash
ifconfig wlan0 up
udhcpc -i wlan0 -b
wpa_supplicant -i wlan0 -c /home/root/wpa.conf
我省略了 wpa_supplicant 中的 -B,因为运行该命令后服务将退出,从而终止 wpa_supplicant。我尝试在服务中设置 type=forking 但它不起作用。但是,我认为这不是本案的问题。
如何修改我的服务和脚本以便不断尝试连接?
答案1
wpa 请求者不应退出;您对如何“找到”SSID 存在误解:如果您想查找 SSID,则需要等待信标出现。如果您知道 AP 的 SSID 和 BSSID,您可以尝试向 AP 发送注册数据包,但这也必须多次尝试,因为单次响应失败可能是完全正常的 – 这是毕竟是共享介质,而且您不知道接入点的 RF 环境。
所以,你想要实现的实际上是我所知道的几乎所有网络连接管理器的默认可观察行为,只有 systemd 的 NetworkManager 和 wicd、Android 连接管理器、Windows 连接管理器和 iOs 拥有的东西。
所以,说实话,我认为你实际上并没有解决任何尚未解决的问题;每个人都已经提供了“在可用时连接到该网络”。
因此,正确的解决方案是配置网络配置管理器(在树莓派上,很可能是 NetworkManager)来查找该网络 - 就是这样。