协助使用 Pyobjc 和 CoreWLAN 提取字段和格式化

问题描述 投票:0回答:1

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 等来提取满足我自己需求的字段,但是为了生成一个任何人都可以直接使用的解决方案(像我一样)以前依赖机场命令,生成相同格式的输出会更有用。

macos pyobjc corewlan
1个回答
0
投票

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=objc

此外,如果您需要 BSSID,您可以查看我对您提到的问题的回答,了解如何通过启用 Python 的位置权限来使其工作:

https://stackoverflow.com/a/75843844/648788

© www.soinside.com 2019 - 2024. All rights reserved.