OpenHarmony设备开发(四)-WIFI_AP开发

​​想了解更多关于开源的内容,请访问:​​

​​ 开源基础软件社区​​

​​https://ost.​​

前言

本文章主要讲轻量化系统的WIFI的AP连接,即是打开WIFI的热点。本文适用于OpenHarmony3.1的轻量化系统设备。

设计流程

wifiAPTask主线程函数

  1. 注册wifi事件的回调函数RegisterWifiEvent(WifiEvent* event)。
  2. 初始化wifi热点相关配置SetHotspotConfig(const HotspotConfig* config)。
  3. 启动wifi热点模式EnableHotspot()。
  4. 检查热点是否正确地启用IsHotspotActive()。
  5. 启动DHCP。
  • 查找接口:netifapi_netif_find()。
  • 改变IP_add的配置:netifapi_netif_set_addr()。
  • 启动dhcp服务:netifapi_dhcps_start()。

线程创建

staticvoidWifi_AP_Demo(void)
{
osThreadAttr_tattr;
attr.name="WifiAPTask";
attr.attr_bits=0U;
attr.cb_mem=NULL;
attr.cb_size=0U;
attr.stack_mem=NULL;
attr.stack_size=10240;
attr.priority=25;
if (osThreadNew((osThreadFunc_t)WifiAPTask, NULL, &attr) ==NULL)
{
printf("Falied to create WifiAPTask!\r\n");
}
}
SYS_RUN(Wifi_AP_Demo);

代码分析

1、注册wifi事件的回调函数

首先要创建一个指向wifi事件回调的指针,用于热点连接、断开或扫描时调用回调函数,便于相对应时刻的操作。(若不需要回调函数,设置该指针为NULL)。

WifiEventg_wifiEventHandler= {0};

再来介绍一下wifEvent结构体对象,.OnHotspotStaJoin是绑定STA站点加入时的回调函数,.OnHotspotStaLeave是STA退出时的回调函数,.OnHotspotStateChanged是状态改变回调函数,我们通常设置这三个回调函数即可。

typedefstruct {
/** Connection state change */
void (*OnWifiConnectionChanged)(intstate, WifiLinkedInfo*info);
/** Scan state change */
void (*OnWifiScanStateChanged)(intstate, intsize);
/** Hotspot state change */
void (*OnHotspotStateChanged)(intstate);
/** Station connected */
void (*OnHotspotStaJoin)(StationInfo*info);
/** Station disconnected */
void (*OnHotspotStaLeave)(StationInfo*info);
} WifiEvent;

最后使用RegisterWifiEvent函数调用g_wifiEventHandler指针的数据,指定wifi回调函数,该函数返回值为0即是成功。

//注册wifi事件的回调函数
g_wifiEventHandler.OnHotspotStaJoin=OnHotspotStaJoinHandler;
g_wifiEventHandler.OnHotspotStaLeave=OnHotspotStaLeaveHandler;
g_wifiEventHandler.OnHotspotStateChanged=OnHotspotStateChangedHandler;
//指定WiFi回调函数
RegisterWifiEvent(&g_wifiEventHandler);

具体的回调函数在文章后面细述。

2、初始化wifi热点相关配置

首先创建一个配置热点的config指针,并初始化该指针。

//设置指定的热点配置
HotspotConfigconfig= {0};
//初始化热点相关配置
strcpy(config.ssid, "FSR_hispark"); //设置热点的SSID
strcpy(config.preSharedKey, "12345678"); //设置热点的密钥
config.securityType=WIFI_SEC_TYPE_PSK; //加密模式为PSK
config.band=HOTSPOT_BAND_TYPE_2G; //设置频段为2.4GHz
config.channelNum=7; //热点的信道数

随后使用 SetHotspotConfig函数配置wifi热点,该函数返回值为0即是成功。

//配置wifi热点
SetHotspotConfig(&config);

3、启动和检查wifi

启动wifi:

error=EnableHotspot();
if (error!=WIFI_SUCCESS) //返回值为0即是开启成功
{
printf("EnableHotspot failed, error = %d.\r\n", error);
return-1;
}

使用IsHotspotActive();函数,确认热点模式是否使能成功。

if (IsHotspotActive() ==WIFI_HOTSPOT_NOT_ACTIVE)   //若不成功
{
printf("Wifi station is not actived.\r\n");
return-1;
}
printf("Wifi station is actived!\r\n");

4、启动DHCP

第一步先创建dhcp对象。

staticstructnetif*g_lwip_netif=NULL;
g_lwip_netif=netifapi_netif_find("ap0"); //查找网络接口

第二步是初始化dhcp相关配置,然后使用netifapi_netif_set_addr函数配置dhcp。

ip4_addr_tbp_gw;
ip4_addr_tbp_ipaddr;
ip4_addr_tbp_netmask;
IP4_ADDR(&bp_gw, 192, 168, 1, 1); /* 网关 */
IP4_ADDR(&bp_ipaddr, 192, 168, 1, 1); /* IP */
IP4_ADDR(&bp_netmask, 255, 255, 255, 0); /* 网络掩码 */
err_tret=netifapi_netif_set_addr(g_lwip_netif, &bp_ipaddr, &bp_netmask, &bp_gw);
//ret为0即成功

第三步需要先将dhcp关闭!!!否则直接进行第四步开启dhcp会产生内存报错。

​​netifapi_dhcps_stop(g_lwip_netif);​​

第四步是开启dhcp

​​netifapi_dhcps_start(g_lwip_netif, 0, 0);​​
  • 参数一:dhcp对象。
  • 参数二:地址池的起始IP地址。
  • 参数三:需要加入IP地址池的IP地址数量。

回调函数

下面将介绍三个类型的回调函数。

状态改变回调函数

终端输出WIFI AP模式状态。

staticvoidOnHotspotStateChangedHandler(intstate)
{
printf("HotspotStateChanged:state is %d.\r\n", state);
if (state==WIFI_HOTSPOT_ACTIVE) // state=1表示已启用WIFI AP模式
{
printf("wifi hotspot active.\r\n");
}
else// state=0表示WIFI AP模式已禁用
{
printf("wifi hotspot noactive.\r\n");
}
}

STA退出回调函数

STA退出时打印mac地址。

staticvoidOnHotspotStaLeaveHandler(StationInfo*info)
{
if (info==NULL)
{
printf("HotspotStaLeave:info is null.\r\n");
}
else
{
staticcharmacAddress[32] = {0};
unsignedchar*mac=info->macAddress;
snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
printf("HotspotStaLeave: macAddress=%s, reason=%d.\r\n", macAddress, info->disconnectedReason);
//设备-1
g_apEnableSuccess--;
}
return;
}
绑定STA站点加入回调函数

打印出每个STA站点的MAC地址。

staticvoidHotspotStaJoinTask(void)
{
staticcharmacAddress[32] = {0};
StationInfostainfo[WIFI_MAX_STA_NUM] = {0};
StationInfo*sta_list_node=NULL;
unsignedintsize=WIFI_MAX_STA_NUM;

//获取当前接入到该AP的所有STA站点信息
error=GetStationList(stainfo, &size);
if (error!=WIFI_SUCCESS)
{
printf("HotspotStaJoin:get list fail, error is %d.\r\n", error);
return;
}
sta_list_node=stainfo;
//打印出每个STA站点的MAC地址
for (uint32_ti=0; i<size; i++, sta_list_node++)
{
unsignedchar*mac=sta_list_node->macAddress;
snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
printf("HotspotSta[%d]: macAddress=%s.\r\n", i, macAddress);
}
//记录设备+1
g_apEnableSuccess++;
}

//STA加入回调函数
staticvoidOnHotspotStaJoinHandler(StationInfo*info)
{
if (info==NULL)
{
printf("HotspotStaJoin:info is null.\r\n");
}
else
{
//创建连接线程
printf("New Sta Join\n");
osThreadAttr_tattr;
attr.name="HotspotStaJoinTask";
attr.attr_bits=0U;
attr.cb_mem=NULL;
attr.cb_size=0U;
attr.stack_mem=NULL;
attr.stack_size=2048;
attr.priority=24;
if (osThreadNew((osThreadFunc_t)HotspotStaJoinTask, NULL, &attr) ==NULL)
{
printf("HotspotStaJoin:create task fail!\r\n");
}
}
return;
}

效果图

​​想了解更多关于开源的内容,请访问:​​

​​ 开源基础软件社区​​

​​https://ost.​​。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/301365.html<

(0)
管理的头像管理
上一篇2025-05-24 07:25
下一篇 2025-05-24 07:27

相关推荐

  • 骨干网络体系结构能干什么?骨干网络体系结构的作用

    骨干网络体系结构是现代信息社会的“超级高速公路网”,它通过分层设计、冗余备份和智能调度,确保海量数据在全球范围内高速、稳定、安全地传输,是支撑云计算、物联网及人工智能应用的底层基石,想象一下,如果你把互联网比作一个巨大的城市交通系统,那么骨干网络就是连接各个城市的主干道和立交桥,没有它,你的每一次微信发送、每一……

    2026-06-18
    0
  • 高io数据库可以干什么用?高io数据库适合什么场景

    高IO数据库的核心价值在于通过极高的读写吞吐量,解决海量数据场景下的性能瓶颈,是支撑高并发交易、实时分析及大规模内容分发的关键基础设施,在数字化转型的深水区,数据不再仅仅是静态的记录,而是流动的资产,传统的机械硬盘或普通SSD早已无法满足现代应用对速度的极致追求,高IO(Input/Output)数据库,就是那……

    2026-06-18
    0
  • 高io服务器性能如何?高io服务器适合什么场景

    高IO服务器并非单纯指代某种硬件,而是指在随机读写、高并发连接及小文件处理场景下,具备极致IOPS(每秒输入输出操作次数)和低延迟特性的计算资源,它是支撑现代高并发应用稳定运行的核心基石,在2026年的数字化浪潮中,业务负载早已从简单的静态页面展示演变为复杂的实时数据处理,许多开发者在排查系统瓶颈时,往往忽略了……

    2026-06-18
    0
  • 隔离网络空间哪里便宜?国内隔离网络空间价格

    隔离网络空间并没有统一的“便宜”标准,其成本高度取决于物理隔离等级、带宽需求及安全合规要求,通常物理网闸方案初期投入较高但长期运维成本低,而逻辑隔离方案虽初期便宜但存在潜在安全风险,建议根据业务敏感度选择混合隔离架构以平衡成本与安全,在数字化时代,企业构建独立网络环境的需求日益增长,但“隔离网络空间哪里便宜”这……

    2026-06-18
    0
  • 骨干网络体系结构设备为何故障?常见原因有哪些

    骨干网络体系结构设备故障的核心原因通常归结为硬件老化、配置错误、物理链路中断及外部攻击四大类,其中电源模块失效与光模块性能衰减是占比最高的隐性故障源,骨干网作为数字经济的“大动脉”,其稳定性直接关乎国计民生,当核心路由器或交换机出现丢包、震荡甚至宕机时,运维人员往往面临巨大的压力,很多人第一反应是检查软件配置……

    2026-06-18
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注