基于Raspbian系统用Python3实现WiFi断开后自动重连指定网络
解决树莓派指定WiFi自动重连的Python方案
Hey there! Let's work through this WiFi reconnection problem for your Raspberry Pi setup. Since you're running Python 3 scripts, need to target a specific local WiFi (no internet access), and just want periodic reconnection attempts instead of scanning all networks, here are some practical, tested approaches to make this work:
核心思路1:基于系统命令的SSID检查与重连
树莓派自带的wpa_cli工具是管理WiFi连接的利器,我们可以用Python调用它来实现精准的重连逻辑:
步骤拆解
- 检查当前连接状态:用
iwgetid -r命令获取当前连接的SSID,和你的目标SSID对比,判断是否需要重连。 - 触发指定网络重连:先通过
wpa_cli list_networks找到目标WiFi在配置中的ID,然后用select_network选中它再执行reconnect。
示例代码
import subprocess import time # 替换成你的目标WiFi信息 TARGET_SSID = "YourLocalWiFiName" CHECK_INTERVAL = 15 # 每隔15秒检查一次,可自定义 WLAN_INTERFACE = "wlan0" # 你的无线网卡接口,通常是wlan0 def is_connected_to_target(): """检查是否已连接到目标WiFi""" try: # 执行命令获取当前SSID result = subprocess.run( ["iwgetid", "-r"], capture_output=True, text=True, check=True ) current_ssid = result.stdout.strip() return current_ssid == TARGET_SSID except subprocess.CalledProcessError: # 没有连接任何WiFi时会抛出错误 return False def reconnect_to_target(): """重连到指定目标WiFi""" try: # 获取所有已配置的WiFi网络列表 list_output = subprocess.run( ["wpa_cli", "-i", WLAN_INTERFACE, "list_networks"], capture_output=True, text=True, check=True ) # 解析输出,找到目标SSID对应的网络ID for line in list_output.stdout.strip().split("\n")[1:]: parts = line.split() if len(parts) >= 2 and parts[1] == TARGET_SSID: network_id = parts[0] # 选中目标网络并触发重连 subprocess.run( ["wpa_cli", "-i", WLAN_INTERFACE, "select_network", network_id], check=True ) subprocess.run( ["wpa_cli", "-i", WLAN_INTERFACE, "reconnect"], check=True ) print(f"Successfully reconnected to {TARGET_SSID}") return print(f"Error: Target SSID {TARGET_SSID} not found in wpa_supplicant config!") except subprocess.CalledProcessError as e: print(f"Reconnection failed: {str(e)}") if __name__ == "__main__": print(f"Starting WiFi reconnection monitor for {TARGET_SSID}...") while True: if not is_connected_to_target(): print(f"Not connected to {TARGET_SSID}, attempting reconnection...") reconnect_to_target() time.sleep(CHECK_INTERVAL)
核心思路2:基于业务连通性的检查(更贴合你的场景)
因为你的WiFi是用来传输数据到本地服务器的,直接检查和服务器的连通性比单纯查SSID更准确——毕竟SSID连接上不代表能传数据。
实现方式
- 用Python的
socket模块尝试连接本地服务器的指定端口(比如你用来接收数据的端口)。 - 如果连接失败,立即触发重连逻辑。
示例片段
import socket LOCAL_SERVER_IP = "192.168.x.x" # 你的本地服务器IP SERVER_PORT = 8080 # 服务器监听端口 def is_server_reachable(): try: # 尝试建立连接,超时设为2秒 with socket.create_connection((LOCAL_SERVER_IP, SERVER_PORT), timeout=2): return True except (socket.timeout, ConnectionRefusedError): return False # 把这个函数替换到上面主循环的检查逻辑里即可
关键注意事项
- 权限问题:
wpa_cli需要root权限,所以运行脚本时要加sudo,比如sudo python3 wifi_reconnect.py。 - NetworkManager适配:如果你的树莓派用的是带桌面的系统(比如Raspberry Pi OS Desktop),可能用
nmcli更方便,比如用nmcli con show --active查当前连接,nmcli con up id "YourSSID"重连。 - 开机自启:可以把脚本做成systemd服务,让树莓派开机自动运行,确保断电重启后也能自动工作。
- 避免频繁重连:不要把检查间隔设得太短(比如小于5秒),否则可能导致WiFi模块频繁启停,反而不稳定。
内容的提问来源于stack exchange,提问作者Krishnakumar M
相关产品推荐
相关产品推荐

