Python跨平台识别周围WiFi的代码实现与技巧分享
在物联网设备管理、网络安全审计或智能家居场景中,识别周围WiFi网络是基础需求。Python凭借其丰富的生态库,能够跨平台实现WiFi扫描、信号强度检测及网络分析。本文将系统梳理主流方法,结合代码示例与性能对比,帮助开发者快速构建可靠的WiFi识别工具。
一、跨平台基础方案:subprocess调用系统命令
1. Windows系统:netsh命令
Windows原生提供netsh命令集,通过subprocess模块调用可获取详细WiFi信息:
import subprocess
def get_windows_wifi():
# 列出所有可见网络
cmd = 'netsh wlan show networks mode=bssid'
output = subprocess.check_output(cmd, shell=True, encoding='gbk', errors='ignore')
# 解析SSID与信号强度(示例简化版)
networks = []
for line in output.split('\n'):
if 'SSID' in line:
ssid = line.split(':')[1].strip()
elif 'Signal' in line:
signal = line.split(':')[1].strip()
networks.append((ssid, signal))
return networks
print(get_windows_wifi())
输出示例:[('HomeWiFi', '85%'), ('Office_5G', '72%')]
关键点:
- 需管理员权限执行完整扫描
- 使用
mode=bssid显示BSSID(MAC地址) - 信号强度为百分比格式,需转换为dBm(需额外解析)
2. Linux系统:nmcli/iwlist
Linux推荐使用NetworkManager的nmcli工具(需安装):
def get_linux_wifi():
cmd = 'nmcli -t -f SSID,SIGNAL dev wifi list'
output = subprocess.check_output(cmd, shell=True, encoding='utf-8')
return [line.split(':') for line in output.strip().split('\n')]
print(get_linux_wifi())
输出示例:[['HomeWiFi', '85'], ['Office_5G', '72']]
备选方案:
- 传统工具
iwlist:subprocess.check_output(['iwlist', 'wlan0', 'scan']) - 需处理更复杂的输出格式(包含加密类型、信道等)
3. macOS系统:airport命令
macOS隐藏的airport工具位于私有框架中:
def get_macos_wifi():
cmd = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s'
output = subprocess.check_output(cmd, shell=True, encoding='utf-8')
return [line.split()[0:3] for line in output.strip().split('\n')[1:]]
print(get_macos_wifi())
输出示例:[['HomeWiFi', '-65', 'WPA2(PSK)'], ['Office_5G', '-72', 'WPA2(PSK)']]
二、进阶方案:使用专用库
1. pywifi:跨平台抽象层
pywifi封装了不同系统的底层操作,提供统一API:
from pywifi import PyWiFi, const
def scan_with_pywifi():
wifi = PyWiFi()
iface = wifi.interfaces()[0] # 获取第一个无线接口
iface.scan() # 触发扫描
import time
time.sleep(2) # 等待扫描完成
results = iface.scan_results()
return [(r.ssid, r.signal, r.bssid) for r in results]
print(scan_with_pywifi())
输出示例:[('HomeWiFi', -65, '00:1A:2B:3C:4D:5E'), ('Office_5G', -72, '00:1A:2B:3C:4D:5F')]
优势:
- 支持连接管理、配置文件保存等高级功能
- 信号强度为dBm单位,更精准
- 跨平台兼容性最佳
2. Scapy:网络层深度分析
对于需要分析802.11帧的场景(如检测隐藏SSID),可使用Scapy:
from scapy.all import *
def sniff_wifi_packets(interface='wlan0mon'):
def packet_handler(pkt):
if pkt.haslayer(Dot11):
if pkt.type == 0 and pkt.subtype == 4: # Probe Request
print(f"Device {pkt.addr2} probing for {pkt.info.decode('utf-8', errors='ignore') if pkt.info else 'HIDDEN'}")
sniff(iface=interface, prn=packet_handler, count=100)
# 需先切换网卡到监听模式(Linux):
# sudo airmon-ng start wlan0
sniff_wifi_packets()
典型输出:
Device 00:1A:2B:3C:4D:5E probing for HomeWiFi Device 00:1A:2B:3C:4D:5F probing for HIDDEN
三、性能对比与选型建议
| 方案 | 扫描速度 | 精度 | 跨平台 | 依赖项 | 适用场景 |
|---|---|---|---|---|---|
| subprocess+netsh | 中等 | 中等 | 仅Windows | 无 | 快速原型开发 |
| pywifi | 快 | 高 | 是 | 需安装库 | 生产环境应用 |
| Scapy | 慢 | 极高 | 是 | 需监听模式 | 安全研究、协议分析 |
推荐组合:
- 通用场景:
pywifi(开发效率与功能平衡) - 轻量级需求:系统命令+正则解析(减少依赖)
- 深度分析:
Scapy(需配合监听模式网卡)
四、常见问题解决
权限不足:
- Linux/macOS:使用
sudo或配置sudoers免密码 - Windows:以管理员身份运行脚本
无扫描结果:
- 检查无线网卡是否启用:
ifconfig wlan0 up(Linux) - 确认未连接VPN或虚拟网卡干扰
跨平台兼容代码:
import platform
def get_wifi_networks():
system = platform.system()
if system == 'Windows':
return get_windows_wifi()
elif system == 'Linux':
return get_linux_wifi()
elif system == 'Darwin':
return get_macos_wifi()
else:
raise NotImplementedError(f"Unsupported OS: {system}")
五、扩展应用
信号强度热力图:
结合folium库将扫描结果可视化:
import folium
def plot_wifi_heatmap(results):
m = folium.Map(location=[39.9042, 116.4074]) # 北京坐标示例
for ssid, signal, (lat, lon) in results: # 假设已有坐标数据
folium.CircleMarker(
location=[lat, lon],
radius=abs(signal)/10,
color='red',
popup=f"{ssid}: {signal}dBm"
).add_to(m)
m.save('wifi_heatmap.html')
自动连接最强信号:
def connect_strongest(ssid, password):
from pywifi import Profile
profile = Profile()
profile.ssid = ssid
profile.key = password
# 配置加密方式(需根据实际情况调整)
profile.akm.append(const.AKM_TYPE_WPA2PSK)
profile.cipher = const.CIPHER_TYPE_CCMP
wifi = PyWiFi()
iface = wifi.interfaces()[0]
iface.remove_all_network_profiles()
iface.add_network_profile(profile)
iface.connect()
结语
Python通过系统命令调用或专用库,能够高效实现跨平台WiFi识别。对于简单需求,subprocess方案足够轻量;若需生产级稳定性,pywifi是更优选择;而Scapy则适合网络协议层面的深度分析。开发者可根据实际场景灵活组合这些技术,构建从基础扫描到智能连接的完整解决方案。
以上就是Python跨平台识别周围WiFi的代码实现与技巧分享的详细内容,更多关于Python跨平台WiFi识别的资料请关注脚本之家其它相关文章!
相关文章
python3结合openpyxl库实现excel操作的实例代码
这篇文章主要介绍了python3结合openpyxl库实现excel操作的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下2018-09-09


最新评论