以编程方式获取Wi-Fi协议(802.11a / b / g / n)

通过WifiManager,我的Android应用程序可以获得很多关于Wi-Fi的细节。 但是我没有得到像a / b / g / n这样的协议types。 我有一个客户要求这样做。

有谁知道如何做到这一点? (我没有select使用adb)。 这是要编程的。 我坚信设备和路由器在可以连接之前已经协商好了协议。 所以这些信息是与设备在一起的。 问题是,我们如何得到它?

Solutions Collecting From Web of "以编程方式获取Wi-Fi协议(802.11a / b / g / n)"

你可以从链接速度中部分推导出协议

WifiManager.getConnectionInfo().getLinkSpeed()

通过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等)实际上是networking中MAC和物理层的人为抽象。 如果它们符合设备和networking设备的某些硬件规范,则将它们定义为可识别的字母。

经过一番挖掘,似乎Windows手机能够显示这些信息 。 在深入研究在Windows上确定协议的方式时,我遇到了桌面解释以及通过枚举实现的Visual C ++实现 。 看来,即使官方的Windows文档依赖于供应商提供的数据和枚举值,这将导致我相信他们需要确定超出Android API中可能公开的硬件规格。

如果您想自己确定协议,则需要了解链路速度以及频率,调制和带宽 。

TL; DR

除非您正在使用固定电话,并且可以直接访问硬件规格,否则可能不可能。