AP业务功能主要包括开启、关闭、设置热点配置以及连接设备管理(连接状态通知,黑名单管理)
-
AP业务主要接口
接口文件:
wifi/interfaces/innerkits/native_cpp/wifi_standard/include/wifi_hotspot.h接口名称 接口描述 ErrCode EnableHotspot(); 开启AP ErrCode DisableHotspot(); 关闭AP ErrCode GetHotspotState(int &state); 获取当前AP状态 ErrCode SetHotspotConfig(const HotspotConfig &config); 设置AP配置 ErrCode GetHotspotConfig(HotspotConfig &config); 获取AP配置 ErrCode GetStationList(std::vector<StationInfo> &result); 获取已连接设备 ErrCode DisassociateSta(const StationInfo &info); 断开某个设备连接 ErrCode GetBlockLists(std::vector<\StationInfo> &infos); 获取当前黑名单列表 ErrCode AddBlockList(const StationInfo &info); 添加黑名单 ErrCode DelBlockList(const StationInfo &info); 删除黑名单 -
AP业务流转总览

-
以开启AP为例分析流程
a. ap stub
wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_hotspot_service_impl.cpp
处理逻辑:- 首先判断用户权限是否允许开启AP
- 当前设备状态如飞行模式、电量低不允许开启AP
- 判断当前AP状态,为了控制并发请求,在ap开启过程中都不在接收其他开启请求
- 动态加载ap能力,也即
libwifi_ap_service.so。加载之后注册回调函数,作用为ap状态变更通知,设备连接状态变更通知等 - 最后调用ap内函数
EnableHotspot
b. ap service
wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap/ap_interface.h
Ap service内部采用状态机机制(wifi整体设计如此,所有特性服务内部都采用此机制),外部设置请求以及底层(hostapd)事件通知都发送到状态机内部进行处理。Ap内部状态比较简单,如下所示

加载Ap services后默认处于ApIdleState,所以开启AP时,首先向状态机发送CMD_START_HOTSPOT命令,ApIdleState中处理则为切换状态为ApStatedState。在进入状态之前,需要执行
GoInState函数,在ApStartedState的GoInState中处理逻辑:
1) 设置AP状态为AP_STATE_STARTING(开启中),并通知应用层AP状态变更
2) 向wifi_hal注册ap事件
3) 向wifi_hal请求开启AP
4) 向wifi_hal请求设置热点配置
5) 向wifi_hal请求设置已有黑名单
6) 上述步骤都成功则开启ap成功,设置AP状态为AP_STATE_STARTED(开启成功),并通知应用层AP状态变更
7) 如果请求开启AP或设置热点配置失败,则切换为ApIdleState,需要进入ApStartedState的GoOutState中处理:请求关闭AP,注销AP事件处理,最后设置AP状态为AP_STATE_IDLE(空闲)c. wifi hal
wifi/services/wifi_standard/wifi_hal/wifi_hal_ap_interface.cStartSoftAp函数处理开启AP逻辑:
i. 加载hostapd:hostapd以libwpa.z.so方式提供,所以在wifi hal中通过fork子进程,在子进程中启动线程,线程中动态加载libwpa.z.so库,并执行ap_main函数。
ii. 连接hostapd:使用libwpa_client.z.so库中wpa_ctrl_open函数与wifi hal子进程建立连接,以及创建一个专门用于接收子进程事件上报的连接。 -
Hostapd
wifi hal与Hostapd就相当于一个传声筒。wifi hal接收ap业务层指令,转换为hostapd指令下发给hostapd执行;接收到hostapd事件通知时,转换为业务层注册事件通知事件发生。
i. hostapd启动参数[HostapdSample]init hostapd. hostapd v2.9 User space daemon for IEEE 802.11 AP management, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator Copyright (c) 2002-2019, Jouni Malinen <j@w1.fi> and contributors usage: hostapd [-hdBKtv] [-P <PID file>] [-e <entropy file>] \ [-g <global ctrl_iface>] [-G <group>]\ [-i <comma-separated list of interface names>]\ <configuration file(s)> options: -h show this usage -d show more debug messages (-dd for even more) -B run daemon in the background -e entropy file -g global control interface path -G group for control interfaces -P PID file -K include key data in debug messages -i list of interface names to use -S start all the interfaces synchronously -t include timestamps in some debug messages -v show hostapd version在wifi hal中我们只传入了配置参数,即启动命令为:
hostapd /data/misc/wifi/wpa_supplicant/hostapd.confii. 常用hostapd命令
命令 格式 说明 SET SET [key] [value] 用于设置热点配置
如SET ssid ap1 设置热点名称为"ap1"RELOAD RELOAD 重新加载网口配置 DISABLE DISABLE 去使能网口 ENABLE ENABLE 使能网口 DENY_ACL DENY_ACL ADD_MAC [mac地址]
DENY_ACL DEL_MAC [mac地址]添加、删除黑名单 DISASSOCIATE DISASSOCIATE [mac地址] 断开某个设备连接 STATUS STATUS 获取当前网口状态 STA-FIRST STA-FIRST 获取已连接设备 STA-NEXT STA-NEXT [mac地址] 获取已连接设备 分析hostapd支持哪些命令,可结合源码
third_party/wpa_supplicant/wpa_supplicant-2.9_standard/hostapd/ap_ctrl_iface.c,函数hostapd_ctrl_iface_receive_process。iii. 设置热点配置时执行命令
如设置热点名称为Ap1,热点加密方式为WPA2 PSK,密码为12345678,命令如下所示:> SET wpa_passphrase 12345678 OK > SET ssid Ap1 OK > SET wpa 1 OK > SET wpa_key_mgmt WPA-PSK OK > SET wpa_pairwise CCMP OK > SET hw_mode g OK > SET channel 6 OK > SET max_num_sta 32 OK > RELOAD OK > DISABLE <3>AP-DISABLED OK > ENABLE <3>AP-ENABLED OK -
常见问题分析
a. 开启AP失败
开发板上同时提供了一个hostapd命令,如果开启AP失败时,首先在开发板上直接启动hostapd看看是否报错,为方便日志查看,可添加更多打印日志选项,如:
hostapd -ddddd /data/misc/wifi/wpa_supplicant/hostapd.confb. 获取Hostapd日志
如之前所述,AP业务层强依赖于hostapd功能的稳定性,大部分问题都来自于hostapd。而hostapd又不打印日志,所以通常做法是在wifi hal启动hostapd时添加日志输出选项。
修改wifi/services/wifi_standard/wifi_hal/wifi_hal_ap_interface.c中static const char *g_startCmd = "hostapd /data/misc/wifi/wpa_supplicant/hostapd.conf";改为static const char *g_startCmd = "hostapd -dddddd -f/data/misc/wifi/ap.log -t /data/misc/wifi/wpa_supplicant/hostapd.conf";
其中-dddddd为日志级别,d越多则普通的DEBUG日志也会输出;-t输出时间;-f为输出hostapd日志文件具体路径。
修改之后重新编译wifi_hal_service并更新到开发板,重启服务。
本文详细介绍了OpenHarmony鸿蒙系统下WiFi AP(Access Point)业务的工作流程,从ap stub、ap service到wifi hal的交互,包括状态机机制、AP开启流程、hostapd的启动与配置,以及遇到问题时的日志分析方法。在开启AP时,涉及的状态切换、事件处理和与硬件的交互是关键步骤。
900





