SummerGift 7 лет назад
Родитель
Сommit
dadbf856e4
1 измененных файлов с 114 добавлено и 23 удалено
  1. 114 23
      port/network_wlan.c

+ 114 - 23
port/network_wlan.c

@@ -220,32 +220,123 @@ STATIC mp_obj_t *esp_scan_list = NULL;
 //    esp_scan_list = NULL;
 //}
 
-//STATIC mp_obj_t esp_scan(mp_obj_t self_in) {
-//    require_if(self_in, STATION_IF);
+void wlan_station_scan(void)
+{
+    if (esp_scan_list == NULL) {
+        // called unexpectedly
+        return;
+    }
+    
+    struct rt_wlan_scan_result *scan_result = RT_NULL;
+
+    /* scan ap info */
+    scan_result = rt_wlan_scan_sync();
+    if (scan_result)
+    {
+        int index, num;
+        char *security;
+
+        num = scan_result->num;
+//        rt_kprintf("             SSID                      MAC            security    rssi chn Mbps\n");
+//        rt_kprintf("------------------------------- -----------------  -------------- ---- --- ----\n");
+        for (index = 0; index < num; index ++)
+        {
+//            rt_kprintf("%-32.32s", &scan_result->info[index].ssid.val[0]);
+//            rt_kprintf("%02x:%02x:%02x:%02x:%02x:%02x  ",
+//                       scan_result->info[index].bssid[0],
+//                       scan_result->info[index].bssid[1],
+//                       scan_result->info[index].bssid[2],
+//                       scan_result->info[index].bssid[3],
+//                       scan_result->info[index].bssid[4],
+//                       scan_result->info[index].bssid[5]
+//                      );
+            switch (scan_result->info[index].security)
+            {
+            case SECURITY_OPEN:
+                security = "OPEN";
+                break;
+            case SECURITY_WEP_PSK:
+                security = "WEP_PSK";
+                break;
+            case SECURITY_WEP_SHARED:
+                security = "WEP_SHARED";
+                break;
+            case SECURITY_WPA_TKIP_PSK:
+                security = "WPA_TKIP_PSK";
+                break;
+            case SECURITY_WPA_AES_PSK:
+                security = "WPA_AES_PSK";
+                break;
+            case SECURITY_WPA2_AES_PSK:
+                security = "WPA2_AES_PSK";
+                break;
+            case SECURITY_WPA2_TKIP_PSK:
+                security = "WPA2_TKIP_PSK";
+                break;
+            case SECURITY_WPA2_MIXED_PSK:
+                security = "WPA2_MIXED_PSK";
+                break;
+            case SECURITY_WPS_OPEN:
+                security = "WPS_OPEN";
+                break;
+            case SECURITY_WPS_SECURE:
+                security = "WPS_SECURE";
+                break;
+            default:
+                security = "UNKNOWN";
+                break;
+            }
+//            rt_kprintf("%-14.14s ", security);
+//            rt_kprintf("%-4d ", scan_result->info[index].rssi);
+//            rt_kprintf("%3d ", scan_result->info[index].channel);
+//            rt_kprintf("%4d\n", scan_result->info[index].datarate / 1000000);
+            
+
+            mp_obj_tuple_t *t = mp_obj_new_tuple(6, NULL);
+            #if 1
+            // struct bss_info::ssid_len is not documented in SDK API Guide,
+            // but is present in SDK headers since 1.4.0
+            t->items[0] = mp_obj_new_bytes(&scan_result->info[index].ssid.val[0], strlen((char *)(&scan_result->info[index].ssid.val[0])));
+            #else
+            t->items[0] = mp_obj_new_bytes(bs->ssid, strlen((char*)bs->ssid));
+            #endif
+            t->items[1] = mp_obj_new_bytes(&scan_result->info[index].bssid[0], strlen((char *)(&scan_result->info[index].bssid[0])));
+            t->items[2] = MP_OBJ_NEW_SMALL_INT(scan_result->info[index].channel);
+            t->items[3] = MP_OBJ_NEW_SMALL_INT(scan_result->info[index].rssi);
+            t->items[4] = mp_obj_new_bytes((const byte *)security, strlen(security));
+            t->items[5] = MP_OBJ_NEW_SMALL_INT(0);
+            
+//            t->items[4] = MP_OBJ_NEW_SMALL_INT(bs->authmode);
+//            t->items[5] = MP_OBJ_NEW_SMALL_INT(bs->is_hidden);
+            mp_obj_list_append(*esp_scan_list, MP_OBJ_FROM_PTR(t));
+
+        }
+        rt_wlan_scan_result_clean();
+    }
+    else
+    {
+        rt_kprintf("wifi scan result is null\n");
+        *esp_scan_list = MP_OBJ_NULL;
+    }
+}
+
+STATIC mp_obj_t esp_scan(mp_obj_t self_in) {
+    require_if(self_in, STATION_IF);
 //    if ((wifi_get_opmode() & STATION_MODE) == 0) {
 //        nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError,
 //            "STA must be active"));
 //    }
-//    mp_obj_t list = mp_obj_new_list(0, NULL);
-//    esp_scan_list = &list;
-//    wifi_station_scan(NULL, (scan_done_cb_t)esp_scan_cb);
-//    while (esp_scan_list != NULL) {
-//        // our esp_scan_cb is called via ets_loop_iter so it's safe to set the
-//        // esp_scan_list variable to NULL without disabling interrupts
-//        if (MP_STATE_VM(mp_pending_exception) != NULL) {
-//            esp_scan_list = NULL;
-//            mp_obj_t obj = MP_STATE_VM(mp_pending_exception);
-//            MP_STATE_VM(mp_pending_exception) = MP_OBJ_NULL;
-//            nlr_raise(obj);
-//        }
-//        ets_loop_iter();
-//    }
-//    if (list == MP_OBJ_NULL) {
-//        nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "scan failed"));
-//    }
-//    return list;
-//}
-//STATIC MP_DEFINE_CONST_FUN_OBJ_1(esp_scan_obj, esp_scan);
+
+    mp_obj_t list = mp_obj_new_list(0, NULL);
+    esp_scan_list = &list;
+    wlan_station_scan();
+
+    if (list == MP_OBJ_NULL) {
+        nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "scan failed"));
+    }
+    return list;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(esp_scan_obj, esp_scan);
 
 /// \method isconnected()
 /// Return True if connected to an AP and an IP address has been assigned,
@@ -480,7 +571,7 @@ STATIC const mp_rom_map_elem_t wlan_if_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&esp_connect_obj) },
     { MP_ROM_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&esp_disconnect_obj) },
     { MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&esp_status_obj) },
-//    { MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&esp_scan_obj) },
+    { MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&esp_scan_obj) },
     { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&esp_isconnected_obj) },
 //    { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&esp_config_obj) },
 //    { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&esp_ifconfig_obj) },