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地址变化,可能是以下原因:
- 路由器启用了LAN口MAC地址随机化(部分高端路由器支持该功能)
- 你连接的是双频WiFi(部分路由器的2.4G和5G频段使用不同的MAC地址)
这种情况下需要登录路由器后台确认相关设置。
内容的提问来源于stack exchange,提问作者16ar
相关产品推荐
相关产品推荐

