一、WLAN与Wi-Fi介绍
1、WLAN简介
WLAN是Wireless Local Area Network的简称,指应用无线通信技术将计算机设备互联起来,构成可以互相通信和实现资源共享的网络体系。无线局域网本质的特点是不再使用通信电缆将计算机与网络连接起来,而是通过无线的方式连接,从而使网络的构建和终端的移动更加灵活。
它是相当便利的数据传输系统,它利用射频(Radio Frequency; RF)的技术,使用电磁波,取代旧式碍手碍脚的双绞铜线(Coaxial)所构成的局域网络,在空中进行通信连接,使得无线局域网络能利用简单的存取架构让用户透过它,达到“信息随身化、便利走天下”的理想境界。
WLAN是工作于2.5GHz或5GHz频段,以无线方式构成的局域网,简称无线局域网。WLAN通信系统作为有线LAN以外的另一种选择一般用在同一座建筑内。
2、Wi-Fi简介
WIFI是一种能够将个人电脑、手持设备等终端以无线方式互相连接的技术。WiFi是一个无线网路通信技术的品牌,由Wi-Fi联盟(Wi-Fi Alliance)所持有。目的是改善基于IEEE 802.11标准的无线网路产品之间的互通性。使用IEEE 802.11系列协议的局域网就成为Wi-Fi。
WiFi 原先是无线保真的缩写,Wi-Fi 的英文全称为wireless fidelity,在无线局域网di范畴是指“无线相容性认证”,实质上是一种商业认证,同时也是一种无线联网技术,以前通过网线连接电脑,而现在则是通过无线电波来连网;常见的就是一个无线路由器,那么在这个无线路由器的电波覆盖的有效范围都可以采用WIFI连接方式进行联网,如果无线路由器连接了一条ADSL线路或者别的上网线路,则又被称为“热点”。
3、Wi-Fi和WLAN的主要区别
【区别一】WIFI包含于WLAN中,发射信号的功率不同,覆盖范围不同。
(1)从包含关系上来说,WIFI是WLAN的一个标准,WIFI包含于WLAN中,属于采用WLAN协议中的一项新技术。
(2)WIFI的覆盖范围则可达300英尺左右(约合90米),WLAN最大(加天线)可以到5KM。
【区别二】覆盖的无线信号范围不同。
(1)WLAN无线上网其实包含WIFI无线上网,WLAN无线上网覆盖范围更宽。
(2)WIFI无线上网比较适合比如智能手机,平板电脑等智能小型数码产品。
4、Wi-Fi的连接方式
AP(Access Point)\STA(Station)
AP\STA包括两种工作模式AP和STA。
AP:也就是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个AP。
STA:站点就是每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。
Wi-Fi Direct
有一种连接方式Wifi 直连(Wifi Direct),也叫 Wi-Fi点对点(P2P),他是 Wifi Display(投屏) 应用的技术基础,它不需要组织局域网环境,在手机两端打开wifi就可以搜索到对方,主机通过注册服务的方式,将自己的IP和端口以参数携带的方式暴露出去,从机通过搜索服务的方式搜索周边的服务,将搜索到的服务进行解析对比取出IP和端口值,从机最终通过socket往这个解析成功的IP和端口发送数据。
Wifi P2P有以下优点:
1、有比蓝牙更远的传输距离。
2、有比蓝牙更快速的数据传输速度,更大的带宽。
3、只需要打开 Wifi 即可,不需要加入任何网络或 AP,即可实现对等点连接通讯。
可实现通过 Wifi 连接,同时使用数据网络的场景,比喻:手机遥控无人机的同时,无人机需要访问远程服务器上传数据。
在WiFi直连(WiFi Direct,也称为peer-to-peer,P2P)中,设备可以不通过AP(Access Point)进行连接。在P2P group中,称为GO(Group Owner)的设备具有像AP一样的功能,其他被称为GC(Group Client)的设备就去连接GO。支持WiFi Direct功能的设备都可以称为GO或GC。在Group Formation阶段,设备会被确定称为GO还是GC。笔者将会后面的博客讨论Group Formation过程。在P2P group中,只会存在一个GO,其他许多的GC去连接这个GO,然后进行通信。
P2P连接时需要STA模式。
5、 Wi-Fi相关术语和概念
IBSS :全称 Independent Basic Service Set ,即独立基本服务集,包含一个及以上 STA 的无线网络,也叫做 ad-hoc 无线网络,无法访问 DS 时使用的模式。
BSS:全称 Basic Service Set ,即基本服务集,由一个 AP 和一个及以上 STA 组成的无线网络。BSS 内所有的 STA 通信都是通过 AP 完成,AP 不仅能连接有线网络,还可以在 STA 和 其它 STA 或 DS 节点之间进行桥接。
ESS:全称 Extended Service Set ,即扩展服务集,同一有线网络连接的、两个及以上的 AP 组成,和一个子网概念类似。
DS:全称 Distribution System ,即分发系统,让不同 BSS 内的 AP 通过 DS 互连,STA 可以从一个 BSS 移动到另一个 BSS 。AP 之间可以是无线互连,也可以是有线互连,通常是使用有线互连。DS 是 BSS 之间进行逻辑连接的基础,让 STA 在 BSS 之间能够实现漫游。
SSID:全称 Service Set Identifier,即用户识别,每个无线AP都应该有一个标示用于用户识别,SSID就是这个用于用户识别的的名字,也就是我们经常说到的wifi名。
BSSID:每一个网络设备都有其用于识别的物理地址,这个东西呢就叫MAC地址,这个东西一般情况下出厂会有一个默认值,可更改,也有其固定的命名格式,也是设备识别的标识符。这个BSSID呢是针对设备说的,对于STA的设备来说,拿到AP接入点的MAC地址就是这个BSSID。
ESSID:是一个比较抽象的概念,它实际上就和ssid相同(本质也是一串字符),只是能如果有好几个无线路由器都叫这个名字,那么我们就相当于把这个ssid扩大了,所以这几个无线路由器共同的这个名字就叫ESSID。(也就是如果在一台路由器上释放的wifi信号叫某个名字如“China_CMCC”,这个名字“China_CMCC”就称为SSID;如果在好几个路由器上都释放了这个wifi信号,那么大家都叫“China_CMCC”,这个时候大家都遵循的这个名字就是ESSID。
MAC:全称Medium/MediaAccess Control,即介质访问控制,数据链路层的一部分。MAC地址烧录在网卡中,由48bit组成的。
Band:频率范围,一般ap可以支持5g或2.4g两个频率范围段的无线信号。
Channel:通道是对频段的进一步划分,处于不同传输信道上面的数据,如果信道覆盖范围没有重叠,那么不会相互干扰。
Cnannel Width:信道宽度,有”20M HZ“、”40M HZ“等,它表示一个Channel片段的宽度。
Wireless Security:无线网络安全性,主要涉及到:WEP、WPA、WPA2、AES等。
Qos:无线网络中的QOS是质量保证,大致的意思是,传输数据的时候,考虑各种因素,以一定的优先级来保证传输的特定要求。
RF Power:发射功率,给定频段范围内,发射机通过天线对空间辐射的能量。
6、Wi-Fi传输协议标准
802.11是IEEE在1997年为无线局域网(Wireless LAN)定义的一个无线网络通信的工业标准。此后这一标准又不断得到补充和完善,形成802.11x的标准系列。802.11x标准是现在无限局域网的主流标准,也是Wi-Fi的技术基础。主要的IEEE802.11x标准如下:
二、Android Wi-Fi架构
如下为Android WIFI架构图:
Wi-Fi Service
Wi-Fi Service在系统Service中运行,这类服务位于 packages/modules/Wifi/service/ 中。Wi-Fi Service通过 HIDL 与 Wi-Fi HAL 进行通信,Wi-Fi 服务有很多种:
-
WifiService(WLAN 服务):用于控制 WLAN 基础架构模式(包括 STA 和 AP)的主要机制。
-
WifiP2pService(WLAN 点对点服务):管理 WLAN 直连模式。
-
WifiAwareService(WLAN 感知服务):管理 WLAN 感知模式。
-
WifiRttService(Wi-Fi RTT 服务):管理 IEEE 802.11mc FTM 功能。
-
WifiScannelService(WLAN 搜索服务):管理WLAN搜索相关功能。
Wi-Fi HAL
Wi-Fi 框架具有三个 Wi-Fi HAL surface,分别由三个不同的接口表示。所有三个接口都有 HIDL 定义,其中两个接口以稳定 AIDL 软件包的形式提供。
-
供应商 HAL:Android 专用命令的 HAL surface。HIDL 文件位于 hardware/interfaces/wifi/1.x 中。
-
客户端 HAL:wpa_supplicant 的 HAL surface。HIDL 文件位于 hardware/interfaces/supplicant/1.x 中,AIDL 文件位于 hardware/interfaces/supplicant/aidl 中。
-
Hostapd HAL:hostapd 的 HAL surface。HIDL 文件位于 hardware/interfaces/hostapd/1.x 中,AIDL 文件位于 hardware/interfaces/hostapd/aidl 中。
供应商 HAL
供应商 HAL 提供 Android 专用命令。对于基础架构 Station (STA) 和 Soft AP (SAP) 模式的正常运行而言,供应商 HAL 是可选的(不是必需的)。不过,对于 Wi-Fi 感知和 Wi-Fi RTT 服务而言,供应商 HAL 是必要 HAL。
在 HIDL 之前(即 Android 8.0 版本之前),Android 使用的是现在称为“旧版 HAL”的 HAL 机制。Android 源代码目前使用在旧版 HAL 之上运行的 shim 来提供 HIDL 默认实现。
旧版 HAL 标头位于 hardware/libhardware_legacy/include/hardware_legacy/ 中。基于旧版 HAL 的实现位于 hardware/interfaces/wifi/1.x/default 中。
客户端 HAL
客户端 HAL 为 wpa_supplicant 守护程序提供接口。从 Android 13 开始,该接口使用 AIDL 进行 HAL 定义。对于 Android 13 之前的版本,接口和供应商分区均使用 HIDL。
wpa_supplicant 源代码位于 external/wpa_supplicant_8/wpa_supplicant 中。参考实现提供了一个 AIDL 接口,该接口在 aidl 子目录中实现。
Hostapd HAL
Hostapd HAL 为 hostapd 守护程序提供接口。 从 Android 13 开始,该接口使用 AIDL 进行 HAL 定义。对于 Android 13 之前的版本,接口和供应商分区均使用 HIDL。
hostapd 源代码位于 external/wpa_supplicant_8/hostapd 中。 参考实现提供了一个 AIDL 接口,该接口在 aidl 子目录中实现。
Wi-Fi Driver
无线驱动接口 wext 和 nl80211
linux无线驱动接口有两种标准接口,wext(Wireless Extensions无线扩展接口)和nl80211接口。
在linux-2.6.18版本之前,linux内核代码中并没有提供无线驱动接口以及无线驱动协议栈。wext是由开发者Jean Tourrilhes (惠普实验室软件工程师)定义的一套供用户层软件访问无线驱动以及驱动事件通知用户层的接口。当时无线驱动的协议栈软件比较多,如开源项目hostap,madwifi,mac80211,ieee80211协议栈以及无线芯片厂商自己实现的协议栈,基本都使用wext接口。wext接口也逐渐成为一套标准的接口。在linux-2.6.18版本,wext和mac80211协议栈并入内核,成为linux kernel的一部分。wext接口随着802.11协议从802.11,802.11b,802.11a/g的发展,其API也不断增加,伴随着就是其wext的版本号不断变化。
wext 的接口实现上,应用层采用 ioctl方式 访问驱动,设置无线参数或者获取无线参数,配置无线驱动进行联网操作。无线驱动事件到应用层的传递采用的 netlink socket 技术,一种 netlink route 消息技术。这也是很多其他类型的驱动标准的实现方法。但在linux-2.6.25(记得不是很清楚了,懒得确定了)之后,wext API接口版本停止在V22就不再进行更新了。而替代其的是nl80211接口。
nl80211 接口其实在linux-2.6.18并入wext 和 mac80211 协议栈的时候已经提供,但当时的功能还不完整,而且应用层的软件还是都使用WEXT接口,驱动基本不使用 nl80211 接口实现(除了基于 mac80211 协议栈的驱动)。 nl80211 接口是由开发者Johannes Berg实现的,他也是 cfg80211(无线协议栈配置接口,在无线驱动接口和 mac80211 之间的接口)和 mac80211 的维护者。无论是用户层访问驱动还是驱动事件通知应用层,nl80211 接口都采用的netlink技术。
nl80211 接口逐渐替代wext接口的原因主要是使用 netlink 技术在应用层和内核层数据交换上相比ioctl方式具有优势,而且很多其他之前使用ioctl的驱动也逐渐采用了netlink方式。再一个原因就是802.11协议的发展,随着802.11n协议以及P2P,WPS无线规范的加入,协议的很多功能可以在应用层实现,增加了很多应用层与驱动层间的API接口和事件。WEXT接口不方便功能扩展的缺点,nl80211可以完全支持wext的所有功能,又可以在不修改内核的情况下增加命令字和事件。无线驱动接口从wext发展到nl80211也就顺理成章。
目前linux内核中无线驱动的实现大部分基于mac80211协议栈,无线驱动接口也是可选的,可以使用任意一种,也可以同时使用。wpa_supplicant 编译时,则根据无线驱动的接口使用情况,确定采用哪种配置接口。
nl80211 除了确定应用层和驱动层的交互标准外,对802.11协议的实现功能划分产生影响。目前通常的802.11 SME功能(无线服务管理实体,即协议栈功能)在驱动或者芯片固件中实现,nl802.11的作者希望在应用层实现更多的协议功能。wpa_supplicant(包括hostapd) 除了实现WPA认证,P2P,WPS的大部分功能外,它还实现了SME功能,在这种功能划分模式下,无线驱动基本上只需要实现配置硬件和数据收发功能。
linux系统下wpa_supplicant 的 Driver Event 模块和Driver I/F模块(这两者实现是在一个文件,初始化在一个函数,划分成两个模块只是设计理解更清晰)的分析也分 wext 部分和 nl80211 部分。
三、Wi-Fi 并发
Wi-Fi 多接口并发
不同的 Android 设备可以并行支持不同的 WLAN 接口组合。受支持的组合在 HAL 中定义,并提供给框架。对于 Wi-Fi HAL 1.5 及更低版本,规范格式在 android/hardware/interfaces/wifi/1.0/IWifiChip.hal 中定义;对于 Wi-Fi HAL 1.6 及更高版本,规范格式在 android/hardware/interfaces/wifi/1.6/IWifiChip.hal 中定义。Wi-Fi HAL 版本 1.6(在 Android 13 中提供)添加了将桥接 AP 接口(双频同步)指定为显式组合项的功能。
并发规范格式非常灵活,且是通用格式。它可以表示框架尚不支持的组合。如需配置特定组合,请使用位于 device/<oem>/<device>/BoardConfig-common.mk 的 WIFI_HAL_INTERFACE_COMBINATIONS 构建标记。
例如,一台设备可以支持两个 STA 和一个 NAN(Wi-Fi 感知)类型或点对点(Wi-Fi 直连)类型的接口(但不能同时支持这两种接口)。这在 device/<oem>/<device>/BoardConfig-common.mk 中表示为:
WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 2}, {{NAN, P2P}, 1}}
再举一例,一台设备可以支持具有单个 AP 的 STA 或没有其他接口的桥接 AP(双频同步)。其表示方式如下:
WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 1}, {{AP}, 1}}, {{{AP_BRIDGED}, 1}}
WLAN STA/AP 并发
Android 9 引入了可让设备同时在 STA 和 AP 模式下运行的功能。对于支持双频并发 (DBS) 的设备,此功能让一些新功能得以实现,例如在用户想要启用热点 (softAP) 时不会中断 STA WLAN。
默认的 AOSP Android 框架代码支持 Wi-Fi STA/AP 并发。WLAN HAL 中介绍的参考 HAL 实现也支持 WLAN STA/AP 并发。下文“实现”部分中介绍的 WIFI_HIDL_FEATURE_DUAL_INTERFACE 构建时标志会启用接口并发规范,表明支持 STA 和 AP 并发。
要在设备上实现 WLAN STA/AP 并发,请执行以下操作:
-
开启一个构建时标志,以便在 HAL 中启用对两个接口的支持。该标志位于 device/<oem>/<device>/BoardConfig-common.mk 中。
-
WIFI_HIDL_FEATURE_DUAL_INTERFACE := true
-
-
显示两个网络接口:
-
wlan0 和 wlan1
-
如需验证该功能是否按预期运行,需要运行一项集成测试 (ACTS) 和一项手动测试。
ACTS 文件 WifiStaApConcurrencyTest.py (位于 tools/test/connectivity/acts_tests/tests/google/wifi 中)包含一组测试,这些测试提供了 STA 和 AP 的不同组合。
要手动验证此功能,请从界面中单独开启和关闭 STA 和 AP 接口。
如果 AP 和 STA 位于同一子网上,则被测设备 (DUT) 上可能会出现路由问题。为避免冲突,请尝试将 AP 移动到其他子网。
如果 STA 和 AP 位于同一频段但却在不同的频道上,则一些 WLAN 芯片供应商会将无线置于分时共享模式。这种做法会导致性能急剧下降。为了解决此问题,芯片可以使用 Channel Switch Avoidance (CSA) 以便:
-
将 AP 移动到 STA 所在的频道
-
或将 AP 移到非 STA 所在的频段
Wi-Fi STA/STA 并发
Android 12 引入了 Wi-Fi STA/STA 并发功能,使设备可同时连接到两个 Wi-Fi 网络。此可选功能支持以下功能。
-
Make-before-break:设备会在断开现有连接之前连接到新的 Wi-Fi 网络。这使得 Wi-Fi 网络之间的切换更加顺畅
-
并发仅本地和互联网连接:设备会连接到仅限本地的网络,而不中断设备的主要互联网提供连接。
-
并发受限和互联网连接:设备会连接到受限网络(仅适用于某些特权应用),而不会中断设备的主要互联网连接。
-
(Android 13 或更高版本)具有互联网连接的多个并发网络:设备连接到两个不受限制的网络,这两个网络对所有应用均可用,并提供互联网连接。
设备必须满足以下要求才能实现 Wi-Fi STA/STA 并发:
-
Wi-Fi 芯片或固件必须支持两个并发 STA 连接。固件必须支持两个连接的所有信道和频段组合。为避免出现性能问题,我们建议使用支持 2x2+2x2 DBS 的 Wi-Fi 芯片。
-
设备必须支持供应商 HAL 1.5 版本中的以下 API
-
IWifiChip.setMultiStaPrimaryConnection()
-
IWifiChip.setMultiStaUseCase()
-
-
HAL Wi-Fi 接口组合必须使用规范格式(如 [{STA} <= 2, ...] )公开的两个并发 STA 接口。
Wi-Fi AP/AP 并发
Android 12 引入了 Wi-Fi AP/AP 并发功能,允许设备创建两个接入点 (AP) 接口。借助此功能,设备可以通过双频同步 (DBS) Wi-Fi 热点(软 AP)支持网络共享。
如果 Wi-Fi AP/AP 并发受支持,设备可以创建两个 AP 接口,例如,一个接口用于 2.4 GHz 频段,另一个接口用于 5 GHz 频段。之后,客户端可以连接到每个 AP 接口。
Wi-Fi HAL 生成具有两个 AP 接口的单个桥接接口,并在堆栈启用软 AP 后将其公开给 Wi-Fi 和连接堆栈。启用软 AP 后,Wi-Fi HAL 会指明两个接口可用,并为每个 AP 更新信息(如操作通道、带宽和 BSSID)。
为了节省电量,框架会在处于非活动状态一段时间后停用未使用的 AP(2.4 GHz、5 GHz 或 6 GHz)。如果未连接客户端,框架会将 AP 视为非活动状态。
设备通过使用以下某个桥接软 AP 配置来支持 Wi-Fi AP/AP 并发功能:
-
配置两个频段(框架或驱动程序会自动选择相应通道)
-
在双频 AP 上配置两个通道
如需实现 Wi-Fi AP/AP 并发,设备必须满足以下要求:
-
Wi-Fi 芯片或固件必须支持两个并发 AP 连接。固件必须支持两个连接的所有信道和频段组合。为避免出现性能问题,我们建议使用支持 2x2+2x2 DBS 的 Wi-Fi 芯片。
-
设备必须支持供应商 HAL 1.5 版本中的以下方法:
-
IWifiChip.createBridgedApIface()
-
IWifiChip.removeIfaceInstanceFromBridgedApIface()
-
IWifiApIface.resetToFactoryMacAddress()
-
IWifiApIface.getBridgedInstances()
-
如需实现 Wi-Fi AP/AP 并发,请执行以下操作:
-
使用运行时资源叠加层启用以下至少一个函数(默认情况下处于停用状态):
-
config_wifiBridgedSoftApSupported :支持多个桥接 AP。
-
config_wifiStaWithBridgedSoftApConcurrencySupported :支持一个站点 (STA) 和多个桥接 AP 的并发。
-
-
对于使用 Wi-Fi HAL 1.6(适用于 Android 13 及更高版本)的设备,请在 Wi-Fi HAL 接口组合中定义 AP_BRIDGED 。
-
通过调用以下方法之一来配置桥接软 AP 配置:
-
SoftApConfiguration.Builder#setBands
-
SoftApConfiguration.Builder#setChannels
-
-
使用 WifiManager#registerSoftApCallback 注册回调以获取设备功能。 SoftApCallback 回调为桥接软 AP 配置提供了以下方法:
-
SoftApCallback#onInfoChanged :提供有关正在运行的软 AP 实例的信息。
-
SoftApCallback#onConnectedClientsChanged :为软 AP 实例提供连接的客户端列表。
-
四、WLAN 直连
WLAN 直连功能又称“Wi-Fi 点对点”,它允许支持设备直接使用 WLAN 直连协议发现其他设备并与之互连,无需连接到互联网或移动网络。此功能是基于 Wi-Fi 联盟 (WFA) Wi-Fi 直连规范构建的,它支持在断开网络的情况下,在可信设备和应用之间共享高吞吐量数据。
要使用此功能,设备制造商必须实现在 Android 开源项目 (AOSP) 中提供的 WLAN 硬件接口设计语言 (HIDL)。HIDL 取代了之前使用的硬件抽象层 (HAL) 结构,以便通过指定收集到接口和软件包的类型和方法调用来简化实现流程。
以下是采用 Wi-Fi 直连功能所需的 Wi-Fi HAL 表面:+ hardware/interfaces/wifi/1.3 或更高版本 + hardware/interfaces/wifi/supplicant/1.2 或更高版本
设备制造商需要提供框架和 HAL/固件支持:
-
框架:
-
AOSP 代码
-
启用 WLAN 直连:需要功能标记
-
-
WLAN 直连(点对点)HAL 支持(意味着固件支持)
为实现此功能,设备制造商需要实现 Wi-Fi HIDL,还要为 Wi-Fi 直连启用功能标记。在位于 device/<oem>/<device> 的 device.mk 中,修改 PRODUCT_COPY_FILES 环境变量,以便支持 Wi-Fi 直连功能:
PRODUCT_COPY_FILES +=
frameworks/native/data/etc/android.hardware.wifi.direct.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.direct.xml
Android 要求 WLAN 直连设备地址和接口地址是随机分配的。它们必须不同于设备的真实 MAC 地址,并且必须满足以下要求:
-
如果没有保存任何永久性群组,则 WLAN 直连设备地址必须是在创建接口时随机分配的;否则设备地址必须继续使用最后生成的 MAC 地址。
-
每次建立连接时,Wi-Fi 直连接口地址(也称为群组地址)必须是随机分配的。
Wi-Fi 直连随机分配 MAC 地址是在“wpa_supplicant”中实现的,并由两项配置控制: p2p_device_random_mac_addr 和 p2p_interface_random_mac_addr 。
为启用此功能,设备制造商必须:+ 实现 hardware/interface/wifi/supplicant/1.2 中的 Wi-Fi 客户端 HIDL API ISupplicantP2pIface::setMacRandomization 。
-
在设备自定义叠加层中将 config_wifi_p2p_mac_randomization_supported 设置为“true”。