1 /*
2 * Copyright (c) 2022 Hunan OpenValley Digital Industry Development Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "esp_wifi.h"
16 #include "cmsis_os2.h"
17 #include "esp_event.h"
18 #include "esp_event_legacy.h"
19 #include "los_memory.h"
20 #include "los_mux.h"
21 #include "los_task.h"
22 #include "lwip/err.h"
23 #include "lwip/sockets.h"
24 #include "lwip/tcpip.h"
25 #include "station_info.h"
26 #include "wifi_error_code.h"
27 #include "wifi_event.h"
28 #include "wifi_hotspot.h"
29 #include "wifi_linked_info.h"
30 #include "wifi_device.h"
31
32 #undef LOG
33 #undef LOGE
34
35 #define LOG
36 #define LOGE(fmt, ...) printf("Error %s%s." fmt "\r\n", TAG, __func__, ##__VA_ARGS__)
37
38 #define CHANNEL_80211B_ONLY 14
39 #define FREQ_OF_CHANNEL_1 2412
40 #define FREQ_OF_CHANNEL_80211B_ONLY 2484
41 #define WIFI_MIN_CHANNEL 1
42 #define WIFI_FREQ_INTERVAL 5
43 #define ESP_EXAMPLE_MAX_STA_CONN 4
44
45 #define RSSI_LEVEL_4_2_G (-65)
46 #define RSSI_LEVEL_3_2_G (-75)
47 #define RSSI_LEVEL_2_2_G (-82)
48 #define RSSI_LEVEL_1_2_G (-88)
49 #define RSSI_LEVEL_4_5_G (-65)
50 #define RSSI_LEVEL_3_5_G (-72)
51 #define RSSI_LEVEL_2_5_G (-79)
52 #define RSSI_LEVEL_1_5_G (-85)
53
54 #define WIFI_ACTIVE 1
55 #define WIFI_NOT_ACTIVE 0
56 #define EPS_STR_LEN 4
57 #define DELAY_10_TICK 10
58 #define DELAY_30_TICK 30
59 #define DELAY_50_TICK 50
60 #define DELAY_LOOP_TIMES 50
61 #define MAX_INDEX 60
62 #define MUX_HANDLE_OFFSET 8
63 #define ERROR_ESP_WIFI_START (-103)
64 #define ERROR_NETIF_NULL (-8)
65 #define ERROR_REGISTER_FAIL (-9)
66 #define SCANING 0x50
67
68 typedef struct {
69 volatile uint8_t ip_ok;
70 volatile uint8_t scan_ok;
71 union {
72 uint8_t staStatus;
73 uint8_t apStatus;
74 };
75 WifiEvent *event[WIFI_MAX_EVENT_SIZE];
76 esp_netif_t *netif;
77 WifiDeviceConfig config[WIFI_MAX_CONFIG_SIZE];
78 HotspotConfig hotConfig[1];
79 UINT32 muxHandle;
80 esp_event_handler_instance_t eventHandle[2];
81 } DevWifiInfo_t;
82
83 static DevWifiInfo_t DevWifiInfo = {0};
84 static const char TAG[] = {"WifiLite."};
85 static const char NullBssid[WIFI_MAC_LEN] = {0, 0, 0, 0, 0, 0};
86
MEMCPY_S(VOID * dst,int dstSize,VOID * src,int srcSize)87 static void MEMCPY_S(VOID *dst, int dstSize, VOID *src, int srcSize)
88 {
89 if ((dst == NULL) || (src == NULL)) {
90 return;
91 }
92 int ret;
93 ret = memcpy_s(dst, dstSize, src, (dstSize > srcSize) ? srcSize : dstSize);
94 if (ret != 0) {
95 LOGE("memcpy_s fail!!\n");
96 }
97 }
98
WifiLock(void)99 static void WifiLock(void)
100 {
101 if (!DevWifiInfo.muxHandle) {
102 UINT32 muxHandle = 0;
103 if (LOS_OK != LOS_MuxCreate(&muxHandle)) {
104 LOGE("LOS_MuxCreate");
105 return;
106 }
107 DevWifiInfo.muxHandle = muxHandle + MUX_HANDLE_OFFSET;
108 }
109 LOS_MuxPend(DevWifiInfo.muxHandle - MUX_HANDLE_OFFSET, LOS_WAIT_FOREVER);
110 }
111
WifiUnlock(void)112 static void WifiUnlock(void)
113 {
114 if (!DevWifiInfo.muxHandle)
115 return;
116 LOS_MuxPost(DevWifiInfo.muxHandle - MUX_HANDLE_OFFSET);
117 }
118
IsWifiActive(void)119 int IsWifiActive(void)
120 {
121 return ((DevWifiInfo.staStatus == WIFI_ACTIVE) ? WIFI_STA_ACTIVE : WIFI_STA_NOT_ACTIVE);
122 }
123
UnRegisterWifiEvent(const WifiEvent * event)124 WifiErrorCode UnRegisterWifiEvent(const WifiEvent *event)
125 {
126 WifiErrorCode ret = ERROR_WIFI_UNKNOWN;
127 if (!event)
128 return ERROR_WIFI_INVALID_ARGS;
129
130 WifiLock();
131 for (unsigned i = 0; i < WIFI_MAX_EVENT_SIZE; i++) {
132 if (DevWifiInfo.event[i] == event) {
133 DevWifiInfo.event[i] = NULL;
134 ret = WIFI_SUCCESS;
135 break;
136 }
137 }
138 WifiUnlock();
139
140 return ret;
141 }
142
RegisterWifiEvent(WifiEvent * event)143 WifiErrorCode RegisterWifiEvent(WifiEvent *event)
144 {
145 WifiErrorCode ret = ERROR_WIFI_UNKNOWN;
146
147 if (event == NULL) {
148 return ERROR_WIFI_INVALID_ARGS;
149 }
150
151 WifiLock();
152 for (unsigned i = 0; i < WIFI_MAX_EVENT_SIZE; i++) {
153 if (DevWifiInfo.event[i] == event) {
154 ret = ERROR_WIFI_INVALID_ARGS;
155 break;
156 }
157 if (DevWifiInfo.event[i] == NULL) {
158 DevWifiInfo.event[i] = event;
159 ret = WIFI_SUCCESS;
160 break;
161 }
162 }
163 WifiUnlock();
164 return ret;
165 }
166
ChannelToFrequency(unsigned int channel)167 static unsigned int ChannelToFrequency(unsigned int channel)
168 {
169 if (channel <= 0) {
170 return 0;
171 }
172 if (channel == CHANNEL_80211B_ONLY) {
173 return FREQ_OF_CHANNEL_80211B_ONLY;
174 }
175 return (((channel - WIFI_MIN_CHANNEL) * WIFI_FREQ_INTERVAL) + FREQ_OF_CHANNEL_1);
176 }
177
FrequencyToChannel(unsigned int frequency)178 static unsigned int FrequencyToChannel(unsigned int frequency)
179 {
180 if (frequency == FREQ_OF_CHANNEL_80211B_ONLY) {
181 return CHANNEL_80211B_ONLY;
182 }
183 if (frequency < FREQ_OF_CHANNEL_1) {
184 return 0;
185 }
186 return (frequency - FREQ_OF_CHANNEL_1) / WIFI_FREQ_INTERVAL + WIFI_MIN_CHANNEL;
187 }
188
189 /** Scan state change */
SendOnWifiScanStateChanged(DevWifiInfo_t * info,WifiEventState event,uint16_t size)190 static void SendOnWifiScanStateChanged(DevWifiInfo_t *info, WifiEventState event, uint16_t size)
191 {
192 WifiEvent **pevent = info->event;
193 for (unsigned i = 0; i < WIFI_MAX_EVENT_SIZE; i++) {
194 if (pevent[i] == NULL) {
195 continue;
196 }
197 if (pevent[i]->OnWifiScanStateChanged == NULL) {
198 continue;
199 }
200 pevent[i]->OnWifiScanStateChanged(event, size);
201 }
202 }
203
204 /** Connection state change */
SendOnWifiConnectionChanged(DevWifiInfo_t * info,WifiEventState event,WifiLinkedInfo * linkInfo)205 static void SendOnWifiConnectionChanged(DevWifiInfo_t *info, WifiEventState event, WifiLinkedInfo *linkInfo)
206 {
207 WifiEvent **pevent = info->event;
208 for (unsigned i = 0; i < WIFI_MAX_EVENT_SIZE; i++) {
209 if (pevent[i] == NULL) {
210 continue;
211 }
212 if (pevent[i]->OnWifiConnectionChanged == NULL) {
213 continue;
214 }
215 pevent[i]->OnWifiConnectionChanged(event, linkInfo);
216 }
217 }
218
219 /** Station connected */
SendOnHotspotStaJoin(DevWifiInfo_t * info,StationInfo * staInfo)220 static void SendOnHotspotStaJoin(DevWifiInfo_t *info, StationInfo *staInfo)
221 {
222 WifiEvent **pevent = info->event;
223 for (unsigned i = 0; i < WIFI_MAX_EVENT_SIZE; i++) {
224 if (pevent[i] == NULL) {
225 continue;
226 }
227 if (pevent[i]->OnHotspotStaJoin == NULL) {
228 continue;
229 }
230 pevent[i]->OnHotspotStaJoin(staInfo);
231 }
232 }
233
234 /** Station disconnected */
SendOnHotspotStaLeave(DevWifiInfo_t * info,StationInfo * staInfo)235 static void SendOnHotspotStaLeave(DevWifiInfo_t *info, StationInfo *staInfo)
236 {
237 WifiEvent **pevent = info->event;
238 for (unsigned i = 0; i < WIFI_MAX_EVENT_SIZE; i++) {
239 if (pevent[i] == NULL) {
240 continue;
241 }
242 if (pevent[i]->OnHotspotStaLeave == NULL) {
243 continue;
244 }
245 pevent[i]->OnHotspotStaLeave(staInfo);
246 }
247 }
248
249 /** Hotspot state change */
SendOnHotspotStateChanged(DevWifiInfo_t * info,WifiEventState event)250 static void SendOnHotspotStateChanged(DevWifiInfo_t *info, WifiEventState event)
251 {
252 WifiEvent **pevent = info->event;
253 for (unsigned i = 0; i < WIFI_MAX_EVENT_SIZE; i++) {
254 if (pevent[i] == NULL) {
255 continue;
256 }
257 if (pevent[i]->OnHotspotStateChanged == NULL) {
258 continue;
259 }
260 pevent[i]->OnHotspotStateChanged(event);
261 }
262 }
263
event_got_ip_handler(VOID * arg,esp_event_base_t event_base,int32_t event_id,VOID * event_data)264 static void event_got_ip_handler(VOID *arg, esp_event_base_t event_base,
265 int32_t event_id, VOID *event_data)
266 {
267 DevWifiInfo.ip_ok = 1;
268 }
269
wifi_event_scan_down_proc(VOID * event_data)270 static void wifi_event_scan_down_proc(VOID *event_data)
271 {
272 uint16_t size = 0;
273 DevWifiInfo.scan_ok = 1;
274 esp_wifi_scan_get_ap_num(&size);
275 SendOnWifiScanStateChanged(&DevWifiInfo, WIFI_STATE_AVAILABLE, size);
276 }
277
wifi_event_sta_connected_proc(VOID * event_data)278 static void wifi_event_sta_connected_proc(VOID *event_data)
279 {
280 WifiLinkedInfo linkInfo = {0};
281 wifi_ap_record_t ap_info;
282 esp_wifi_sta_get_ap_info(&ap_info);
283 MEMCPY_S(&linkInfo.ssid, sizeof(linkInfo.ssid), ap_info.ssid, sizeof(ap_info.ssid));
284 MEMCPY_S(&linkInfo.bssid, sizeof(linkInfo.bssid), ap_info.bssid, sizeof(ap_info.bssid));
285 linkInfo.rssi = ap_info.rssi;
286 linkInfo.connState = WIFI_CONNECTED;
287 linkInfo.frequency = ChannelToFrequency(ap_info.primary);
288 SendOnWifiConnectionChanged(&DevWifiInfo, WIFI_STATE_AVAILABLE, &linkInfo);
289 }
290
wifi_event_sta_disconnected_proc(VOID * event_data)291 static void wifi_event_sta_disconnected_proc(VOID *event_data)
292 {
293 WifiLinkedInfo linkInfo = {0};
294 wifi_event_sta_disconnected_t *disconnected = (wifi_event_sta_disconnected_t *)event_data;
295 MEMCPY_S(&linkInfo.ssid, sizeof(linkInfo.ssid), disconnected->ssid, sizeof(disconnected->ssid));
296 MEMCPY_S(&linkInfo.bssid, sizeof(linkInfo.bssid), disconnected->bssid, sizeof(disconnected->bssid));
297 linkInfo.disconnectedReason = disconnected->reason;
298 linkInfo.connState = WIFI_DISCONNECTED;
299 SendOnWifiConnectionChanged(&DevWifiInfo, WIFI_STATE_NOT_AVAILABLE, &linkInfo);
300 }
301
wifi_event_ap_connected_proc(VOID * event_data)302 static void wifi_event_ap_connected_proc(VOID *event_data)
303 {
304 StationInfo staInfo = {0};
305 wifi_event_ap_staconnected_t *connect_event = (wifi_event_ap_staconnected_t *)event_data;
306 MEMCPY_S(&staInfo.macAddress, sizeof(staInfo.macAddress), connect_event->mac, sizeof(connect_event->mac));
307 SendOnHotspotStaJoin(&DevWifiInfo, &staInfo);
308 }
309
wifi_event_ap_disconnected_proc(VOID * event_data)310 static void wifi_event_ap_disconnected_proc(VOID *event_data)
311 {
312 StationInfo staInfo = {0};
313 wifi_event_ap_stadisconnected_t *disconnect_event = (wifi_event_ap_stadisconnected_t *)event_data;
314 MEMCPY_S(&staInfo.macAddress, sizeof(staInfo.macAddress),
315 disconnect_event->mac, sizeof(disconnect_event->mac));
316 staInfo.disconnectedReason = WIFI_REASON_UNSPECIFIED;
317 SendOnHotspotStaLeave(&DevWifiInfo, &staInfo);
318 }
319
wifi_event_ap_start_proc(VOID * event_data)320 static void wifi_event_ap_start_proc(VOID *event_data)
321 {
322 SendOnHotspotStateChanged(&DevWifiInfo, WIFI_STATE_AVAILABLE);
323 }
324
event_handler(VOID * arg,esp_event_base_t event_base,int32_t event_id,VOID * event_data)325 static void event_handler(VOID *arg, esp_event_base_t event_base,
326 int32_t event_id, VOID *event_data)
327 {
328 LOG("event=%d", event_id);
329 switch (event_id) {
330 case WIFI_EVENT_SCAN_DONE:
331 wifi_event_scan_down_proc(event_data);
332 break;
333 case WIFI_EVENT_STA_CONNECTED:
334 wifi_event_sta_connected_proc(event_data);
335 break;
336 case WIFI_EVENT_STA_DISCONNECTED:
337 wifi_event_sta_disconnected_proc(event_data);
338 break;
339 case WIFI_EVENT_AP_STACONNECTED:
340 wifi_event_ap_connected_proc(event_data);
341 break;
342 case WIFI_EVENT_AP_STADISCONNECTED:
343 wifi_event_ap_disconnected_proc(event_data);
344 break;
345 case WIFI_EVENT_AP_START:
346 wifi_event_ap_start_proc(event_data);
347 break;
348 default:
349 break;
350 }
351 }
352
DeviceWifiStart(void)353 int DeviceWifiStart(void)
354 {
355 esp_err_t err;
356 DevWifiInfo_t *info = &DevWifiInfo;
357 MEMCPY_S(info, sizeof(DevWifiInfo_t), 0, sizeof(*info));
358 for (unsigned i = 0; i < WIFI_MAX_CONFIG_SIZE; i++) {
359 info->config[i].netId = WIFI_CONFIG_INVALID;
360 }
361
362 err = esp_netif_init();
363 if (err != ESP_OK) {
364 LOGE("esp_netif_init.err=0x%X", err);
365 }
366
367 err = esp_event_loop_create_default();
368 if (err != ESP_OK) {
369 LOGE("esp_event_loop_create_default.err=0x%X", err);
370 }
371
372 wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
373 cfg.nvs_enable = 0;
374 err = esp_wifi_init(&cfg);
375 if (err != ESP_OK) {
376 LOGE("esp_wifi_init.err=0x%X", err);
377 }
378
379 esp_wifi_set_storage(WIFI_STORAGE_RAM);
380
381 return 0;
382 }
383
UnregisterEspEvent(void)384 static void UnregisterEspEvent(void)
385 {
386 DevWifiInfo_t *info = &DevWifiInfo;
387 WifiLock();
388 DevWifiInfo.ip_ok = 0;
389 DevWifiInfo.scan_ok = 0;
390 if (info->eventHandle[0] != NULL) {
391 esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, info->eventHandle[0]);
392 info->eventHandle[0] = NULL;
393 }
394 if (info->eventHandle[1] != NULL) {
395 esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, info->eventHandle[1]);
396 info->eventHandle[1] = NULL;
397 }
398 if (info->netif != NULL) {
399 esp_netif_destroy(info->netif);
400 info->netif = NULL;
401 }
402 WifiUnlock();
403 }
404
RegisterEspEvent(int apMode)405 static int RegisterEspEvent(int apMode)
406 {
407 esp_err_t err;
408 DevWifiInfo_t *info = &DevWifiInfo;
409 WifiLock();
410 if (apMode) {
411 info->netif = esp_netif_create_default_wifi_ap();
412 } else {
413 info->netif = esp_netif_create_default_wifi_sta();
414 }
415 err = esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, event_handler,
416 NULL, &info->eventHandle[0]);
417 if (err != ESP_OK) {
418 LOGE("WIFI_EVENT err=0x%X", err);
419 }
420 err = esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, event_got_ip_handler,
421 NULL, &info->eventHandle[1]);
422 if (err != ESP_OK) {
423 LOGE("IP_EVENT err=0x%X", err);
424 }
425 err = esp_wifi_set_storage(WIFI_STORAGE_RAM);
426 if (err != ESP_OK) {
427 LOGE("set_storage err=0x%X", err);
428 }
429 err = esp_wifi_set_mode(apMode ? WIFI_MODE_AP : WIFI_MODE_STA);
430 if (err != ESP_OK) {
431 LOGE("set_mode(%d) err=0x%X", apMode, err);
432 }
433 WifiUnlock();
434 return (info->netif == NULL) ? ERROR_NETIF_NULL : (err ? ERROR_REGISTER_FAIL : 0);
435 }
436
EnableWifi(void)437 WifiErrorCode EnableWifi(void)
438 {
439 DevWifiInfo_t *info = &DevWifiInfo;
440 int err = 0;
441
442 if (info->staStatus == WIFI_ACTIVE) {
443 return ERROR_WIFI_BUSY;
444 }
445 UnregisterEspEvent();
446 err = RegisterEspEvent(0);
447 if (err == 0) {
448 WifiLock();
449 while (1) {
450 if (esp_wifi_start() != ESP_OK) {
451 err = ERROR_ESP_WIFI_START;
452 break;
453 }
454 info->staStatus = WIFI_ACTIVE;
455 break;
456 }
457 WifiUnlock();
458 }
459 if (err) {
460 LOGE("err=%d", err);
461 return ERROR_WIFI_IFACE_INVALID;
462 }
463 return WIFI_SUCCESS;
464 }
465
DisableWifi(void)466 WifiErrorCode DisableWifi(void)
467 {
468 DevWifiInfo_t *info = &DevWifiInfo;
469 if (info->staStatus == WIFI_NOT_ACTIVE) {
470 return ERROR_WIFI_NOT_STARTED;
471 }
472 WifiLock();
473 info->staStatus = WIFI_NOT_ACTIVE;
474 esp_wifi_disconnect();
475 UnregisterEspEvent();
476 esp_wifi_stop();
477 WifiUnlock();
478 return WIFI_SUCCESS;
479 }
480
Scan(void)481 WifiErrorCode Scan(void)
482 {
483 wifi_scan_config_t config = {0};
484 DevWifiInfo_t *info = &DevWifiInfo;
485 WifiDeviceConfig *pconfig;
486 if (info->staStatus != WIFI_ACTIVE) {
487 return ERROR_WIFI_NOT_STARTED;
488 }
489 SendOnWifiScanStateChanged(info, WIFI_STATE_NOT_AVAILABLE, 0);
490
491 esp_wifi_scan_stop();
492 if (esp_wifi_scan_start(NULL, false) != ESP_OK) {
493 return ERROR_WIFI_UNKNOWN;
494 }
495 info->scan_ok = SCANING;
496 return WIFI_SUCCESS;
497 }
498
AddDeviceConfig(const WifiDeviceConfig * config,int * result)499 WifiErrorCode AddDeviceConfig(const WifiDeviceConfig *config, int *result)
500 {
501 DevWifiInfo_t *info = &DevWifiInfo;
502 if (!config)
503 return ERROR_WIFI_INVALID_ARGS;
504 WifiLock();
505 for (unsigned i = 0; i < WIFI_MAX_CONFIG_SIZE; i++) {
506 if (info->config[i].netId != i) {
507 MEMCPY_S(&info->config[i], sizeof(WifiDeviceConfig), config, sizeof(WifiDeviceConfig));
508 info->config[i].netId = i;
509 WifiUnlock();
510 if (result) {
511 *result = i;
512 }
513 return WIFI_SUCCESS;
514 }
515 }
516 WifiUnlock();
517 if (result) {
518 *result = 0;
519 }
520 return ERROR_WIFI_BUSY;
521 }
522
GetDeviceConfigs(WifiDeviceConfig * result,unsigned int * size)523 WifiErrorCode GetDeviceConfigs(WifiDeviceConfig *result, unsigned int *size)
524 {
525 unsigned retIndex = 0, maxIndex;
526 DevWifiInfo_t *info = &DevWifiInfo;
527 if ((!result) || (!size))
528 return ERROR_WIFI_INVALID_ARGS;
529 if (!*size)
530 return ERROR_WIFI_INVALID_ARGS;
531 maxIndex = *size;
532
533 WifiLock();
534 for (unsigned i = 0; i < WIFI_MAX_CONFIG_SIZE; i++) {
535 if (info->config[i].netId != i) {
536 continue;
537 }
538 MEMCPY_S(&result[retIndex++], sizeof(WifiDeviceConfig), &info->config[i], sizeof(WifiDeviceConfig));
539 if (maxIndex < retIndex) {
540 break;
541 }
542 }
543 WifiUnlock();
544
545 if (retIndex == 0) {
546 return ERROR_WIFI_NOT_AVAILABLE;
547 }
548 *size = retIndex;
549 return WIFI_SUCCESS;
550 }
551
RemoveDevice(int networkId)552 WifiErrorCode RemoveDevice(int networkId)
553 {
554 DevWifiInfo_t *info = &DevWifiInfo;
555 if ((networkId >= WIFI_MAX_CONFIG_SIZE) || (networkId < 0)) {
556 return ERROR_WIFI_INVALID_ARGS;
557 }
558
559 WifiLock();
560 MEMCPY_S(&info->config[networkId], sizeof(WifiDeviceConfig), 0, sizeof(WifiDeviceConfig));
561 info->config[networkId].netId = WIFI_CONFIG_INVALID;
562 WifiUnlock();
563 return WIFI_SUCCESS;
564 }
565
GetDeviceMacAddress(unsigned char * result)566 WifiErrorCode GetDeviceMacAddress(unsigned char *result)
567 {
568 if (!result) {
569 return ERROR_WIFI_INVALID_ARGS;
570 }
571
572 if (esp_wifi_get_mac(WIFI_IF_STA, (uint8_t *)result) != ESP_OK) {
573 return ERROR_WIFI_UNKNOWN;
574 }
575
576 return WIFI_SUCCESS;
577 }
ESPSecToHoSec(wifi_auth_mode_t mode)578 static WifiSecurityType ESPSecToHoSec(wifi_auth_mode_t mode)
579 {
580 switch (mode) {
581 case WIFI_AUTH_OPEN:
582 return WIFI_SEC_TYPE_OPEN;
583 case WIFI_AUTH_WEP:
584 return WIFI_SEC_TYPE_WEP;
585 case WIFI_AUTH_WPA_PSK:
586 case WIFI_AUTH_WPA2_PSK:
587 case WIFI_AUTH_WPA_WPA2_PSK:
588 return WIFI_SEC_TYPE_PSK;
589 case WIFI_AUTH_WPA3_PSK:
590 case WIFI_AUTH_WPA2_WPA3_PSK:
591 return WIFI_SEC_TYPE_SAE;
592 default:
593 return WIFI_SEC_TYPE_INVALID;
594 }
595 }
596
HoSecToESPSec(WifiSecurityType type)597 static wifi_auth_mode_t HoSecToESPSec(WifiSecurityType type)
598 {
599 switch (type) {
600 case WIFI_SEC_TYPE_OPEN:
601 return WIFI_SEC_TYPE_OPEN;
602 case WIFI_SEC_TYPE_WEP:
603 return WIFI_SEC_TYPE_WEP;
604 case WIFI_SEC_TYPE_PSK:
605 return WIFI_AUTH_WPA_PSK;
606 case WIFI_SEC_TYPE_SAE:
607 return WIFI_AUTH_WPA3_PSK;
608 default:
609 return WIFI_AUTH_MAX;
610 }
611 }
612
GetScanInfoListNext(WifiScanInfo * result,uint16_t ap_count,unsigned int * size)613 static int GetScanInfoListNext(WifiScanInfo *result, uint16_t ap_count, unsigned int *size)
614 {
615 DevWifiInfo_t *info = &DevWifiInfo;
616 wifi_ap_record_t *ap_info;
617 unsigned int maxi = *size;
618 info->scan_ok = 0x51;
619 esp_wifi_scan_get_ap_num(&ap_count);
620 if (maxi > ap_count) {
621 *size = maxi = ap_count;
622 }
623 if (maxi == 0) {
624 return WIFI_SUCCESS;
625 }
626 ap_info = (wifi_ap_record_t *)LOS_MemAlloc(OS_SYS_MEM_ADDR, sizeof(wifi_ap_record_t) * maxi);
627 if (!ap_info) {
628 return ERROR_WIFI_UNKNOWN;
629 }
630 for (int i = 0; i < maxi; ++i) {
631 MEMCPY_S(result[i].ssid, sizeof(result[i].ssid), ap_info[i].ssid, sizeof(ap_info[i].ssid));
632 MEMCPY_S(result[i].bssid, sizeof(result[i].bssid), ap_info[i].bssid, sizeof(ap_info[i].bssid));
633 result[i].securityType = ESPSecToHoSec(ap_info[i].authmode);
634 result[i].rssi = ap_info[i].rssi;
635 result[i].band = 0;
636 result[i].frequency = ChannelToFrequency(ap_info[i].primary);
637 }
638 LOS_MemFree(OS_SYS_MEM_ADDR, ap_info);
639 return WIFI_SUCCESS;
640 }
641
GetScanInfoList(WifiScanInfo * result,unsigned int * size)642 WifiErrorCode GetScanInfoList(WifiScanInfo *result, unsigned int *size)
643 {
644 DevWifiInfo_t *info = &DevWifiInfo;
645 uint16_t ap_count = 0;
646 unsigned int i, maxi;
647 if ((!result) || (!size) || (*size == 0)) {
648 return ERROR_WIFI_INVALID_ARGS;
649 }
650 if (info->staStatus != WIFI_ACTIVE) {
651 return ERROR_WIFI_NOT_STARTED;
652 }
653 if (info->scan_ok == SCANING) {
654 maxi = MAX_INDEX;
655 for (i = 0; (i < maxi) && (info->scan_ok == SCANING); ++i) {
656 LOS_Msleep(DELAY_50_TICK);
657 }
658 if (i >= maxi) {
659 return ERROR_WIFI_BUSY;
660 }
661 }
662 if (info->scan_ok != 1) {
663 wifi_ap_record_t t_info[1];
664 ap_count = 1;
665 esp_wifi_scan_get_ap_records(&ap_count, t_info);
666 *size = 0;
667 return WIFI_SUCCESS;
668 }
669 return GetScanInfoListNext(result, ap_count, size);
670 }
671
ConnectTo(int networkId)672 WifiErrorCode ConnectTo(int networkId)
673 {
674 WifiDeviceConfig *pconfig;
675 DevWifiInfo_t *info = &DevWifiInfo;
676 if ((networkId >= WIFI_MAX_CONFIG_SIZE) || (networkId < 0)) {
677 return ERROR_WIFI_INVALID_ARGS;
678 }
679 if (info->staStatus != WIFI_ACTIVE)
680 return ERROR_WIFI_NOT_AVAILABLE;
681
682 WifiLock();
683 pconfig = &info->config[networkId];
684 if (pconfig->netId != networkId) {
685 WifiUnlock();
686 return ERROR_WIFI_NOT_AVAILABLE;
687 }
688
689 info->ip_ok = 0;
690 WifiUnlock();
691
692 wifi_config_t assocReq = {0};
693 assocReq.sta.threshold.authmode = HoSecToESPSec(pconfig->securityType);
694 MEMCPY_S(assocReq.sta.ssid, sizeof(assocReq.sta.ssid), pconfig->ssid, sizeof(pconfig->ssid));
695 MEMCPY_S(assocReq.sta.password, sizeof(assocReq.sta.password),
696 pconfig->preSharedKey, sizeof(pconfig->preSharedKey));
697 MEMCPY_S(assocReq.sta.bssid, sizeof(assocReq.sta.bssid), pconfig->bssid, sizeof(pconfig->bssid));
698 assocReq.sta.channel = FrequencyToChannel(pconfig->freq);
699 assocReq.sta.pmf_cfg.capable = true;
700 assocReq.sta.pmf_cfg.required = false;
701 esp_wifi_set_config(WIFI_IF_STA, &assocReq);
702 if (esp_wifi_connect() != ESP_OK) {
703 return ERROR_WIFI_UNKNOWN;
704 }
705 for (int i = 0; i < DELAY_LOOP_TIMES; ++i) {
706 if (info->ip_ok == 1) {
707 break;
708 }
709 LOS_Msleep(DELAY_50_TICK);
710 }
711 return WIFI_SUCCESS;
712 }
713
Disconnect(void)714 WifiErrorCode Disconnect(void)
715 {
716 if (esp_wifi_disconnect() != ESP_OK) {
717 return ERROR_WIFI_UNKNOWN;
718 }
719 return WIFI_SUCCESS;
720 }
721
GetLinkedInfo(WifiLinkedInfo * result)722 WifiErrorCode GetLinkedInfo(WifiLinkedInfo *result)
723 {
724 DevWifiInfo_t *info = &DevWifiInfo;
725 esp_err_t err;
726 if (!result) {
727 return ERROR_WIFI_INVALID_ARGS;
728 }
729 MEMCPY_S(result, sizeof(WifiLinkedInfo), 0, sizeof(WifiLinkedInfo));
730 if (info->staStatus != WIFI_ACTIVE)
731 return ERROR_WIFI_NOT_STARTED;
732
733 wifi_ap_record_t ap_info = {0};
734 if (esp_wifi_sta_get_ap_info(&ap_info) != ESP_OK) {
735 result->connState = WIFI_DISCONNECTED;
736 return ERROR_WIFI_UNKNOWN;
737 }
738
739 MEMCPY_S(result->ssid, sizeof(result->ssid), ap_info.ssid, sizeof(ap_info.ssid));
740 MEMCPY_S(result->bssid, sizeof(result->bssid), ap_info.bssid, sizeof(ap_info.bssid));
741 result->connState = WIFI_CONNECTED;
742 result->rssi = ap_info.rssi;
743
744 esp_netif_ip_info_t ip_info;
745 err = esp_netif_get_ip_info(info->netif, &ip_info);
746 if (err != ESP_OK) {
747 LOGE("esp_netif_get_ip_info.err = %d", err);
748 return ERROR_WIFI_UNKNOWN;
749 }
750
751 result->ipAddress = ip_info.ip.addr;
752 return WIFI_SUCCESS;
753 }
754
IsHotspotActive(void)755 int IsHotspotActive(void)
756 {
757 return ((DevWifiInfo.staStatus == WIFI_ACTIVE) ? WIFI_HOTSPOT_ACTIVE : WIFI_HOTSPOT_NOT_ACTIVE);
758 }
759
DisableHotspot(void)760 WifiErrorCode DisableHotspot(void)
761 {
762 return DisableWifi();
763 }
764
GetStationList(StationInfo * result,unsigned int * size)765 WifiErrorCode GetStationList(StationInfo *result, unsigned int *size)
766 {
767 if ((!result) || (!size))
768 return ERROR_WIFI_INVALID_ARGS;
769 if (!*size)
770 return ERROR_WIFI_INVALID_ARGS;
771
772 wifi_sta_list_t wifi_sta_list = {0};
773 unsigned int staNum = 0;
774 esp_err_t ret = esp_wifi_ap_get_sta_list(&wifi_sta_list);
775 if (ret != ESP_OK) {
776 LOGE("esp_wifi_ap_get_sta_list.err=0x%X", ret);
777 return ERROR_WIFI_NOT_AVAILABLE;
778 }
779 staNum = wifi_sta_list.num;
780 if (*size < staNum) {
781 staNum = *size;
782 }
783 MEMCPY_S(result, (sizeof(result[0]) * staNum), 0, sizeof(result[0]) * staNum);
784 for (unsigned int i = 0; i < staNum; i++) {
785 MEMCPY_S(result[i].macAddress, sizeof(result[i].macAddress),
786 wifi_sta_list.sta[i].mac, sizeof(wifi_sta_list.sta[i].mac));
787 }
788 return WIFI_SUCCESS;
789 }
790
SetBand(int band)791 WifiErrorCode SetBand(int band)
792 {
793 DevWifiInfo_t *info = &DevWifiInfo;
794 if (band != HOTSPOT_BAND_TYPE_2G) {
795 return ERROR_WIFI_NOT_SUPPORTED;
796 }
797 info->hotConfig[0].band = band;
798 return WIFI_SUCCESS;
799 }
800
GetBand(int * result)801 WifiErrorCode GetBand(int *result)
802 {
803 DevWifiInfo_t *info = &DevWifiInfo;
804 if (result == NULL) {
805 return ERROR_WIFI_INVALID_ARGS;
806 }
807 if (info->hotConfig[0].band == 0) {
808 return ERROR_WIFI_NOT_AVAILABLE;
809 }
810 *result = (int)info->hotConfig[0].band;
811 return WIFI_SUCCESS;
812 }
813
SetHotspotConfig(const HotspotConfig * config)814 WifiErrorCode SetHotspotConfig(const HotspotConfig *config)
815 {
816 DevWifiInfo_t *info = &DevWifiInfo;
817 if (!config) {
818 return ERROR_WIFI_INVALID_ARGS;
819 }
820 WifiLock();
821 MEMCPY_S(&info->hotConfig[0], sizeof(HotspotConfig), config, sizeof(HotspotConfig));
822 WifiUnlock();
823 return WIFI_SUCCESS;
824 }
825
GetHotspotConfig(HotspotConfig * result)826 WifiErrorCode GetHotspotConfig(HotspotConfig *result)
827 {
828 DevWifiInfo_t *info = &DevWifiInfo;
829 if (result == NULL) {
830 return ERROR_WIFI_INVALID_ARGS;
831 }
832 WifiLock();
833 MEMCPY_S(result, sizeof(HotspotConfig), &info->hotConfig[0], sizeof(HotspotConfig));
834 WifiUnlock();
835 return WIFI_SUCCESS;
836 }
837
GetSignalLevel(int rssi,int band)838 int GetSignalLevel(int rssi, int band)
839 {
840 if (band == HOTSPOT_BAND_TYPE_2G) {
841 if (rssi >= RSSI_LEVEL_4_2_G) {
842 return RSSI_LEVEL_4;
843 }
844 if (rssi >= RSSI_LEVEL_3_2_G) {
845 return RSSI_LEVEL_3;
846 }
847 if (rssi >= RSSI_LEVEL_2_2_G) {
848 return RSSI_LEVEL_2;
849 }
850 if (rssi >= RSSI_LEVEL_1_2_G) {
851 return RSSI_LEVEL_1;
852 }
853 }
854
855 if (band == HOTSPOT_BAND_TYPE_5G) {
856 if (rssi >= RSSI_LEVEL_4_5_G) {
857 return RSSI_LEVEL_4;
858 }
859 if (rssi >= RSSI_LEVEL_3_5_G) {
860 return RSSI_LEVEL_3;
861 }
862 if (rssi >= RSSI_LEVEL_2_5_G) {
863 return RSSI_LEVEL_2;
864 }
865 if (rssi >= RSSI_LEVEL_1_5_G) {
866 return RSSI_LEVEL_1;
867 }
868 }
869 return ERROR_WIFI_INVALID_ARGS;
870 }
871
EnableHotspot(void)872 WifiErrorCode EnableHotspot(void)
873 {
874 int err;
875 DevWifiInfo_t *info = &DevWifiInfo;
876 if (info->apStatus == WIFI_ACTIVE) {
877 return ERROR_WIFI_BUSY;
878 }
879
880 UnregisterEspEvent();
881 err = RegisterEspEvent(1);
882 if (err) {
883 LOGE("esp_wifi_start.err=0x%X", err);
884 return ERROR_WIFI_INVALID_ARGS;
885 }
886
887 WifiLock();
888 wifi_config_t wifi_config = {0};
889 HotspotConfig *hotConfig = &info->hotConfig[0];
890 wifi_config.ap.channel = HOTSPOT_DEFAULT_CHANNEL;
891 if (hotConfig->channelNum) {
892 wifi_config.ap.channel = hotConfig->channelNum;
893 }
894 wifi_config.ap.authmode = HoSecToESPSec(hotConfig->securityType);
895 wifi_config.ap.max_connection = ESP_EXAMPLE_MAX_STA_CONN;
896 MEMCPY_S(wifi_config.ap.ssid, sizeof(wifi_config.ap.ssid), hotConfig->ssid, sizeof(hotConfig->ssid));
897 MEMCPY_S(wifi_config.ap.password, sizeof(wifi_config.ap.password),
898 hotConfig->preSharedKey, sizeof(hotConfig->preSharedKey));
899 wifi_config.ap.ssid_len = (uint8_t)strlen((const char *)wifi_config.ap.ssid);
900 if ((uint8_t)strlen((const char *)wifi_config.ap.password) == 0) {
901 wifi_config.ap.authmode = WIFI_AUTH_OPEN;
902 }
903
904 info->ip_ok = 0;
905
906 esp_wifi_set_config(WIFI_IF_AP, &wifi_config);
907 esp_err_t ret = esp_wifi_start();
908 if (ret != ESP_OK) {
909 LOGE("esp_wifi_start.err=0x%X", ret);
910 WifiUnlock();
911 return ERROR_WIFI_BUSY;
912 }
913
914 info->staStatus = WIFI_ACTIVE;
915 WifiUnlock();
916 LOS_Msleep(DELAY_10_TICK);
917 for (int i = 0; i < DELAY_LOOP_TIMES; ++i) {
918 if (info->ip_ok == 1) {
919 break;
920 }
921 LOS_Msleep(DELAY_30_TICK);
922 }
923 return WIFI_SUCCESS;
924 }
925
AdvanceScan(WifiScanParams * params)926 WifiErrorCode AdvanceScan(WifiScanParams *params)
927 {
928 DevWifiInfo_t *info = &DevWifiInfo;
929 if (params == NULL) {
930 return ERROR_WIFI_UNKNOWN;
931 }
932
933 if (info->staStatus != WIFI_ACTIVE) {
934 return ERROR_WIFI_NOT_STARTED;
935 }
936 SendOnWifiScanStateChanged(info, WIFI_STATE_NOT_AVAILABLE, 0);
937
938 wifi_scan_config_t config = {0};
939 if (params->scanType == WIFI_FREQ_SCAN) {
940 if (params->freqs <= 0) {
941 return ERROR_WIFI_UNKNOWN;
942 }
943 config.channel = FrequencyToChannel(params->freqs);
944 } else if (params->scanType == WIFI_SSID_SCAN) {
945 if (params->ssidLen == 0) {
946 return ERROR_WIFI_UNKNOWN;
947 }
948 config.ssid = (uint8_t *)params->ssid;
949 } else if (params->scanType == WIFI_BSSID_SCAN) {
950 if (!memcmp(NullBssid, params->bssid, WIFI_MAC_LEN)) {
951 return ERROR_WIFI_UNKNOWN;
952 }
953 config.bssid = (uint8_t *)params->bssid;
954 }
955 config.show_hidden = false;
956 config.scan_type = WIFI_SCAN_TYPE_ACTIVE;
957 config.scan_time.active.min = 0;
958 config.scan_time.active.max = 0;
959 config.scan_time.passive = 0;
960 esp_wifi_scan_stop();
961 if (esp_wifi_scan_start(&config, false) != ESP_OK) {
962 return ERROR_WIFI_BUSY;
963 }
964 info->scan_ok = SCANING;
965 return WIFI_SUCCESS;
966 }
967
GetHotspotChannel(void)968 int GetHotspotChannel(void)
969 {
970 DevWifiInfo_t *info = &DevWifiInfo;
971 if (info->apStatus != WIFI_ACTIVE) {
972 return ERROR_WIFI_NOT_STARTED;
973 }
974 wifi_config_t wifi_cfg = {0};
975 esp_err_t ret = esp_wifi_get_config(WIFI_IF_AP, &wifi_cfg);
976 if (ret != ESP_OK) {
977 return ERROR_WIFI_UNKNOWN;
978 }
979 return wifi_cfg.ap.channel;
980 }
981
GetHotspotInterfaceName(char * result,int size)982 WifiErrorCode GetHotspotInterfaceName(char *result, int size)
983 {
984 DevWifiInfo_t *info = &DevWifiInfo;
985 if (info->apStatus != WIFI_ACTIVE) {
986 return ERROR_WIFI_NOT_STARTED;
987 }
988 MEMCPY_S(result, size, "esp", EPS_STR_LEN);
989 return WIFI_SUCCESS;
990 }
991