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

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

​​https://ost.​​

前言

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

设计流程

wifiAPTask主线程函数

    注册wifi事件的回调函数RegisterWifiEvent(WifiEvent* event)。初始化wifi热点相关配置SetHotspotConfig(const HotspotConfig* 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.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; //加密模式为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("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);//设备-1g_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);    }//记录设备+1g_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.​​。