通过 WifiManager,我的 Android 应用可以获取很多关于 Wi-Fi 的详细信息。但是我无法获得像 a/b/g/n 这样的协议类型。我有一个客户要求这样做。
有谁知道如何实现这一目标?(我没有使用 adb 的选项)。它将以编程方式完成。我坚信设备和路由器在连接之前已经协商好了协议。因此,该信息与设备一起存在。问题是,我们如何得到它?
通过 WifiManager,我的 Android 应用可以获取很多关于 Wi-Fi 的详细信息。但是我无法获得像 a/b/g/n 这样的协议类型。我有一个客户要求这样做。
有谁知道如何实现这一目标?(我没有使用 adb 的选项)。它将以编程方式完成。我坚信设备和路由器在连接之前已经协商好了协议。因此,该信息与设备一起存在。问题是,我们如何得到它?
您可以从链接速度部分推断出协议
WifiManager.getConnectionInfo().getLinkSpeed()
通过Wikipedia 802.11 协议速度表,您可以判断它是 802.11b、802.11n 还是 802.11ag。
802.11n和802.11ac全链路速度表
协议 802.11a 和 802.11g 的链路速度相同,您可以通过扫描结果中使用的频率(5GHz 或 2.4GHz)来区分它们。
请注意,在连接期间协议可能会发生变化,客户端和接入点确实会协商协议和速度,但它们会在一个列表上达成一致,而不是在一个特定的速度上达成一致。
我认为没有办法区分 802.11n 和 802.11ac 的重叠速度。
我不相信这是有可能以干净的方式获得的。协议——a、b、g、n 等——实际上是网络中 MAC 和物理层的人类抽象。如果它们满足设备和网络设备的某些硬件规范,则将它们定义为可识别的字母。
经过一番挖掘,Windows 手机似乎能够显示此信息。在深入研究在 Windows 上确定协议的方式时,我遇到了桌面解释以及通过 enums 实现的 Visual C++ 实现。似乎即使是官方的 Windows 文档也依赖于供应商提供的数据和枚举值,这让我相信他们需要确定超出Android API中可能公开的硬件规格。
如果您想自己确定协议,则需要了解链路速度以及频率、调制和带宽。
TL;博士
除非您使用的是有根手机并且可以直接访问硬件规格,否则这可能是不可能的。