wpa-supplicant application

无线热点

路由器能够建立无线热点(即AP模式,Access Point Mode),供手机或PC等无线设备上网。无线热点支持IEEE 802.11 b/g/n 标准可以同时有两个频率选择:2.4GHz 和 5GHz。

2.4GHz 工作频段范围:2.4GHz ~ 2.4835GHz,共划分14个信道(但第14信道一般不用),每个信道频宽20MHz,其特点表现为频率低、波长(0.125m)长,传输距离远(覆盖范围大),但是传输速度慢。

5GHz 工作频段范围:5.170GHz ~ 5.850GHz,大约有个45个信道,其中38、46、151、159信道频宽为40MHz,其余信道频宽均为20MHz,其特点表现为频率高、波长(0.052m)短,传输距离短(覆盖范围小),但传输速度快。

无线热点的基本信息:

  • 网络名称(SSID)
    SSID不能唯一的表示一个无线热点,即多个无线热点能设置相同的SSID。
    SSID设置广播模式后,其他设置才能搜索到该SSID,否则该SSID被隐藏,只能通过手动输入SSID进行连接。

  • 安全模式
    路由器中安全模式能设置无线热点的加密类型:OPEN、WPA2(AES)-PSK、WPA-PSK/WPA2-PSK

  • 加密类型

    OPEN:开放式认证,任何人都可以连接并使用无线网络。

    WEB:共享秘钥认证依赖于 WEB (Wired Equivalent Privacy,有线等效加密),使用RC4算法,秘钥分为64 bit 和 128 bit,且通信双方使用相同的秘钥。

    WPA:采用TKIP(Temporal Key Integrity Protocol,临时秘钥完整性协议)来为每一个MAC帧生成不同的Key,以替代WEB。WPA有两种模式:企业模式(WPA-EAP)和 个人模式(WPA-PSK)。

    WPA2:RSN被WFA组织成为WPA2,采用了CCMP加密方式。

    WPA3:新一代Wi-Fi加密协议,用于替代WPA2。

  • 密码(PSK)
    密码的有无取决于安全模式。若安全模式为 OPEN,则密码为空;若安全模式为其他类型,则密码不为空。

信道

信道也称作通道(Channel)、频段,是以无线信号(电磁波)作为传输载体的数据信号传送通道。

IEEE 802.11 为ISM(免执照)频段中的低功率 Wi-Fi定义了 14 个信道。不管是802.11b/g还是802.11a/b/g/n/ac一般都支持 13 个信道。它们的中心频率虽然不同,但是因为都占据一定的频率范围,所以会有一些相互重叠的情况。

2.4GHz频带的信道划分14个信道(2412 MHz ~ 2484 MHz),但第14信道一般不用,每个信道的有效宽度是 20MHz,另外还有2MHz的强制隔离频带。2.4G WiFi信道分布图可以看到信道之间会彼此重叠,从而容易造成WiFi干扰,但1、6、11信道除外,这三个信道没有重叠部分,故路由器一般将这三个信道作为默认的信道来使用。

信道 频宽(MHz) 中心频率(MHz)
1 20 2412
2 20 2417
3 20 2422
4 20 2427
5 20 2432
6 20 2437
7 20 2442
8 20 2447
9 20 2452
10 20 2457
11 20 2462
12 20 2467
13 20 2472
14 20 2484

2.4G

注意:

WPA_SUPPLICANT

wap_supplicant是什么?

wpa_supplicant 是适用于 Linux、BSD、Mac OS X 和 Windows 的 WPA Supplicant,支持 WPA、WPA2(IEEE 802.11i / RSN)和 WPA3。它适用于台式机/笔记本电脑和嵌入式系统。Supplicant 是客户端站中使用的 IEEE 802.1X/WPA 组件。它与 WPA Authenticator 实现密钥协商,并控制 wlan 驱动程序的漫游和 IEEE 802.11 身份验证/关联。

获取wpa_supplicant仓库代码:git clone git://w1.fi/hostap.git

wpa_supplicant 被设计为在后台运行的“守护进程”程序,并充当控制无线连接的后端组件。wpa_supplicant 支持单独的前端程序,wpa_supplicant 包含基于命令行的前端 (wpa_cli) 和 GUI (wpa_gui)。

wpa_supplicant应用主要包括程序:

  • wpa_supplicant守护程序
  • wpa_cli客户端程序
  • wpa_passphrase密码工具程序

wpa_supplicant的运行方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf

# -B: 在后台运行
# -i: 接口
# -c: 配置文件
# -D: 驱动(可多选),可选项:
# nl80211 = Linux nl80211/cfg80211
# wext = Linux wireless extensions (generic)
# wired = Wired Ethernet driver
# macsec_linux = MACsec Ethernet driver for Linux
# none = no driver (RADIUS server/WPS ER)
# -f: 日志文件输出位置
# -P: pid文件输出位置

注意事项:

dbus-daemon需要知道如何转发消息,/etc/dbus-1/system.d存放各个app的dbus服务接口配置,dbus-daemon启动时会遍历加载目录中的所有配置,加载分发情况。若没有配置服务,某个app注册自身服务名时,会报错:Connection “:1.6” is not allowed to own the service “org.bluez” due to security policies in the configuration file。

默认配置文件路径:/etc/dbus-1/system.d/wpa_supplicant.conf,该文件的详细信息如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE busconfig PUBLIC
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>

<allow send_destination="fi.w1.wpa_supplicant1"/>
<allow send_interface="fi.w1.wpa_supplicant1"/>
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>
<policy context="default">
<deny own="fi.w1.wpa_supplicant1"/>
<deny send_destination="fi.w1.wpa_supplicant1"/>
<deny receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>
</busconfig>

wpa_supplicant结构图:

image-20241016170128847

配置文件

wpa_supplicant.conf 作为 wpa_supplicant 应用程序的配置文件,可以持久化保存一些信息。而配置文件的默认保存路径是:/etc/wpa_supplicant/wpa_supplicant.conf

wpa_supplicant.conf 可以设置哪些配置?

  • 指定wpa_supplicant控制接口
  • 是否允许配置文件更新
  • 默认网络配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 必须为wpa_supplicant指定一个控制接口,并且必须赋予它更新配置的权限
ctrl_interface=/var/run/wpa_supplicant
update_config=1

network={
ssid="ZTE_AP_2.4G"
scan_ssid=1
psk="zte2015"
priority=1
disabled=1
}

network={
ssid="ZTE_5GCPE_F876"
scan_ssid=1
key_mgmt=NONE
priority=2
}

接口

从通信层次上划分:

  • 上行接口:wpa_supplicant提供向上的控制接口 control interface,用于与其他模块(如UI)进行通信,其他模块可以通过control interface 来获取信息或下发命令。

  • 下行接口:wpa_supplicant通过socket通信机制实现下行接口,与内核(驱动程序)进行通信,获取信息或下发命令。

其中wpa_supplicant的上行接口的实现方式:

  • 基于传统dbus机制实现与其他进程间的IPC通信
  • 通过Unix domain socket机制实现进程间的IPC通信

wpa_supplicant提供的D-Bus API接口,通过执行命令:wpa_supplicant -h,其结果中有 -u 选项就是使能D-Bus控制接口。

另外我通过 dbus-send 工具执行查询dbus服务(命令如下所示),其结果中发现有这么一个服务:fi.w1.wpa_supplicant1

1
dbus-send --system --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames

借助D-Bus图形工具 D-Feet 可以查看到更具体的信息:

image-20241016211846477

dbus for wpa_supplicant接口

wpa_supplicant dbus api 文档涉及到各个不同接口:

  • fi.w1.wpa_supplicant1
  • fi.w1.wpa_supplicant1.Interface
  • fi.w1.wpa_supplicant1.Interface.WPS
  • fi.w1.wpa_supplicant1.Interface.P2PDevice
  • fi.w1.wpa_supplicant1.BSS
  • fi.w1.wpa_supplicant1.Network
  • fi.w1.wpa_supplicant1.Peer
  • fi.w1.wpa_supplicant1.Group
  • fi.w1.wpa_supplicant1.PersistentGroup

fi.w1.wpa_supplicant1

由在总线中注册名为 fi.w1.wpa_supplicant1 的主 wpa_supplicant D-Bus 对象实现的接口。

接口介绍:

1
2
3
:Service: fi.w1.wpa_supplicant1
:Interface: fi.w1.wpa_supplicant1
:Object path: /fi/w1/wpa_supplicant1

方法介绍:

方法名称 功能
CreateInterface ( a{sv} : args ) –> o : interface 在 wpa_supplicant 中注册一个无线接口。
RemoveInterface ( o : interface ) –> nothing 从 wpa_supplicant 取消注册无线接口。
GetInterface ( s : ifname ) –> o : interface 返回与 wpa_supplicant 已控制的接口相关的对象的 D-Bus 路径。

属性介绍:

属性名称 权限 说明
string DebugLevel [readwrite] 全局 wpa_supplicant 调试级别。
bool DebugTimestamp [readwrite] 确定时间戳是否显示在调试日志中(全局参数)。
bool DebugShowKeys [readwrite] 确定键名是否显示在调试日志中。
array{object} Interfaces [read] 一个包含指向 D-Bus 对象路径的数组,每个对象代表受控的接口。
array{string} EapMethods [read] 包含受支持的 EAP 方法名称的数组。
array{string} Capabilities [read] 具有支持功能的阵列
array{byte} WFDIEs [readwrite] Wi-Fi 显示子元素。

信号介绍:

信号名称 功能
InterfaceAdded ( o : interface, a{sv} : properties ) 新增接口
InterfaceRemoved ( o : interface ) 移除接口
PropertiesChanged ( a{sv} : properties ) 属性变化

fi.w1.wpa_supplicant1.Interface

由添加到 wpa_supplicant 的网络接口相关对象实现的接口,即由 fi.w1.wpa_supplicant1.CreateInterface 返回的接口。

接口介绍:

1
2
3
:Service: fi.w1.wpa_supplicant1
:Interface: fi.w1.wpa_supplicant1.Interface
:Object path: /fi/w1/wpa_supplicant1/Interfaces/index (index is 0、1、2 ...)

方法介绍:

方法名称 功能
Scan ( a{sv} : args ) –> nothing 触发扫描
Disconnect ( ) –> nothing 断开网络
AddNetwork ( a{sv} : args ) –> o : network 新增网络到接口
RemoveNetwork ( o : network ) –> nothing 移除网络接口
RemoveAllNetworks ( ) –> nothing 移除所有网络接口
SelectNetwork ( o : network ) –> nothing 尝试与已配置的网络关联
Reassociate ( ) –> nothing 尝试重新关联
Reattach ( ) –> nothing 尝试重新关联至当前 BSS
Reconnect ( ) –> nothing 如果处于断开连接状态,则尝试重新连接并连接。
AddBlob ( s : name, ay : data ) –> nothing 向接口添加一个 blob
RemoveBlob ( s : name ) –> nothing 从接口移除一个 blob
GetBlob ( s : name ) –> ay : data 返回先前添加的 Blob 的 Blob 数据
AutoScan ( s : arg ) –> nothing 设置接口的自动扫描参数
TDLSDiscover ( s : peer_address ) –> nothing 启动对等方的 TDLS 发现
TDLSSetup ( s : peer_address ) –> nothing 为对等方设置 TDLS 会话
TDLSStatus ( s : peer_address ) –> s 返回相对于对等方的 TDLS 状态
TDLSTeardown ( s : peer_address ) –> nothing 拆除与对等方的 TDLS 会话
EAPLogoff ( ) –> nothing IEEE 802.1X EAPOL 状态机注销
EAPLogon ( ) –> nothing IEEE 802.1X EAPOL 状态机登录
NetworkReply ( o : network, s : field, s : value ) –> nothing 提供NetworkRequest()请求的参数
SetPKCS11EngineAndModulePath ( s : pkcs11_engine_path, s : pkcs11_module_path ) –> nothing 设置 PKCS #11 引擎和模块路径
SignalPoll ( ) –> a{sv} : properties 获取当前连接的信号属性
FlushBSS ( u : age ) –> nothing 从缓存中刷新 BSS 条目
SubscribeProbeReq ( ) –> nothing 订阅以接收探测请求事件
UnsubscribeProbeReq ( ) –> nothing 取消接收探测请求事件

属性介绍:

属性名称 权限 说明
array{string, variant} Capabilities read 接口功能
string State read 接口状态
bool Scanning read 确定接口是否已在扫描
uint32 ApScan readwrite 与 wpa_supplicant 配置文件中的 ap_scan 条目相同。可能的值为 0、1 或 2
uint32 BSSExpireAge readwrite 与 wpa_supplicant 配置文件中的 bss_expiration_age 条目相同
uint32 BSSExpireCount readwrite 与 wpa_supplicant 配置文件中的 bss_expiration_scan_count 条目相同
string Country readwrite 与 wpa_supplicant 配置文件中的国家/地区条目相同
string Ifname read 接口控制的网络接口名称,例如 wlan0
string BridgeIfname read 该接口控制的桥接网络接口名称,例如 br0
string Driver read 接口使用的驱动程序的名称,例如 nl80211
object CurrentBSS read 表示与 wpa_supplicant 关联的 BSS 的 D-Bus 对象的路径,如果根本没有关联,则为“/”
object CurrentNetwork read 表示 wpa_supplicant 当前使用的配置网络的 D-Bus 对象的路径,如果没有使用则为“/”
string CurrentAuthMode read 当前身份验证类型
array{string} Blobs read 添加到界面的 blob 名称列表
array{object} BSSs read 代表接口已知的 BSS 的 D-Bus 对象路径列表,例如扫描结果
array{object} Networks read 代表已配置网络的 D-Bus 对象路径列表
bool FastReauth readwrite 与 wpa_supplicant 配置文件中的 fast_reauth 条目相同
int32 ScanInterval readwrite 扫描合适 AP 的间隔时间(以秒为单位)。必须 >= 0
string PKCS11EnginePath read PKCS #11 引擎路径
string PKCS11ModulePath read PKCS #11 模块路径
int32 DisconnectReason read 最近的 IEEE 802.11 断开连接原因代码。负值表示本地生成的断开连接

信号介绍:

信号名称 功能
ScanDone ( b : success ) 扫描完成
BSSAdded ( o : BSS, a{sv} : properties ) BSS新增
BSSRemoved ( o : BSS ) BSS移除
BlobAdded ( s : blobName ) blob新增
BlobRemoved ( s : blobName ) blob移除
NetworkAdded ( o : network, a{sv} : properties ) network新增
NetworkRemoved ( o : network ) network移除
NetworkSelected ( o : network ) network选择
StaAuthorized ( s : mac ) 已授权新站使用接口
StaDeauthorized ( s : mac ) 已取消对某个站的接口授权
PropertiesChanged ( a{sv} : properties ) 一些属性有改变
Certification ( a{sv} : parameters ) 有关服务器 TLS 证书的信息
EAP ( s : status, s : parameter ) 有关 EAP 对等状态的信息
NetworkRequest ( o : network, s : field, s : txt ) 请求网络参数。NetworkResponse() 用于提供所请求的参数
ProbeRequest ( a{sv} : args ) 有关已接收探测请求帧的信息。此信号仅发送给已使用 SubscribeProbeReq() 订阅接收事件的单个应用程序

fi.w1.wpa_supplicant1.BSS

表示已扫描 BSS(即扫描结果)的对象实现的接口

接口介绍:

1
2
3
:Service: fi.w1.wpa_supplicant1
:Interface: fi.w1.wpa_supplicant1.BSS
:Object path: /fi/w1/wpa_supplicant1/Interfaces/index/BSSs/serial (serial is 0、1、2 ...)

方法介绍:

属性介绍:

属性名称 权限 说明
array{byte} BSSID read BSS的BSSID
array{byte} SSID read BSS的SSID
array{string, variant} WPA read BSS的WPA信息
array{string, variant} RSN read BSS的RSN信息
array{string, variant} WPS read BSS的WPS信息
array{byte} IEs read BSS 的所有 IE 作为 TLV 链
bool Privacy read 指示 BSS 是否支持隐私
string Mode read 描述 BSS 的模式
uint16 Frequency read BSS 的频率(MHz)
array{uint32} Rates read 按降序排列的 BSS 支持的速率(单位为比特/秒)
int16 Signal read BSS 信号强度
uint32 Age read 自上次看到 BSS 以来的秒数

信号介绍

信号名称 功能
PropertiesChanged ( a{sv} : properties ) 一些属性发生了改变

fi.w1.wpa_supplicant1.Network

由代表配置网络的对象实现的接口,即由 fi.w1.wpa_supplicant1.Interface.AddNetwork 返回。

方法介绍:

属性介绍:

属性名称 权限 说明
bool Enabled readwrite 确定配置的网络是否启用
array{string,variant} readwrite wpa_supplicant 配置文件的“网络”块的条目

信号介绍:

信号名称 功能
PropertiesChanged ( a{sv} : properties ) 一些属性发生了改变

wpa_cli

wpa_cli是wpa_supplicant的客户端,可以实现WiFi的扫描、连接、断开、移除等功能。

参考信息

1、wpa_supplicant

2、wpa_supplicant / hostapd

3、wpa_supplicant 官方dbus接口文档

4、wpa_supplicant提供的接口

5、wpa_supplicant dbus api example using python

6、使用 wpa_supplicant 连接无线网络