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

Python获取WiFi路由器MAC地址:现有ARP方法是否可靠?

你的get_wifi_info函数无法可靠获取WiFi路由器MAC地址

你的代码存在几个核心问题,这也是导致你看到MAC地址"变化"的主要原因:

  • ARP表取第一个MAC的逻辑完全不可靠:ARP表存储的是当前局域网内所有和设备通信过的设备MAC,mac_address[0]只是列表里的第一个条目,大概率不是你当前连接的WiFi路由器的MAC,完全是随机取到了其他设备的地址。
  • SSID获取方式健壮性不足:如果iwgetid命令执行失败(比如未连接WiFi、命令输出格式变化),split('"')[1]会直接抛出索引错误。

正确的实现思路

要准确获取当前连接的WiFi路由器MAC,需要先找到路由器的网关IP(也就是WiFi的默认路由IP),再通过ARP表匹配该IP对应的MAC,而不是盲目取第一个条目。以下是适配Raspbian 11的修正代码:

import subprocess
import re
import socket
import struct

def get_wifi_interface():
    # 获取当前连接的WiFi接口(Raspbian下一般是wlan0)
    result = subprocess.run(["iwgetid", "-i"], capture_output=True, text=True)
    if result.returncode != 0:
        return None
    return result.stdout.strip()

def get_gateway_ip(interface):
    # 从/proc/net/route获取指定接口的网关IP
    with open("/proc/net/route") as f:
        for line in f:
            parts = line.strip().split()
            if parts[0] == interface and parts[1] == "00000000":
                # 将十六进制网关IP转换为十进制格式
                gateway_hex = parts[2]
                gateway_ip = socket.inet_ntoa(struct.pack("<L", int(gateway_hex, 16)))
                return gateway_ip
    return None

def get_wifi_info(self):
    # 获取WiFi接口
    interface = get_wifi_interface()
    if not interface:
        raise RuntimeError("未连接到WiFi网络")
    
    # 直接获取SSID(比解析带引号的输出更可靠)
    ssid_result = subprocess.run(["iwgetid", "-r"], capture_output=True, text=True)
    if ssid_result.returncode != 0:
        raise RuntimeError("无法获取SSID")
    ssid = ssid_result.stdout.strip()
    
    # 获取网关IP(即路由器的LAN口IP)
    gateway_ip = get_gateway_ip(interface)
    if not gateway_ip:
        raise RuntimeError("无法获取网关IP")
    
    # 从ARP表查找网关对应的MAC
    arp_output = subprocess.check_output(["/usr/sbin/arp", "-a"]).decode("utf-8")
    gateway_arp_pattern = re.compile(rf"{re.escape(gateway_ip)}.*?(([0-9A-Fa-f]:?){6})")
    match = gateway_arp_pattern.search(arp_output)
    
    # 如果ARP表无缓存,主动ping网关刷新缓存
    if not match:
        subprocess.run(["ping", "-c", "1", gateway_ip], capture_output=True)
        arp_output = subprocess.check_output(["/usr/sbin/arp", "-a"]).decode("utf-8")
        match = gateway_arp_pattern.search(arp_output)
        if not match:
            raise RuntimeError("无法从ARP表获取路由器MAC")
    
    mac_address = match.group(1).upper()
    return ssid, mac_address

额外说明

如果修正后仍然出现MAC地址变化,可能是以下原因:

  1. 路由器启用了LAN口MAC地址随机化(部分高端路由器支持该功能)
  2. 你连接的是双频WiFi(部分路由器的2.4G和5G频段使用不同的MAC地址)

这种情况下需要登录路由器后台确认相关设置。

内容的提问来源于stack exchange,提问作者16ar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:22:25