当前位置: 首页 > 科技观察

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

时间:2023-03-16 10:16:32 科技观察

了解更多开源请访问:开源基础软件社区https://ost.51cto.com本文前言主要说一下轻量级的WIFIAP连接系统,也就是开启WIFI热点。本文适用于OpenHarmony3.1的轻量级系统设备。设计过程wifiAPTask主线程函数注册wifi事件的回调函数RegisterWifiEvent(WifiEvent*event)。初始化wifi热点相关配置SetHotspotConfig(constHotspotConfig*config)。启动wifi热点模式EnableHotspot()。使用IsHotspotActive()检查热点是否正确启用。启动DHCP。查找接口:netifapi_netif_find()。更改IP_add的配置:netifapi_netif_set_addr()。启动dhcp服务:netifapi_dhcps_start()。线程创建staticvoidWifi_AP_Demo(void){osThreadAttr_tattr;attr.name="WifiAPTask";属性.attr_bits=0U;属性.cb_mem=NULL;属性.cb_size=0U;属性.stack_mem=NULL;attr.stack_size=10240;属性优先级=25;if(osThreadNew((osThreadFunc_t)WifiAPTask,NULL,&attr)==NULL){printf("创建WifiAPTask失败!\r\n");}}SYS_RUN(Wifi_AP_Demo);代码分析1.注册wifi事件的回调函数,首先创建一个指向wifi事件回调的指针,用于在热点连接、断开或扫描时调用回调函数,方便操作在相应的时间。(如果不需要回调函数,则将此指针设置为NULL)。WifiEventg_wifiEventHandler={0};再介绍一下wifEvent结构体对象,.OnHotspotStaJoin是STA站点加入时的回调函数,.OnHotspotStaLeave是STA退出时的回调函数,.OnHotspotStateChanged是状态改变回调函数,我们一般设置这三个回调函数就够了。typedefstruct{/**连接状态改变*/void(*OnWifiConnectionChanged)(intstate,WifiLinkedInfo*info);/**扫描状态改变*/void(*OnWifiScanStateChanged)(intstate,intsize);/**热点状态改变*/void(*OnHotspotStateChanged)(intstate);/**站点连接*/void(*OnHotspotStaJoin)(StationInfo*info);/**站点断开连接*/void(*OnHotspotStaLeave)(StationInfo*info);}Wifi事件;最后使用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");//设置热点SSIDstrcpy(config.preSharedKey,"12345678");//设置热点的密钥config.securityType=WIFI_SEC_TYPE_PSK;//加密方式为PSKconfig.band=HOTSPOT_BAND_TYPE_2G;//设置频段为2.4GHzconfig.channelNum=7;//热点的频道号,然后使用SetHotspotConfig函数配置wifi热点,函数返回0表示成功。//配置wifi热点SetHotspotConfig(&config);3.启动并检查wifi启动wifi:error=EnableHotspot();if(error!=WIFI_SUCCESS)//返回值为0,表示启动成功{printf("EnableHotspotfailed,error=%d.\r\n",error);返回-1;}使用IsHotspotActive();函数确认热点模式是否开启成功。if(IsHotspotActive()==WIFI_HOTSPOT_NOT_ACTIVE)//如果不成功{printf("Wifi站点未激活。\r\n");返回-1;}printf("Wifi站点已激活!\r\n");4.启动DHCP的第一步是创建一个dhcp对象。静态结构netif*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,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);第四步开启dhcpnetifapi_dhcps_start(g_lwip_netif,0,0);参数一:dhcp对象。参数2:地址池的起始IP地址。参数3:需要加入IP地址池的IP地址数。回调函数下面分别介绍三种回调函数。状态改变回调函数端输出WIFIAP模式状态。staticvoidOnHotspotStateChangedHandler(intstate){printf("HotspotStateChanged:stateis%d.\r\n",state);if(state==WIFI_HOTSPOT_ACTIVE)//state=1表示启用WIFIAP模式{printf("wifihotspotactive.\r\n");}else//state=0表示禁用WIFIAP模式{printf("wifihotspotnoactive.\r\n");}}STA退出回调函数STA退出时打印mac地址。staticvoidOnHotspotStaLeaveHandler(StationInfo*info){if(info==NULL){printf("HotspotStaLeave:info为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);//设备-1g_apEnableSuccess--;}return;}绑定STA站点,添加回调函数打印出每个STA站点的MAC地址。staticvoidHotspotStaJoinTask(void){staticcharmacAddress[32]={0};StationInfostaininfo[WIFI_MAX_STA_NUM]={0};StationInfo*sta_list_node=NULL;无符号整数大小=WIFI_MAX_STA_NUM;所有STA站点信息error=GetStationList(stainfo,&size);if(error!=WIFI_SUCCESS){printf("HotspotStaJoin:getlistfail,erroris%d.\r\n",error);返回;}sta_list_node=staininfo;//打印出每个STA站的MAC地址for(uint32_ti=0;imacAddress;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);}//录音设备+1g_apEnableSuccess++;}//STA添加回调函数staticvoidOnHotspotStaJoinHandler(StationInfo*info){if(info==NULL){printf("HotspotStaJoin:infoisnull.\r\n");}else{//创建连接线程printf("NewStaJoin\n");osThreadAttr_t属性;attr.name="HotspotStaJoinTask";属性.attr_bits=0U;属性.cb_mem=NULL;属性.cb_size=0U;属性。堆栈内存=空;attr.stack_size=2048;属性优先级=24;if(osThreadNew((osThreadFunc_t)HotspotStaJoinTask,NULL,&attr)==NULL){printf("HotspotStaJoin:创建任务失败!\r\n");}}return;}渲染图了解更多开源请访问:开源基础软件社区https://ost.51cto.com