OpenHarmony鸿蒙Wifi AP业务流程分析

本文详细介绍了OpenHarmony鸿蒙系统下WiFi AP(Access Point)业务的工作流程,从ap stub、ap service到wifi hal的交互,包括状态机机制、AP开启流程、hostapd的启动与配置,以及遇到问题时的日志分析方法。在开启AP时,涉及的状态切换、事件处理和与硬件的交互是关键步骤。
部署运行你感兴趣的模型镜像
AP业务功能主要包括开启、关闭、设置热点配置以及连接设备管理(连接状态通知,黑名单管理)
  1. 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);删除黑名单
  2. AP业务流转总览
    AP业务流程图

  3. 以开启AP为例分析流程

    a. ap stub
    wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_hotspot_service_impl.cpp
    处理逻辑:

    1. 首先判断用户权限是否允许开启AP
    2. 当前设备状态如飞行模式、电量低不允许开启AP
    3. 判断当前AP状态,为了控制并发请求,在ap开启过程中都不在接收其他开启请求
    4. 动态加载ap能力,也即libwifi_ap_service.so。加载之后注册回调函数,作用为ap状态变更通知,设备连接状态变更通知等
    5. 最后调用ap内函数EnableHotspot

    b. ap service
    wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_ap/ap_interface.h
    Ap service内部采用状态机机制(wifi整体设计如此,所有特性服务内部都采用此机制),外部设置请求以及底层(hostapd)事件通知都发送到状态机内部进行处理。

    Ap内部状态比较简单,如下所示
    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.c

    StartSoftAp函数处理开启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子进程建立连接,以及创建一个专门用于接收子进程事件上报的连接。

  4. 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.conf

    ii. 常用hostapd命令

    命令格式说明
    SETSET [key] [value]用于设置热点配置
    如SET ssid ap1 设置热点名称为"ap1"
    RELOADRELOAD重新加载网口配置
    DISABLEDISABLE去使能网口
    ENABLEENABLE使能网口
    DENY_ACLDENY_ACL ADD_MAC [mac地址]
    DENY_ACL DEL_MAC [mac地址]
    添加、删除黑名单
    DISASSOCIATEDISASSOCIATE [mac地址]断开某个设备连接
    STATUSSTATUS获取当前网口状态
    STA-FIRSTSTA-FIRST获取已连接设备
    STA-NEXTSTA-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
    
  5. 常见问题分析
    a. 开启AP失败
    开发板上同时提供了一个hostapd命令,如果开启AP失败时,首先在开发板上直接启动hostapd看看是否报错,为方便日志查看,可添加更多打印日志选项,如:
    hostapd -ddddd /data/misc/wifi/wpa_supplicant/hostapd.conf

    b. 获取Hostapd日志
    如之前所述,AP业务层强依赖于hostapd功能的稳定性,大部分问题都来自于hostapd。而hostapd又不打印日志,所以通常做法是在wifi hal启动hostapd时添加日志输出选项。
    修改wifi/services/wifi_standard/wifi_hal/wifi_hal_ap_interface.cstatic 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并更新到开发板,重启服务。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

togolife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值