我希望 Windows Wi-Fi 客户端检测无线连接计量连接。我发现802.11协议支持供应商特定信息元素 (IE). 这些 IE 被注入到信标和探测响应无线帧中。
我发现微软定义了自己的特定于供应商的 IE,以通知客户端有关通过 Wi-Fi 进行计量连接的信息(网络成本要素)和我的接入点的hostapd支持特定于供应商的功能。
根据(网络成本要素hostapd
),我在我的OpenWRT路由器上添加了特定于供应商的字段:
0xDD (Vendor-specific record)
0x08 (Record length : 8 bytes)
0x00 0x50 0xF2 (Vendor: Microsoft)
0x11 (OUI Type: Network Cost)
0x00 0x00 0x00 0x02 (Portable Hotspot Default: Metered network; limit unknown or not yet reached; matches Windows default for mobile broadband connections.)
openwrt上的hostapd命令:
ubus call hostapd.wlan24 set_vendor_elements '{"vendor_elements": "dd080050f21100000002"}'
ubus call hostapd.wlan24 update_beacon
使用通讯视窗,我捕获了无线流量,发现探测响应和灯塔帧中有我提供给 hostapd 的数据(最后 10 个字节)。
0x0000 80 00 00 00 FF FF FF FF-FF FF XX XX XX XX XX XX €...ÿÿÿÿÿÿXXXXXX
0x0010 EC 41 18 50 A7 35 00 8E-99 81 50 23 98 00 00 00 ìA.P§5.Ž™.P#˜...
0x0020 64 00 31 04 00 1B YY YY-YY YY YY YY YY YY YY YY d.1...YYYYYYYYYY
0x0030 YY YY YY YY YY YY YY YY-YY YY YY YY YY YY YY YY YYYYYYYYYYYYYYYY
0x0040 XX 01 08 82 84 8B 96 0C-12 18 24 03 01 0B 05 04 Y..‚„‹–...$.....
0x0050 00 02 00 00 2A 01 00 32-04 30 48 60 6C 30 14 01 ....*..2.0H`l0..
0x0060 00 00 0F AC 04 01 00 00-0F AC 04 01 00 00 0F AC ...¬.....¬.....¬
0x0070 02 0C 00 0B 05 04 00 08-00 00 3B 02 51 00 2D 1A ..........;.Q.-.
0x0080 EC 01 17 FF FF 00 00 00-00 00 00 00 00 00 00 01 ì..ÿÿ...........
0x0090 00 00 00 00 00 00 00 00-00 00 3D 16 0B 00 04 00 ..........=.....
0x00A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0x00B0 00 00 7F 08 04 00 00 00-00 00 01 40 DD 18 00 50 ...........@Ý..P
0x00C0 F2 02 01 01 01 00 03 A4-00 00 27 A4 00 00 42 43 ò......¤..'¤..BC
0x00D0 5E 00 62 32 2F 00 DD 08-00 50 F2 11 00 00 00 02 ^.b2/.Ý..Pò.....
我连接到此 AP 并使用 Windows PC 上的 MS Powershell 检查连接是否计量:
[void][Windows.Networking.Connectivity.NetworkInformation, Windows, ContentType = WindowsRuntime]
[Windows.Networking.Connectivity.NetworkInformation]::GetInternetConnectionProfile().GetConnectionCost()
并得到回应
ApproachingDataLimit : False
NetworkCostType : Unrestricted
OverDataLimit : False
Roaming : False
BackgroundDataUsageRestricted : False
其中NetworkCostType
是Unrestricted
或 而Unknown
不是 预期Fixed
。
当我在 Windows PC 上手动将此连接设置为计量时,powershell 说NetworkCostType : Fixed
一段时间后,我发现另一个 AP(不是我的,隐藏的)正在广播信标。在这些信标中,我发现相同的供应商特定扩展的长度0x11
为Microsoft
16 字节,并且
DD 10 00 50 F2 11 | 01 10 02 28 2C 30 00 00 00 01 00 00
or
DD 10 00 50 F2 11 | 01 10 02 28 2C 30 00 00 00 00 00 00 (deffers 3rd byte from the end)
0x0000 80 00 00 00 FF FF FF FF-FF FF 62 45 BD 07 36 9A €...ÿÿÿÿÿÿbE½.6š
0x0010 62 45 BD 07 36 9A 80 71-87 80 70 00 00 00 00 00 bE½.6š€q‡€p.....
0x0020 64 00 31 C6 00 00 DD 10-00 50 F2 11 01 10 02 28 d.1Æ..Ý..Pò....(
0x0030 2C 30 00 00 00 01 00 00- ,0......
---
0x0000 80 00 00 00 FF FF FF FF-FF FF 62 45 BD 07 36 9A €...ÿÿÿÿÿÿbE½.6š
0x0010 62 45 BD 07 36 9A D0 B4-16 FE 38 03 00 00 00 00 bE½.6šÐ´.þ8.....
0x0020 64 00 31 C6 00 00 DD 10-00 50 F2 11 01 10 02 28 d.1Æ..Ý..Pò....(
0x0030 2C 30 00 00 00 00 00 00- ,0......
我发现OUI 0x11
是Vendor 0x00 0x50 0xF2
一样的 - 也许 MS Docs 错了?我在我的接入点上尝试了同样的方法,结果是一样的 - 数据在无线帧中,但 Windows 10 不会将连接设置为计量的。
有什么帮助吗?也许我哪里犯了错误?也许它依赖于无线驱动程序?也许 MS 有文档,但没有在桌面系统中实现它?
手动设置Metered connection
不是我想要解决这个问题的方法。
答案1
成本水平:
00 Unknown
- 连接费用未知。01 Unrestricted
- 连接不受限制,且使用限制不受限制。02 Fixed
- 使用量计入用户已支付(或同意支付)的固定数据配额。04 Variable
- 连接成本按每个字节计算。
成本标志:
00 Unknown
- 用途未知或不受限制。01 Over Data Limit
- 使用量超出了计量网络的数据限制;可能适用不同的网络费用或条件。02 Congested
- 网络运营商正在经历或预计会出现高负载。04 Roaming
- 网络共享连接在提供商的家庭网络或附属网络之外漫游。08 Approaching Data Limit
- 使用量接近计量网络的数据限制;一旦达到限制,可能会适用不同的网络费用或条件。
- 似乎当您手动触发开关时
Metered connection
,Windows 会忽略 802.11 IE,直到您忘记网络(或可能不会)。
对于 OpenWRT 接入点我的史诗问题导致 4 条命令
uci add_list wireless.radio0.hostapd_options='vendor_elements=DD080050F21102000200'
uci add_list wireless.radio1.hostapd_options='vendor_elements=DD080050F21102000200'
uci commit
reboot
我已经Fixed
用标志添加了成本级别Congested
。不知道拥堵是否会产生影响。
hostapd_options
是 /etc/config/wireless (或uci radio?.hostapd_options
)中未记录的参数,但它自 2017 年起就存在