network_wlan.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. /*
  2. * This file is part of the MicroPython project, http://micropython.org/
  3. *
  4. * The MIT License (MIT)
  5. *
  6. * Copyright (c) 2019 SummerGift <SummerGift@qq.com>
  7. *
  8. * Permission is hereby granted, free of charge, to any person obtaining a copy
  9. * of this software and associated documentation files (the "Software"), to deal
  10. * in the Software without restriction, including without limitation the rights
  11. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  12. * copies of the Software, and to permit persons to whom the Software is
  13. * furnished to do so, subject to the following conditions:
  14. *
  15. * The above copyright notice and this permission notice shall be included in
  16. * all copies or substantial portions of the Software.
  17. *
  18. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  24. * THE SOFTWARE.
  25. */
  26. #include <stdio.h>
  27. #include <stdint.h>
  28. #include <string.h>
  29. #include "py/objlist.h"
  30. #include "py/runtime.h"
  31. #include "py/mphal.h"
  32. #include "lib/netutils/netutils.h"
  33. #if MICROPY_PY_WLAN
  34. #include <rtthread.h>
  35. #include <wlan_mgnt.h>
  36. #include <wlan_cfg.h>
  37. #include <wlan_prot.h>
  38. #include <arpa/inet.h>
  39. #include <netdev.h>
  40. #include "modnetwork.h"
  41. extern struct netdev *netdev_default;
  42. typedef struct _wlan_if_obj_t {
  43. mp_obj_base_t base;
  44. int if_id;
  45. } wlan_if_obj_t;
  46. enum {
  47. STATION_IDLE = 0,
  48. STATION_CONNECTING,
  49. STATION_WRONG_PASSWORD,
  50. STATION_NO_AP_FOUND,
  51. STATION_CONNECT_FAIL,
  52. STATION_GOT_IP,
  53. };
  54. const mp_obj_type_t wlan_if_type;
  55. STATIC struct rt_wlan_info _ap_info;
  56. STATIC char _ap_password[RT_WLAN_PASSWORD_MAX_LENGTH];
  57. STATIC void error_check(bool status, const char *msg) {
  58. if (!status) {
  59. nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, msg));
  60. }
  61. }
  62. STATIC const wlan_if_obj_t wlan_objs[] = {
  63. {{&wlan_if_type}, STATION_IF},
  64. {{&wlan_if_type}, SOFTAP_IF},
  65. };
  66. STATIC void require_if(mp_obj_t wlan_if, int if_no) {
  67. wlan_if_obj_t *self = MP_OBJ_TO_PTR(wlan_if);
  68. if (self->if_id != if_no) {
  69. error_check(false, if_no == STATION_IF ? "STA required" : "AP required");
  70. }
  71. }
  72. STATIC mp_obj_t get_wlan(size_t n_args, const mp_obj_t *args) {
  73. int idx = 0;
  74. if (n_args > 0) {
  75. idx = mp_obj_get_int(args[0]);
  76. if (idx < 0 || idx >= sizeof(wlan_objs)) {
  77. mp_raise_ValueError(NULL);
  78. }
  79. }
  80. return MP_OBJ_FROM_PTR(&wlan_objs[idx]);
  81. }
  82. MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(get_wlan_obj, 0, 1, get_wlan);
  83. STATIC mp_obj_t wlan_active(size_t n_args, const mp_obj_t *args) {
  84. wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
  85. if (n_args > 1) {
  86. if (self->if_id == STATION_IF)
  87. {
  88. if (mp_obj_get_int(args[1]) == RT_TRUE)
  89. {
  90. error_check(netdev_set_up(netdev_default) == RT_EOK, "Cannot active wlan device");
  91. }
  92. else
  93. {
  94. error_check(netdev_set_down(netdev_default) == RT_EOK, "Cannot disable wlan device");
  95. }
  96. }
  97. else
  98. {
  99. if (mp_obj_get_int(args[1]) == RT_TRUE)
  100. {
  101. error_check(rt_wlan_start_ap((char *)&_ap_info.ssid.val, _ap_password) == RT_EOK, "Cannot start AP");
  102. }
  103. else
  104. {
  105. error_check(rt_wlan_ap_stop() == RT_EOK, "Cannot stop AP");
  106. }
  107. }
  108. return mp_const_none;
  109. }
  110. if (self->if_id == STATION_IF)
  111. {
  112. return mp_obj_new_bool(rt_wlan_get_mode("wlan0") == RT_WLAN_STATION);
  113. }
  114. else
  115. {
  116. return mp_obj_new_bool(rt_wlan_get_mode("wlan1") == RT_WLAN_AP);
  117. }
  118. }
  119. STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(wlan_active_obj, 1, 2, wlan_active);
  120. STATIC mp_obj_t wlan_connect(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
  121. enum { ARG_ssid, ARG_password, ARG_bssid };
  122. static const mp_arg_t allowed_args[] = {
  123. { MP_QSTR_, MP_ARG_OBJ, {.u_obj = mp_const_none} },
  124. { MP_QSTR_, MP_ARG_OBJ, {.u_obj = mp_const_none} },
  125. { MP_QSTR_bssid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
  126. };
  127. // parse args
  128. mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
  129. mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
  130. require_if(pos_args[0], STATION_IF);
  131. const char *ssid = RT_NULL;
  132. const char *key = RT_NULL;
  133. size_t len;
  134. const char *p;
  135. // set parameters based on given args
  136. if (args[ARG_ssid].u_obj != mp_const_none) {
  137. p = mp_obj_str_get_data(args[ARG_ssid].u_obj, &len);
  138. ssid = p;
  139. }
  140. if (args[ARG_password].u_obj != mp_const_none) {
  141. p = mp_obj_str_get_data(args[ARG_password].u_obj, &len);
  142. key = p;
  143. }
  144. error_check(rt_wlan_connect(ssid, key) == RT_EOK, "Cannot connect to AP");
  145. return mp_const_none;
  146. }
  147. STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wlan_connect_obj, 1, wlan_connect);
  148. STATIC mp_obj_t wlan_disconnect(mp_obj_t self_in) {
  149. require_if(self_in, STATION_IF);
  150. error_check(rt_wlan_disconnect() == RT_EOK, "Cannot disconnect from AP");
  151. return mp_const_none;
  152. }
  153. STATIC MP_DEFINE_CONST_FUN_OBJ_1(wlan_disconnect_obj, wlan_disconnect);
  154. STATIC mp_obj_t wlan_status(size_t n_args, const mp_obj_t *args) {
  155. wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
  156. if (n_args == 1) {
  157. // Get link status
  158. if (self->if_id == STATION_IF) {
  159. if(rt_wlan_is_ready() == RT_EOK)
  160. {
  161. return MP_OBJ_NEW_SMALL_INT(STATION_GOT_IP);
  162. }
  163. else
  164. {
  165. return MP_OBJ_NEW_SMALL_INT(STATION_IDLE);
  166. }
  167. }
  168. return MP_OBJ_NEW_SMALL_INT(-1);
  169. } else {
  170. // Get specific status parameter
  171. switch (mp_obj_str_get_qstr(args[1])) {
  172. case MP_QSTR_rssi:
  173. if (self->if_id == STATION_IF) {
  174. return MP_OBJ_NEW_SMALL_INT(rt_wlan_get_rssi());
  175. }
  176. }
  177. mp_raise_ValueError("unknown status param");
  178. }
  179. }
  180. STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(wlan_status_obj, 1, 2, wlan_status);
  181. STATIC mp_obj_t *wlan_scan_list = NULL;
  182. void wlan_station_scan(void)
  183. {
  184. if (wlan_scan_list == NULL) {
  185. // called unexpectedly
  186. return;
  187. }
  188. struct rt_wlan_scan_result *scan_result = RT_NULL;
  189. /* scan ap info */
  190. scan_result = rt_wlan_scan_sync();
  191. if (scan_result)
  192. {
  193. int index, num;
  194. char *security;
  195. num = scan_result->num;
  196. for (index = 0; index < num; index ++)
  197. {
  198. switch (scan_result->info[index].security)
  199. {
  200. case SECURITY_OPEN:
  201. security = "OPEN";
  202. break;
  203. case SECURITY_WEP_PSK:
  204. security = "WEP_PSK";
  205. break;
  206. case SECURITY_WEP_SHARED:
  207. security = "WEP_SHARED";
  208. break;
  209. case SECURITY_WPA_TKIP_PSK:
  210. security = "WPA_TKIP_PSK";
  211. break;
  212. case SECURITY_WPA_AES_PSK:
  213. security = "WPA_AES_PSK";
  214. break;
  215. case SECURITY_WPA2_AES_PSK:
  216. security = "WPA2_AES_PSK";
  217. break;
  218. case SECURITY_WPA2_TKIP_PSK:
  219. security = "WPA2_TKIP_PSK";
  220. break;
  221. case SECURITY_WPA2_MIXED_PSK:
  222. security = "WPA2_MIXED_PSK";
  223. break;
  224. case SECURITY_WPS_OPEN:
  225. security = "WPS_OPEN";
  226. break;
  227. case SECURITY_WPS_SECURE:
  228. security = "WPS_SECURE";
  229. break;
  230. default:
  231. security = "UNKNOWN";
  232. break;
  233. }
  234. mp_obj_tuple_t *t = mp_obj_new_tuple(6, NULL);
  235. t->items[0] = mp_obj_new_bytes(&scan_result->info[index].ssid.val[0], strlen((char *)(&scan_result->info[index].ssid.val[0])));
  236. t->items[1] = mp_obj_new_bytes(&scan_result->info[index].bssid[0], strlen((char *)(&scan_result->info[index].bssid[0])));
  237. t->items[2] = MP_OBJ_NEW_SMALL_INT(scan_result->info[index].channel);
  238. t->items[3] = MP_OBJ_NEW_SMALL_INT(scan_result->info[index].rssi);
  239. t->items[4] = mp_obj_new_bytes((const byte *)security, strlen(security));
  240. t->items[5] = MP_OBJ_NEW_SMALL_INT(scan_result->info[index].hidden);
  241. mp_obj_list_append(*wlan_scan_list, MP_OBJ_FROM_PTR(t));
  242. }
  243. rt_wlan_scan_result_clean();
  244. }
  245. else
  246. {
  247. rt_kprintf("wifi scan result is null\n");
  248. *wlan_scan_list = MP_OBJ_NULL;
  249. }
  250. }
  251. STATIC mp_obj_t wlan_scan(mp_obj_t self_in) {
  252. require_if(self_in, STATION_IF);
  253. mp_obj_t list = mp_obj_new_list(0, NULL);
  254. wlan_scan_list = &list;
  255. wlan_station_scan();
  256. if (list == MP_OBJ_NULL) {
  257. nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "scan failed"));
  258. }
  259. return list;
  260. }
  261. STATIC MP_DEFINE_CONST_FUN_OBJ_1(wlan_scan_obj, wlan_scan);
  262. /// \method isconnected()
  263. /// Return True if connected to an AP and an IP address has been assigned,
  264. /// false otherwise.
  265. STATIC mp_obj_t wlan_isconnected(mp_obj_t self_in) {
  266. wlan_if_obj_t *self = MP_OBJ_TO_PTR(self_in);
  267. if (self->if_id == STATION_IF) {
  268. if (rt_wlan_is_connected() == RT_TRUE) {
  269. return mp_const_true;
  270. }
  271. } else {
  272. if (rt_wlan_ap_get_sta_num() > 0) {
  273. return mp_const_true;
  274. }
  275. }
  276. return mp_const_false;
  277. }
  278. STATIC MP_DEFINE_CONST_FUN_OBJ_1(wlan_isconnected_obj, wlan_isconnected);
  279. STATIC mp_obj_t wlan_ifconfig(size_t n_args, const mp_obj_t *args) {
  280. wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
  281. struct netdev *netdev = netdev_default;
  282. if (netdev == RT_NULL)
  283. {
  284. rt_kprintf("not find wlan interface device.\n");
  285. return MP_OBJ_NEW_SMALL_INT(-1);
  286. }
  287. if (n_args == 1) {
  288. // get
  289. mp_obj_t tuple[4] = {
  290. mp_obj_new_str((const char *)inet_ntoa(netdev->ip_addr), strlen((char *)(inet_ntoa(netdev->ip_addr)))),
  291. mp_obj_new_str((const char *)inet_ntoa(netdev->netmask), strlen((char *)(inet_ntoa(netdev->netmask)))),
  292. mp_obj_new_str((const char *)inet_ntoa(netdev->gw), strlen((char *)(inet_ntoa(netdev->gw)))),
  293. mp_obj_new_str((const char *)inet_ntoa(netdev->dns_servers), strlen((char *)(inet_ntoa(netdev->dns_servers)))),
  294. };
  295. return mp_obj_new_tuple(4, tuple);
  296. }
  297. else
  298. {
  299. // set
  300. mp_obj_t *items;
  301. uint8_t ip_addr[4];
  302. uint8_t netmask[4];
  303. uint8_t gw[4];
  304. uint8_t dns_server[4];
  305. mp_obj_get_array_fixed_n(args[1], 4, &items);
  306. netutils_parse_ipv4_addr(items[0], (uint8_t *)ip_addr, NETUTILS_BIG);
  307. netutils_parse_ipv4_addr(items[1], (uint8_t *)netmask, NETUTILS_BIG);
  308. netutils_parse_ipv4_addr(items[2], (uint8_t *)gw , NETUTILS_BIG);
  309. netutils_parse_ipv4_addr(items[3], (uint8_t *)dns_server, NETUTILS_BIG);
  310. // To set a static IP we have to disable DHCP first
  311. if (self->if_id == STATION_IF) {
  312. if(netdev_dhcp_enabled(netdev, 0) == RT_EOK)
  313. {
  314. if (netdev_set_ipaddr(netdev, (const ip_addr_t *)ip_addr) != RT_EOK)
  315. {
  316. nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "netdev_set_ipaddr() failed"));
  317. }
  318. }
  319. else
  320. {
  321. nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "netdev_dhcp_enabled() failed"));
  322. }
  323. }
  324. else
  325. {
  326. // TODO modify IP netmask gw under AP mode
  327. netdev_set_dns_server(netdev, 0, (const ip_addr_t *)dns_server);
  328. return mp_const_none;
  329. }
  330. netdev_set_netmask(netdev, (const ip_addr_t *)netmask);
  331. netdev_set_gw(netdev, (const ip_addr_t *)gw);
  332. netdev_set_dns_server(netdev, 0, (const ip_addr_t *)dns_server);
  333. }
  334. return mp_const_none;
  335. }
  336. STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(wlan_ifconfig_obj, 1, 2, wlan_ifconfig);
  337. STATIC mp_obj_t wlan_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
  338. if (n_args != 1 && kwargs->used != 0) {
  339. mp_raise_TypeError("either pos or kw args are allowed");
  340. }
  341. wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]);
  342. struct rt_wlan_info cfg = {0};
  343. if (self->if_id == STATION_IF) {
  344. error_check(rt_wlan_get_info(&cfg) == RT_EOK, "can't get STA config");
  345. } else {
  346. error_check(rt_wlan_ap_get_info(&cfg) == RT_EOK, "can't get AP config");
  347. }
  348. int req_if = -1;
  349. if (kwargs->used != 0) {
  350. for (mp_uint_t i = 0; i < kwargs->alloc; i++) {
  351. if (mp_map_slot_is_filled(kwargs, i)) {
  352. #define QS(x) (uintptr_t)MP_OBJ_NEW_QSTR(x)
  353. switch ((uintptr_t)kwargs->table[i].key) {
  354. case QS(MP_QSTR_mac): {
  355. mp_buffer_info_t bufinfo;
  356. mp_get_buffer_raise(kwargs->table[i].value, &bufinfo, MP_BUFFER_READ);
  357. if (bufinfo.len != 6) {
  358. mp_raise_ValueError("invalid buffer length");
  359. }
  360. error_check(rt_wlan_set_mac((rt_uint8_t *)bufinfo.buf) == RT_EOK, "can't set MAC");
  361. break;
  362. }
  363. case QS(MP_QSTR_essid): {
  364. req_if = SOFTAP_IF;
  365. size_t len;
  366. const char *s = mp_obj_str_get_data(kwargs->table[i].value, &len);
  367. len = MIN(len, sizeof(_ap_info.ssid.val));
  368. memcpy(_ap_info.ssid.val, s, len);
  369. _ap_info.ssid.len = len;
  370. break;
  371. }
  372. case QS(MP_QSTR_hidden): {
  373. req_if = SOFTAP_IF;
  374. _ap_info.hidden = mp_obj_is_true(kwargs->table[i].value);
  375. break;
  376. }
  377. // case QS(MP_QSTR_authmode): {
  378. // req_if = SOFTAP_IF;
  379. // cfg.ap.authmode = mp_obj_get_int(kwargs->table[i].value);
  380. // break;
  381. // }
  382. case QS(MP_QSTR_password): {
  383. req_if = SOFTAP_IF;
  384. size_t len;
  385. const char *s = mp_obj_str_get_data(kwargs->table[i].value, &len);
  386. len = MIN(len, sizeof(_ap_password) - 1);
  387. memcpy(_ap_password, s, len);
  388. _ap_password[len] = 0;
  389. break;
  390. }
  391. case QS(MP_QSTR_channel): {
  392. req_if = SOFTAP_IF;
  393. _ap_info.channel = mp_obj_get_int(kwargs->table[i].value);
  394. break;
  395. }
  396. // case QS(MP_QSTR_dhcp_hostname): {
  397. // req_if = STATION_IF;
  398. // if (self->if_id == STATION_IF) {
  399. // const char *s = mp_obj_str_get_str(kwargs->table[i].value);
  400. // wifi_station_set_hostname((char*)s);
  401. // }
  402. // break;
  403. // }
  404. default:
  405. goto unknown;
  406. }
  407. #undef QS
  408. }
  409. }
  410. // We post-check interface requirements to save on code size
  411. if (req_if >= 0) {
  412. require_if(args[0], req_if);
  413. }
  414. return mp_const_none;
  415. }
  416. // Get config
  417. if (n_args != 2) {
  418. mp_raise_TypeError("can query only one param");
  419. }
  420. mp_obj_t val;
  421. qstr key = mp_obj_str_get_qstr(args[1]);
  422. switch (key) {
  423. case MP_QSTR_mac: {
  424. uint8_t mac[6];
  425. error_check(rt_wlan_get_mac(mac) == RT_EOK, "can't get mac config");
  426. return mp_obj_new_bytes(mac, sizeof(mac));
  427. }
  428. case MP_QSTR_essid:
  429. if (self->if_id == STATION_IF) {
  430. val = mp_obj_new_str((char*)cfg.ssid.val, strlen((char*)cfg.ssid.val));
  431. } else {
  432. val = mp_obj_new_str((char*)_ap_info.ssid.val, _ap_info.ssid.len);
  433. }
  434. break;
  435. case MP_QSTR_hidden:
  436. req_if = SOFTAP_IF;
  437. val = mp_obj_new_bool(cfg.hidden);
  438. break;
  439. // case MP_QSTR_authmode:
  440. // req_if = SOFTAP_IF;
  441. // val = MP_OBJ_NEW_SMALL_INT(cfg.ap.authmode);
  442. // break;
  443. case MP_QSTR_channel:
  444. req_if = SOFTAP_IF;
  445. val = MP_OBJ_NEW_SMALL_INT(cfg.channel);
  446. break;
  447. // case MP_QSTR_dhcp_hostname: {
  448. // req_if = STATION_IF;
  449. // char* s = wifi_station_get_hostname();
  450. // if (s == NULL) {
  451. // val = MP_OBJ_NEW_QSTR(MP_QSTR_);
  452. // } else {
  453. // val = mp_obj_new_str(s, strlen(s));
  454. // }
  455. // break;
  456. // }
  457. default:
  458. goto unknown;
  459. }
  460. // We post-check interface requirements to save on code size
  461. if (req_if >= 0) {
  462. require_if(args[0], req_if);
  463. }
  464. return val;
  465. unknown:
  466. mp_raise_ValueError("unknown config param");
  467. }
  468. STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wlan_config_obj, 1, wlan_config);
  469. STATIC const mp_rom_map_elem_t wlan_if_locals_dict_table[] = {
  470. { MP_ROM_QSTR(MP_QSTR_active), MP_ROM_PTR(&wlan_active_obj) },
  471. { MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&wlan_connect_obj) },
  472. { MP_ROM_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&wlan_disconnect_obj) },
  473. { MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&wlan_status_obj) },
  474. { MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&wlan_scan_obj) },
  475. { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&wlan_isconnected_obj) },
  476. { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&wlan_config_obj) },
  477. { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&wlan_ifconfig_obj) },
  478. #if MODNETWORK_INCLUDE_CONSTANTS
  479. { MP_ROM_QSTR(MP_QSTR_STAT_IDLE), MP_ROM_INT(STATION_IDLE)},
  480. { MP_ROM_QSTR(MP_QSTR_STAT_CONNECTING), MP_ROM_INT(STATION_CONNECTING)},
  481. { MP_ROM_QSTR(MP_QSTR_STAT_WRONG_PASSWORD), MP_ROM_INT(STATION_WRONG_PASSWORD)},
  482. { MP_ROM_QSTR(MP_QSTR_STAT_NO_AP_FOUND), MP_ROM_INT(STATION_NO_AP_FOUND)},
  483. { MP_ROM_QSTR(MP_QSTR_STAT_CONNECT_FAIL), MP_ROM_INT(STATION_CONNECT_FAIL)},
  484. { MP_ROM_QSTR(MP_QSTR_STAT_GOT_IP), MP_ROM_INT(STATION_GOT_IP)},
  485. // { MP_ROM_QSTR(MP_QSTR_MODE_11B), MP_ROM_INT(PHY_MODE_11B) },
  486. // { MP_ROM_QSTR(MP_QSTR_MODE_11G), MP_ROM_INT(PHY_MODE_11G) },
  487. // { MP_ROM_QSTR(MP_QSTR_MODE_11N), MP_ROM_INT(PHY_MODE_11N) },
  488. // { MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(AUTH_OPEN) },
  489. // { MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(AUTH_WEP) },
  490. // { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(AUTH_WPA_PSK) },
  491. // { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(AUTH_WPA2_PSK) },
  492. // { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(AUTH_WPA_WPA2_PSK) },
  493. #endif
  494. };
  495. STATIC MP_DEFINE_CONST_DICT(wlan_if_locals_dict, wlan_if_locals_dict_table);
  496. const mp_obj_type_t wlan_if_type = {
  497. { &mp_type_type },
  498. .name = MP_QSTR_WLAN,
  499. .locals_dict = (mp_obj_dict_t*)&wlan_if_locals_dict,
  500. };
  501. #endif