Apple 曾经在以下位置提供名为 airport 的二进制文件 -
/系统/库/PrivateFrameworks/Apple80211.framework/版本/A/资源/机场
这能够扫描并生成可用 SSID 列表,如下所示。
SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
vodafone20645C -89 6 Y -- RSN(PSK/AES/AES)
vodafone20645C -89 60 Y -- RSN(PSK/AES/AES)
ALCL-HGU -88 1 Y -- RSN(PSK/AES/AES)
SKY69QVQ -84 11 Y -- RSN(PSK/AES/AES)
不幸的是,从 macOS Sonoma 14.4 开始,该工具现已弃用,如果执行,仅显示以下错误消息。
警告:机场命令行工具已弃用,并将在未来版本中删除。 要诊断 Wi-Fi 相关问题,请使用无线诊断应用程序或 wdutil 命令行工具。
不言而喻,所提到的工具都不是合适的替代品。
我在 stackoverflow 上找到了一篇非常有用的文章 -
如何为CoreWLAN pyobjc包装器启用位置服务以获取bssid?
以此为起点并向其添加以下内容 -
for i in networks:
if i.ssid() is None:
continue
print({'SSID_STR': i.ssid(), 'BSSID': i.bssid(), 'RSSI': i.rssiValue(), 'CHANNEL': i.channel()})
我已经能够得到如下结果
{'SSID_STR': 'vodafone20645C', 'BSSID': None, 'RSSI': -89, 'CHANNEL': 6}
{'SSID_STR': 'vodafone20645C', 'BSSID': None, 'RSSI': -89, 'CHANNEL': 60}
{'SSID_STR': 'ALCL-HGU', 'BSSID': None, 'RSSI': -88, 'CHANNEL': 1}
{'SSID_STR': 'SKY69QVQ', 'BSSID': None, 'RSSI': -84, 'CHANNEL': 11}
然而,我是一位经验丰富的 shell 脚本作者,但对 Python 来说却是一个新手,并且希望得到帮助,让这个 Python 输出看起来“完全”像 Apple airport 命令的输出。许多其他现有工具都使用机场命令的输出格式。这将允许使用预期的 python 脚本来替代机场工具。 这将涉及 - 如果可能的话添加其他字段,例如与安全设置相关,特别是将输出格式化为与机场工具以前生成的布局相同的布局。您将注意到机场输出中 SSID 值的右对齐。
我可能觉得已经将上述内容反馈给 shell 脚本,并使用 awk、sed 等来提取满足我自己需求的字段,但是为了生成一个任何人都可以直接使用的解决方案(像我一样)以前依赖机场命令,生成相同格式的输出会更有用。
import CoreWLAN
print(f"{'SSID' : >32} {'BSSID' : <17} {'RSSI' : <4} {'CHANNEL' : <6}")
wifi_interface = CoreWLAN.CWInterface.interface()
networks, error = wifi_interface.scanForNetworksWithName_error_(None, None)
for i in networks:
print(f"{i.ssid() : >32} {i.bssid() or '' : <17} {i.rssiValue() : <4} {i.channel() : <6}")
请注意,f 字符串需要 Python 3.6 或更高版本。
有关如何使用 f 字符串进行对齐的示例,请参阅
https://www.geeksforgeeks.org/string-alignment-in-python-f-string/。 上面使用与机场命令相同的间距,并且应该可以安全地使用这些硬编码值,因为 SSID 不能超过 32 个字符,而 BSSID 始终为 17 个字符。
对于更复杂的表格,我建议使用 pandas 或 Prettytable。
如果您需要任何其他数据,获取起来会更加复杂。首先是检查开发人员文档:
https://developer.apple.com/documentation/corewlan?language=objchttps://stackoverflow.com/a/75843844/648788