1# BearPi-HM_Nano开发板WiFi编程开发——Wifi AP 热点 2 3 4本示例将演示如何在BearPi-HM_Nano开发板上编写一个创建Wifi热点程序。 5 6 7## Wifi API分析 8本案例主要使用了以下几个API完成Wifi热点创建。 9 10### RegisterWifiEvent() 11```c 12WifiErrorCode RegisterWifiEvent (WifiEvent * event) 13``` 14 **描述:** 15 16为指定的Wi-Fi事件注册回调函数。当WifiEvent中定义的Wi-Fi事件发生时,将调用已注册的回调函数。 17 18**参数:** 19 20|参数名|描述| 21|:--|:------| 22| event | 表示要注册回调的事件。 | 23 24 25### EnableHotspot() 26```c 27WifiErrorCode EnableHotspot (void ) 28``` 29 30**描述:** 31 32启用Wifi热点模式。 33 34### SetHotspotConfig() 35```c 36WifiErrorCode SetHotspotConfig(const HotspotConfig* config) 37``` 38**描述:** 39 40设置指定的热点配置。 41 42### IsHotspotActive() 43```c 44int IsHotspotActive(void); 45``` 46**描述:** 47 48检查AP热点模式是否启用。 49 50### GetStationList() 51```c 52WifiErrorCode GetStationList(StationInfo* result, unsigned int* size) 53``` 54**描述:** 55 56获取连接到该热点的一系列STA。 57 58**参数:** 59 60|参数名|描述| 61|:--|:------| 62| result | 表示连接到该热点的STA列表。 | 63| size | 表示连接到该热点的STA数量。 | 64 65 66 67## 软件设计 68 69**主要代码分析** 70 71完成Wifi热点的扫描需要以下几步。 72 731. 通过 `RegisterWifiEvent` 接口向系统注册热点状态改变事件、STA站点加入事件、STA站点退出事件。 74 75 * `OnHotspotStateChangedHandler` 用于绑定热点状态改变事件,该回调函数有一个参数 `state` 。 76 77 * state表示是否开启AP模式,取值为0和1,0表示已启用Wifi AP模式,1表示已禁用Wifi AP模式。 78 79 * `OnHotspotStaLeaveHandler` 用于绑定STA站点退出事件,当有STA站点退出,该回调函数会打印出退出站点的MAC地址。 80 * `OnHotspotStaJoinHandler` 用于绑定STA站点加入事件,当有新的STA站点加入时,该回调函数会创建 `HotspotStaJoinTask`,在该任务中会调用 `GetStationList` 函数获取当前接入到该AP的所有STA站点信息,并打印出每个STA站点的MAC地址。 812. 调用 `SetHotspotConfig` 接口,设置指定的热点配置。 823. 调用 `EnableHotspot` 接口,使能 Wifi AP 模式。 83 84 85```c 86static BOOL WifiAPTask(void) 87{ 88 //延时2S便于查看日志 89 osDelay(TASK_DELAY_2S); 90 91 //注册wifi事件的回调函数 92 g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler; 93 g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler; 94 g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler; 95 error = RegisterWifiEvent(&g_wifiEventHandler); 96 if (error != WIFI_SUCCESS) { 97 printf("RegisterWifiEvent failed, error = %d.\r\n", error); 98 return -1; 99 } 100 printf("RegisterWifiEvent succeed!\r\n"); 101 //检查热点模式是否使能 102 if (IsHotspotActive() == WIFI_HOTSPOT_ACTIVE) { 103 printf("Wifi station is actived.\r\n"); 104 return -1; 105 } 106 //设置指定的热点配置 107 HotspotConfig config = { 0 }; 108 109 strcpy_s(config.ssid, strlen(AP_SSID) + 1, AP_SSID); 110 strcpy_s(config.preSharedKey, strlen(AP_PSK) + 1, AP_PSK); 111 config.securityType = WIFI_SEC_TYPE_PSK; 112 config.band = HOTSPOT_BAND_TYPE_2G; 113 config.channelNum = CHANNEL_NUM; 114 115 error = SetHotspotConfig(&config); 116 if (error != WIFI_SUCCESS) { 117 printf("SetHotspotConfig failed, error = %d.\r\n", error); 118 return -1; 119 } 120 printf("SetHotspotConfig succeed!\r\n"); 121 122 //启动wifi热点模式 123 error = EnableHotspot(); 124 if (error != WIFI_SUCCESS) { 125 printf("EnableHotspot failed, error = %d.\r\n", error); 126 return -1; 127 } 128 printf("EnableHotspot succeed!\r\n"); 129 130 StartUdpServer(); 131} 132``` 133 134## 编译调试 135 136### 修改 BUILD.gn 文件 137 138修改 `device\bearpi\bearpi_hm_nano\app` 路径下 BUILD.gn 文件,指定 `wifi_ap` 参与编译。 139```r 140"D1_iot_wifi_ap:wifi_ap", 141#"D2_iot_wifi_sta_connect:wifi_sta_connect", 142#"D3_iot_udp_client:udp_client", 143#"D4_iot_tcp_server:tcp_server", 144#"D5_iot_mqtt:iot_mqtt", 145#"D6_iot_cloud_oc:oc_mqtt", 146``` 147 148 149### 运行结果 150 151示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,使用手机去连接该热点,会打印出一下信息。 152``` 153RegisterWifiEvent succeed! 154 155SetHotspotConfig succeed! 156 157HotspotStateChanged:state is 1. 158 159EnableHotspot succeed! 160 161Wifi station is actived! 162 163+NOTICE:STA CONNECTED 164New Sta Join 165HotspotSta[0]: macAddress=EC:5C:68:5B:2D:3D. 166 167netifapi_netif_set_addr succeed! 168 169netifapi_dhcps_start succeed! 170 171Waiting to receive data... 172``` 173 174 175