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 |
注意:
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 | wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf |
注意事项:
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 |
|
wpa_supplicant结构图:
配置文件
wpa_supplicant.conf 作为 wpa_supplicant 应用程序的配置文件,可以持久化保存一些信息。而配置文件的默认保存路径是:/etc/wpa_supplicant/wpa_supplicant.conf
wpa_supplicant.conf 可以设置哪些配置?
- 指定wpa_supplicant控制接口
- 是否允许配置文件更新
- 默认网络配置
1 | # 必须为wpa_supplicant指定一个控制接口,并且必须赋予它更新配置的权限 |
接口
从通信层次上划分:
上行接口: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 可以查看到更具体的信息:
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 | :Service: 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 | :Service: fi.w1.wpa_supplicant1 |
方法介绍:
方法名称 | 功能 |
---|---|
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 | :Service: fi.w1.wpa_supplicant1 |
方法介绍:
无
属性介绍:
属性名称 | 权限 | 说明 |
---|---|---|
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的扫描、连接、断开、移除等功能。