README.md
1# BearPi-HM_Nano开发板WiFi编程开发——Wifi连接热点
2
3
4本示例将演示如何在BearPi-HM_Nano开发板上编写一个Wifi连接热点业务程序。
5
6## Wifi API分析
7本案例主要使用了以下几个API完成Wifi联网。
8### RegisterWifiEvent()
9```c
10WifiErrorCode RegisterWifiEvent (WifiEvent * event)
11```
12 **描述:**
13为指定的Wi-Fi事件注册回调函数。当WifiEvent中定义的Wi-Fi事件发生时,将调用已注册的回调函数。
14
15**参数:**
16
17|参数名|描述|
18|:--|:------|
19| event | 表示要注册回调的事件。 |
20
21
22### EnableWifi()
23```c
24WifiErrorCode EnableWifi (void )
25```
26**描述:**
27
28启用STA模式。
29
30### AddDeviceConfig()
31```c
32WifiErrorCode AddDeviceConfig (const WifiDeviceConfig * config, int * result )
33```
34**描述:**
35
36添加用于配置连接到热点信息,此函数生成一个networkId。
37
38**参数:**
39
40|参数名|描述|
41|:--|:------|
42| config | 表示要连接的热点信息。 |
43| result | 表示生成的networkId。每个networkId匹配一个热点配置。 |
44
45### ConnectTo()
46```c
47WifiErrorCode ConnectTo (int networkId)
48```
49**描述:**
50
51连接到指定networkId的热点。
52
53**参数:**
54
55|参数名|描述|
56|:--|:------|
57| networkId | 表示与目标热点匹配的网络id。 |
58
59
60
61
62### netifapi_netif_find()
63```c
64struct netif *netifapi_netif_find(const char *name);
65```
66**描述:**
67
68获取netif用于IP操作。
69
70### dhcp_start()
71
72```c
73err_t dhcp_start(n)
74```
75
76**描述:**
77
78启动DHCP, 获取IP。
79
80
81## 软件设计
82
83**主要代码分析**
84
85完成Wifi热点的连接需要以下几步
86
871. 通过 `RegisterWifiEvent` 接口向系统注册扫描状态监听函数,用于接收扫描状态通知,如扫描动作是否完成等。
88
89* `OnWifiConnectionChangedHandler` 用于绑定连接状态监听函数,该回调函数有两个参数 `state` 和 `info` 。
90
91 * state表示扫描状态,取值为0和1,1表示热点连接成功。
92
93 * info表示Wi-Fi连接信息,包含以下参数。
94
95
96 |参数名|描述|
97 |:--|:------|
98 | ssid [WIFI_MAX_SSID_LEN] | 连接的热点名称。 |
99 | bssid [WIFI_MAC_LEN] | MAC地址。 |
100 | rssi | 接收信号强度(RSSI)。 |
101 | connState | Wifi连接状态。 |
102 | disconnectedReason | Wi-Fi断开的原因。 |
103
104
105
106
1072. 调用 `EnableWifi` 接口,使能 Wifi。
1083. 调用 `AddDeviceConfig` 接口,配置连接的热点信息。
1094. 调用 `ConnectTo` 接口,连接到指定networkId的热点。
1105. 调用 `WaitConnectResult` 接口等待,该函数中会有15s的时间去轮询连接成功标志位 `g_ConnectSuccess`,当`g_ConnectSuccess` 为 1 时退出等待。
1116. 调用 `netifapi_netif_find` 接口,获取 netif 用于 IP 操作。
1127. 调用 `dhcp_start` 接口,启动 DHCP, 获取 IP。
113
114```c
115static BOOL WifiStaTask(void)
116{
117 unsigned int size = WIFI_SCAN_HOTSPOT_LIMIT;
118
119 //初始化WIFI
120 if (WiFiInit() != WIFI_SUCCESS) {
121 printf("WiFiInit failed, error = %d\r\n", error);
122 return -1;
123 }
124 //分配空间,保存WiFi信息
125 WifiScanInfo *info = malloc(sizeof(WifiScanInfo) * WIFI_SCAN_HOTSPOT_LIMIT);
126 if (info == NULL) {
127 return -1;
128 }
129 //轮询查找WiFi列表
130 do {
131 Scan();
132 WaitSacnResult();
133 error = GetScanInfoList(info, &size);
134 } while (g_staScanSuccess != 1);
135 //打印WiFi列表
136 printf("********************\r\n");
137 for (uint8_t i = 0; i < g_ssid_count; i++) {
138 printf("no:%03d, ssid:%-30s, rssi:%5d\r\n", i + 1, info[i].ssid, info[i].rssi);
139 }
140 printf("********************\r\n");
141 //连接指定的WiFi热点
142 for (uint8_t i = 0; i < g_ssid_count; i++) {
143 if (WifiConnectAp(SELECT_WIFI_SSID, SELECT_WIFI_PASSWORD, info, i) == WIFI_SUCCESS) {
144 printf("WiFi connect succeed!\r\n");
145 break;
146 }
147
148 if (i == g_ssid_count - 1) {
149 printf("ERROR: No wifi as expected\r\n");
150 while (1)
151 osDelay(DHCP_DELAY);
152 }
153 }
154
155 //启动DHCP
156 if (g_lwip_netif) {
157 dhcp_start(g_lwip_netif);
158 printf("begain to dhcp\r\n");
159 }
160 //等待DHCP
161 for (;;) {
162 if (dhcp_is_bound(g_lwip_netif) == ERR_OK) {
163 printf("<-- DHCP state:OK -->\r\n");
164 //打印获取到的IP信息
165 netifapi_netif_common(g_lwip_netif, dhcp_clients_info_show, NULL);
166 break;
167 }
168 osDelay(DHCP_DELAY);
169 }
170
171 //执行其他操作
172 for (;;) {
173 osDelay(DHCP_DELAY);
174 }
175}
176```
177
178## 编译调试
179### 修改对接热点的账号密码
180修改`wifi_sta_connect.c`第51行和52行的热点账号密码。
181```c
182#define SELECT_WIFI_SSID "BearPi"
183#define SELECT_WIFI_PASSWORD "0987654321"
184```
185### 修改 BUILD.gn 文件
186
187修改 `device\bearpi\bearpi_hm_nano\app` 路径下 BUILD.gn 文件,指定 `wifi_sta_connect` 参与编译。
188```r
189#"D1_iot_wifi_sta:wifi_sta",
190"D2_iot_wifi_sta_connect:wifi_sta_connect",
191#"D3_iot_udp_client:udp_client",
192#"D4_iot_tcp_server:tcp_server",
193#"D5_iot_mqtt:iot_mqtt",
194#"D6_iot_cloud_oc:oc_mqtt",
195```
196
197
198
199### 运行结果
200
201示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,会打印连接到的Wifi热点信息。
202```
203<--System Init-->
204
205<--Wifi Init-->
206
207register wifi event succeed!
208
209+NOTICE:SCANFINISH
210WaitSacnResult:wait success[1]s
211
212
213Select: 2 wireless, Waiting...
214
215+NOTICE:CONNECTED
216callback function for wifi connect
217
218WaitConnectResult:wait success[1]s
219WiFi connect succeed!
220
221begain to dhcp
222
223<-- DHCP state:Inprogress -->
224
225<-- DHCP state:OK -->
226
227server :
228 server_id : 192.168.0.1
229 mask : 255.255.255.0, 1
230 gw : 192.168.0.1
231 T0 : 7200
232 T1 : 3600
233 T2 : 6300
234clients <1> :
235 mac_idx mac addr state lease tries rto
236 0 801131801388 192.168.0.151 10 0 1 4
237
238```
239
240