• Home
Name Date Size #Lines LOC

..--

BUILD.gnD12-May-2024855 2621

README.mdD12-May-20245.8 KiB240176

wifi_sta_connect.cD12-May-20247.4 KiB263206

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