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检查热点模式是否启用。 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表示是否开启Wifi热点模式,取值为1或0,1表示已启用Wifi热点模式,0表示已禁用Wifi热点模式。 78 79 * `OnHotspotStaLeaveHandler` 用于绑定STA断开热点事件,当有STA断开热点,该回调函数会打印出已断开的STA的MAC地址。 80 * `OnHotspotStaJoinHandler` 用于绑定STA连接到热点事件,当有新的STA连接热点时,该回调函数会打印出刚连接的STA的MAC地址。 812. 调用 `SetHotspotConfig` 接口,设置指定热点的配置。 823. 调用 `EnableHotspot` 接口,使能 Wifi 热点模式。 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 active.\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\board\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! 154SetHotspotConfig succeed! 155HotspotStateChanged:state is 1. 156wifi hotspot active. 157EnableHotspot succeed! 158Waiting to receive data... 159+NOTICE:STA CONNECTED 160HotspotStaJoin: macAddress=EC:5C:68:5B:2D:3D, reason=0. 161``` 162 163 164