• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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