You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:37:56