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