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

19

通过WifiManager,我的Android应用可以获取很多关于Wi-Fi的细节。但我无法获取协议类型,比如a/b/g/n。我有客户需求要做到这一点。

有人知道如何实现吗?(我没有使用adb的选项)。它需要以编程方式完成。我坚信设备和路由器在连接前已经协商了协议。因此该信息与设备一起存在。问题是,我们如何获取它?

2个回答

13
你可以从链接速度部分推导协议。

WifiManager.getConnectionInfo().getLinkSpeed()

通过 Wikipedia 802.11 protocols speed 表格,您可以判断它是802.11b、802.11n还是802.11ag。
802.11n802.11ac 的完整链接速度表

协议802.11a和802.11g的链接速度相同,您可以通过扫描结果中使用的频率(5GHz或2.4GHz)来区分它们。

请注意,在连接过程中协议可能会发生变化,客户端和接入点协商协议和速度,但他们会达成一个列表而不是一个特定的速度。

我认为在它们重叠的速度中无法区分802.11n和802.11ac。


1
似乎并非所有设备报告的速度都与维基百科表格相对应,但我还没有找到更好的来源。例如,我的EVO经常显示19、26、39和52 Mbps的速度。但有时它也会显示65 Mbps,这在那个表格上是有的。有什么想法吗? - mike47
没事了 - 那个页面上的进一步阅读显示,在某些情况下,802.11n速度可能会降低10%。这必须适用于EVO,但不适用于我的其他设备。 - mike47
@mikejeep - 我猜他们不想炸掉这个表,新协议802.11n和802.11ac的链接速度有更多的选项。 65Mbps是两者都可以达到的有效速度。 - Ofir Luzon

2
我不相信以一种干净的方式获得这个是可能的。协议 - a、b、g、n等 - 实际上是网络中MAC和物理层的人类抽象。如果它们符合设备和网络设备的某些硬件规格,这些协议就被定义为可识别的字母。
经过一番调查,似乎Windows手机可以显示这些信息。在研究Windows系统如何确定协议时,我发现了桌面版说明以及通过枚举实现的Visual C++实现。看起来,即使是官方的Windows文档也依赖于供应商提供的数据和枚举值,这让我相信他们需要确定硬件规格,超出了Android API可能暴露的范围。
如果你想自己确定协议,你需要了解链路速度以及频率、调制和带宽等参数简而言之 除非你使用的是已经越狱的手机并且能够直接访问硬件规格,否则很可能不可能实现。

Windows 10 似乎也能够解析协议。 - Rob Nicholson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接