README_zh.md
1# NiobeU4开发板WIFI使用说明文档
2
3## 简介
4WLAN组件为设备提供接入与使用WLAN的相关接口,包括开启、关闭WLAN,扫描、监听WLAN状态等。本案例程序将演示怎么在Niobeu4开发板上使用wifi,编写一个客户端连接socket发包的业务程序,实现开发板联网与服务端进行数据通信。
5
6## 接口说明
7
8### EnableWifi()
9
10```
11WifiErrorCode EnableWifi(void);
12```
13
14**描述:**
15
16Wifi enable打开wifi函数。
17
18### DisableWifi()
19
20```
21int32_t DisableWifi(void);
22```
23
24**描述:**
25
26wifi disable关闭wifi函数。
27
28### Scan()
29
30```
31int32_t Scan(void);
32```
33
34**描述:**
35
36wifi scan扫描函数。
37
38### GetScanInfoList()
39
40```
41int32_t GetScanInfoList(WifiScanInfo* result, unsigned int* size);
42```
43
44**描述:**
45
46wifi GetScanInfoList获取扫描列表函数。
47
48**参数:**
49
50| 名字 | 描述 |
51| :----- | :----------- |
52| result | 扫描结果指针 |
53| size | 扫描wifi总数 |
54
55### AddDeviceConfig()
56
57```
58int32_t AddDeviceConfig(const WifiDeviceConfig* config, int* result);
59```
60
61**描述:**
62
63wifi GetScanInfoList获取扫描列表函数。
64
65**参数:**
66
67| 名字 | 描述 |
68| :----- | :----------------------------------------- |
69| config | wifi配置结构体指针,用于连接指定的Wi-Fi设备 |
70| result | netid |
71
72### WiFiInit()
73
74```
75void WiFiInit(void);
76```
77
78**描述:**
79
80wifi init初始化wifi函数。
81
82### WifiConnect()
83
84```
85int32_t WifiConnect(const char *ssid, const char *psk);
86```
87
88**描述:**
89
90wifi init初始化wifi函数。
91
92**参数:**
93
94| 名字 | 描述 |
95| :--- | :------- |
96| ssid | WiFi名称 |
97| psk | WiFi密码 |
98
99## 约束
100WLAN服务组件使用C语言编写,目前支持niobeu4开发板。
101
102## 使用
103- 设备需要完成以下开发步骤,以开启WLAN:
104
105 ```
106 //开启WLAN
107 WifiErrorCode error = EnableWifi();
108 if (error != WIFI_SUCCESS) {
109 return;
110 }
111 ```
112
113- 设备需要完成以下开发步骤,以触发WLAN扫描:
114
115 ```
116 //开启WLAN
117 WifiErrorCode error = Scan();
118 if (error != WIFI_SUCCESS) {
119 return;
120 }
121 ```
122
123- 设备需要完成以下开发步骤,以获取WLAN扫描结果:
124
125 ```
126 WifiScanInfo* infoList = malloc(sizeof(WifiScanInfo) * WIFI_SCAN_HOTSPOT_LIMIT);//WIFI_SCAN_HOTSPOT_LIMIT:wifi连接设备数量设置,默认64
127 unsigned int size = WIFI_SCAN_HOTSPOT_LIMIT;
128 error = GetScanInfoList(infoList, &size);
129 if (error != WIFI_SUCCESS || size == 0) {
130 return;
131 }
132 ```
133
134- 设备需要完成以下开发步骤,以配置接入点的接入方式:
135
136 ```
137 int netId = 0;
138 WifiDeviceConfig config = {0};
139 config.freq = 20;
140 config.securityType = WIFI_SEC_TYPE_PSK;
141 config.wapiPskType = WIFI_PSK_TYPE_ASCII;
142 memcpy_s(config.ssid, WIFI_MAX_SSID_LEN, "Sample", 10); //在这里输入待连接WLAN的名称
143 unsigned char bssid[WIFI_MAC_LEN] = {0xac, 0x75, 0x1d, 0xd8, 0x55, 0xc1}; //在这里输入待连接WLAN的BSSID
144 memcpy_s(config.bssid, WIFI_MAC_LEN, bssid, WIFI_MAC_LEN);
145 memcpy_s(config.preSharedKey, WIFI_MAX_KEY_LEN, "1234567890", 10); //在这里输入待连接WLAN的口令
146 WifiErrorCode error = AddDeviceConfig(&config, &netId);
147 if (error != WIFI_SUCCESS || netId == 0) {
148 return;
149 }
150 ```
151
152- 设备需要完成以下开发步骤,以连接配置的WLAN:
153
154 ```
155 error = ConnectTo(netId); //netId来自上一步
156 if (error != WIFI_SUCCESS) {
157 return;
158 }
159 ```
160
161## 案例程序
162
163### Socket发包业务Demo
164
165在Niobeu4开发板上使用wifi,编写一个客户端连接socket发包的业务程序,实现开发板联网与服务端进行数据通信。
166
167```
168#include <stdio.h>
169#include "cmsis_os2.h"
170#include "ohos_run.h"
171#include "lwip/sockets.h"
172#include "lwip/ip_addr.h"
173#include "wifi_device.h"
174
175#define WIFI_NAME "HUAWEIP40"
176#define WIFI_PWD "houpengfei8"
177#define SERVER_IP "192.168.8.140"
178#define SERVER_PORT 8080
179
180osThreadId_t wifi_test_id = NULL;
181
182void wifi_test(void *thread_param)
183{
184 int sock = -1;
185 struct sockaddr_in client_addr;
186 char recv_data[512]={0};
187 int recv_data_len;
188
189 WifiConnect(WIFI_NAME,WIFI_PWD);//连接指定设备
190
191 printf("start wifi_test test\r\n");
192 while(1) {
193 /* 申请套接字,本质是netconn_new函数的封装 */
194 sock = socket(AF_INET, SOCK_STREAM, 0);
195 if (sock < 0){
196 printf("Socket error\n");
197 osDelay(100);
198 continue;
199 }
200 /* 清空sockaddr_in结构体内存空间 */
201 memset(&(client_addr), 0, sizeof(client_addr));
202
203 /* 为sockaddr_in结构体成员赋值,用于以下的connect绑定 */
204 client_addr.sin_family = AF_INET;
205 client_addr.sin_port = htons(SERVER_PORT);
206 client_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
207
208
209 printf("try connect to server "SERVER_IP":%d\n",SERVER_PORT);
210 /* 将远端server的ip地址与端口进行绑定 */
211 if (connect(sock, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1) {
212 closesocket(sock);
213 osDelay(1000);
214 continue;
215 }
216
217 printf("Connect to tcp server successful!\n");
218 while(1){
219 /* 成功接收到数据,返回接收的数据长度 */
220 recv_data_len = recv(sock, recv_data, 511, 0);
221 if (recv_data_len <= 0) break;
222 else
223 recv_data[recv_data_len] = '\0';
224
225 /* 串口打印接收的数据内容 */
226 printf("recv:%s\n",recv_data);
227 /* 发送数据内容 */
228 write(sock,recv_data,recv_data_len);
229 }
230 }
231}
232
233static void wifi_test_example(void)
234{
235 osThreadAttr_t attr;
236 attr.name = "wifi_test";
237 attr.attr_bits = 0U;
238 attr.cb_mem = NULL;
239 attr.cb_size = 0U;
240 attr.stack_mem = NULL;
241 attr.stack_size = 1024 * 4;
242 attr.priority = 25;
243 wifi_test_id = osThreadNew((osThreadFunc_t)wifi_test, NULL, &attr);
244 if (wifi_test_id == NULL){
245 printf("Failed to create wifi_test thread!\n");
246 }
247}
248
249OHOS_APP_RUN(wifi_test_example);
250
251```
252
253通过百度搜索调试工具“NetAssist.exe”,下载以后配置SERVER_LISTEN_PORT和IP_ADDRESS,开启服务端接收niobeu4开发板发送的消息。
254