1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <uservice/eventid.h>
5 #include <uservice/uservice.h>
6 
7 #include "aos_network.h"
8 #include "netmgr.h"
9 #include "py/builtin.h"
10 #include "py/mperrno.h"
11 #include "py/obj.h"
12 #include "py/runtime.h"
13 #include "py/stackctrl.h"
14 #include "ulog/ulog.h"
15 #include "utility.h"
16 
17 #define WIFI_DEV_PATH "/dev/wifi0"
18 
19 #define LOG_TAG       "mod_netmgr"
20 
21 static mp_obj_t on_wifi_event_cb = mp_const_none;
22 
wifi_event_cb(uint32_t event_id,const void * param,void * context)23 static void wifi_event_cb(uint32_t event_id, const void *param, void *context)
24 {
25     if (on_wifi_event_cb != mp_const_none && mp_obj_is_callable(on_wifi_event_cb)) {
26         int32_t event;
27         switch (event_id) {
28         case EVENT_NETMGR_WIFI_DISCONNECTED:
29             event = CONN_STATE_DISCONNECTED;
30             break;
31 
32         case EVENT_NETMGR_WIFI_CONNECTED:
33             event = CONN_STATE_CONNECTED;
34             break;
35 
36         case EVENT_NETMGR_WIFI_CONN_TIMEOUT:
37             event = CONN_STATE_FAILED;
38             break;
39 
40         case EVENT_NETMGR_GOT_IP:
41             event = CONN_STATE_NETWORK_CONNECTED;
42             break;
43 
44         default:
45             event = CONN_STATE_UNKNOWN;
46             break;
47         }
48 
49         callback_to_python(on_wifi_event_cb, mp_obj_new_int(event));
50     }
51 }
52 
hapy_netmgr_init(void)53 STATIC mp_obj_t hapy_netmgr_init(void)
54 {
55     mp_int_t ret = 0;
56     netmgr_hdl_t hdl = netmgr_get_dev(WIFI_DEV_PATH);
57 
58     if (hdl >= 0) {
59         LOGD(LOG_TAG, "wifi already init by other task");
60     } else {
61         LOGD(LOG_TAG, "wifi has not been inited");
62         ret = event_service_init(NULL);
63         if (ret != 0) {
64             LOGE(LOG_TAG, "event_service_init failed");
65             return ret;
66         }
67         ret = netmgr_service_init(NULL);
68         if (ret != 0) {
69             LOGE(LOG_TAG, "netmgr_service_init failed");
70             return ret;
71         }
72         netmgr_set_auto_reconnect(NULL, true);
73         ret = netmgr_wifi_set_auto_save_ap(true);
74         if (ret != 0) {
75             LOGE(LOG_TAG, "netmgr_wifi_set_auto_save_ap failed");
76             return ret;
77         }
78     }
79 
80     event_subscribe(EVENT_NETMGR_WIFI_DISCONNECTED, wifi_event_cb, NULL);
81     event_subscribe(EVENT_NETMGR_WIFI_CONNECTED, wifi_event_cb, NULL);
82     event_subscribe(EVENT_NETMGR_WIFI_CONN_TIMEOUT, wifi_event_cb, NULL);
83     event_subscribe(EVENT_NETMGR_GOT_IP, wifi_event_cb, NULL);
84 
85     return mp_obj_new_int(ret);
86 }
87 MP_DEFINE_CONST_FUN_OBJ_0(hapy_netmgr_init_obj, hapy_netmgr_init);
88 
hapy_netmgr_deinit(void)89 STATIC mp_obj_t hapy_netmgr_deinit(void)
90 {
91 }
92 MP_DEFINE_CONST_FUN_OBJ_0(hapy_netmgr_deinit_obj, hapy_netmgr_deinit);
93 
hapy_netmgr_connect(mp_obj_t ssid_in,mp_obj_t pwd_in)94 STATIC mp_obj_t hapy_netmgr_connect(mp_obj_t ssid_in, mp_obj_t pwd_in)
95 {
96     const char *_ssid = mp_obj_str_get_str(ssid_in);
97     const char *_pwd = mp_obj_str_get_str(pwd_in);
98 
99     mp_int_t ret = aos_wifi_connect(_ssid, _pwd);
100     return mp_obj_new_int(ret);
101 }
102 MP_DEFINE_CONST_FUN_OBJ_2(hapy_netmgr_connect_obj, hapy_netmgr_connect);
103 
hapy_netmgr_disconnect(void)104 STATIC mp_obj_t hapy_netmgr_disconnect(void)
105 {
106     mp_int_t ret = aos_wifi_disconnect();
107     return mp_obj_new_int(ret);
108 }
109 MP_DEFINE_CONST_FUN_OBJ_0(hapy_netmgr_disconnect_obj, hapy_netmgr_disconnect);
110 
hapy_netmgr_getInfo(void)111 STATIC mp_obj_t hapy_netmgr_getInfo(void)
112 {
113     aos_wifi_info_t wifi_info = { 0 };
114     mp_int_t ret = aos_get_wifi_info(&wifi_info);
115     if (ret < 0) {
116         LOGI(LOG_TAG, "Failed to get wifi info\n");
117         return mp_const_none;
118     }
119 
120     mp_obj_t dict = mp_obj_new_dict(4);
121     mp_obj_dict_store(dict, MP_OBJ_NEW_QSTR(qstr_from_str("ssid")), mp_obj_new_strn(wifi_info.ssid));
122     mp_obj_dict_store(dict, MP_OBJ_NEW_QSTR(qstr_from_str("mac")), mp_obj_new_strn(wifi_info.mac));
123     mp_obj_dict_store(dict, MP_OBJ_NEW_QSTR(qstr_from_str("ip")), mp_obj_new_strn(wifi_info.ip));
124     mp_obj_dict_store(dict, MP_OBJ_NEW_QSTR(qstr_from_str("rssi")), mp_obj_new_int(wifi_info.rssi));
125 
126     return dict;
127 }
128 MP_DEFINE_CONST_FUN_OBJ_0(hapy_netmgr_getInfo_obj, hapy_netmgr_getInfo);
129 
hapy_netmgr_getType(void)130 STATIC mp_obj_t hapy_netmgr_getType(void)
131 {
132     AOS_NETWORK_TYPE_E type = aos_get_network_type();
133     return mp_obj_new_int(type);
134 }
135 MP_DEFINE_CONST_FUN_OBJ_0(hapy_netmgr_getType_obj, hapy_netmgr_getType);
136 
hapy_netmgr_getStatus(void)137 STATIC mp_obj_t hapy_netmgr_getStatus(void)
138 {
139     mp_int_t ret = aos_wifi_get_state();
140     return mp_obj_new_int(ret);
141 }
142 MP_DEFINE_CONST_FUN_OBJ_0(hapy_netmgr_getStatus_obj, hapy_netmgr_getStatus);
143 
hapy_netmgr_getDev(void)144 STATIC mp_obj_t hapy_netmgr_getDev(void)
145 {
146     netmgr_hdl_t hdl = netmgr_get_dev(WIFI_DEV_PATH);
147     return mp_obj_new_int(hdl);
148 }
149 MP_DEFINE_CONST_FUN_OBJ_0(hapy_netmgr_getDev_obj, hapy_netmgr_getDev);
150 
hapy_netmgr_autoReconnect(mp_obj_t autoReconnect_in)151 STATIC mp_obj_t hapy_netmgr_autoReconnect(mp_obj_t autoReconnect_in)
152 {
153     netmgr_hdl_t hdl = netmgr_get_dev(WIFI_DEV_PATH);
154     bool isAutoReconnect = mp_obj_is_true(autoReconnect_in);
155     netmgr_set_auto_reconnect(hdl, isAutoReconnect);
156     return mp_const_none;
157 }
158 MP_DEFINE_CONST_FUN_OBJ_1(hapy_netmgr_autoReconnect_obj, hapy_netmgr_autoReconnect);
159 
hapy_netmgr_autoSavaAP(mp_obj_t autoSave_in)160 STATIC mp_obj_t hapy_netmgr_autoSavaAP(mp_obj_t autoSave_in)
161 {
162     netmgr_hdl_t hdl = netmgr_get_dev(WIFI_DEV_PATH);
163     bool isAutoSave = mp_obj_is_true(autoSave_in);
164     mp_int_t ret = netmgr_wifi_set_auto_save_ap(hdl, isAutoSave);
165     return mp_obj_new_int(ret);
166 }
167 MP_DEFINE_CONST_FUN_OBJ_1(hapy_netmgr_autoSavaAP_obj, hapy_netmgr_autoSavaAP);
168 
hapy_netmgr_ifconfig(mp_obj_t config_in)169 STATIC mp_obj_t hapy_netmgr_ifconfig(mp_obj_t config_in)
170 {
171     netmgr_ifconfig_info_t info = { 0 };
172 
173     info.dhcp_en = get_int_from_dict(config_in, "dhcp_en") == 0 ? false : true;
174 
175     const char *ip_addr = get_str_from_dict(config_in, "ip_addr");
176     if (ip_addr == NULL) {
177         return mp_obj_new_int(-1);
178     } else {
179         memcpy(info.ip_addr, ip_addr, strlen(ip_addr));
180     }
181 
182     const char *mask = get_str_from_dict(config_in, "mask");
183     if (mask == NULL) {
184         return mp_obj_new_int(-1);
185     } else {
186         memcpy(info.mask, mask, strlen(mask));
187     }
188 
189     const char *gw = get_str_from_dict(config_in, "gw");
190     if (gw == NULL) {
191         return mp_obj_new_int(-1);
192     } else {
193         memcpy(info.gw, gw, strlen(gw));
194     }
195 
196     const char *dns_server = get_str_from_dict(config_in, "dns_server");
197     if (dns_server == NULL) {
198         return mp_obj_new_int(-1);
199     } else {
200         memcpy(info.dns_server, dns_server, strlen(dns_server));
201     }
202 
203     const char *mac = get_str_from_dict(config_in, "mac");
204     if (mac == NULL) {
205         return mp_obj_new_int(-1);
206     } else {
207         memcpy(info.mac, mac, strlen(mac));
208     }
209 
210     info.rssi = get_int_from_dict(config_in, "rssi");
211 
212     mp_int_t ret = aos_wifi_set_ifconfig(&info);
213     return mp_obj_new_int(ret);
214 }
215 MP_DEFINE_CONST_FUN_OBJ_1(hapy_netmgr_ifconfig_obj, hapy_netmgr_ifconfig);
216 
hapy_netmgr_getConfig(void)217 STATIC mp_obj_t hapy_netmgr_getConfig(void)
218 {
219     netmgr_config_t netmgr_config = { 0 };
220     netmgr_hdl_t hdl = netmgr_get_dev(WIFI_DEV_PATH);
221     mp_int_t ret = netmgr_get_config(hdl, &netmgr_config);
222     if (ret != 0) {
223         LOGI(LOG_TAG, "netmgr_get_config failed, ret = %d\n", ret);
224         return mp_const_none;
225     }
226 
227     netmgr_wifi_config_t wifi_config = netmgr_config.config.wifi_config;
228     netmgr_wifi_ap_info_t ap_info = wifi_config.config[wifi_config.used_ap];
229 
230     mp_obj_t config_dict = mp_obj_new_dict(7);
231     mp_obj_dict_store(config_dict, MP_OBJ_NEW_QSTR(qstr_from_str("ap_num")), mp_obj_new_int(wifi_config.ap_num));
232     mp_obj_dict_store(config_dict, MP_OBJ_NEW_QSTR(qstr_from_str("used_ap")), mp_obj_new_int(wifi_config.used_ap));
233     mp_obj_dict_store(config_dict, MP_OBJ_NEW_QSTR(qstr_from_str("ssid")), mp_obj_new_strn(ap_info.ssid));
234     mp_obj_dict_store(config_dict, MP_OBJ_NEW_QSTR(qstr_from_str("pwd")), mp_obj_new_strn(ap_info.pwd));
235     mp_obj_dict_store(config_dict, MP_OBJ_NEW_QSTR(qstr_from_str("bssid")), mp_obj_new_strn(ap_info.bssid));
236     mp_obj_dict_store(config_dict, MP_OBJ_NEW_QSTR(qstr_from_str("ap_power")), mp_obj_new_int(ap_info.ap_power));
237     mp_obj_dict_store(config_dict, MP_OBJ_NEW_QSTR(qstr_from_str("channel")), mp_obj_new_int(ap_info.channel));
238 
239     mp_obj_t res_dict = mp_obj_new_dict(2);
240     mp_obj_dict_store(res_dict, MP_OBJ_NEW_QSTR(qstr_from_str("type")), mp_obj_new_int(netmgr_config.type));
241     mp_obj_dict_store(res_dict, MP_OBJ_NEW_QSTR(qstr_from_str("config")), config_dict);
242 
243     return res_dict;
244 }
245 MP_DEFINE_CONST_FUN_OBJ_0(hapy_netmgr_getConfig_obj, hapy_netmgr_getConfig);
246 
hapy_netmgr_saveConfig()247 STATIC mp_obj_t hapy_netmgr_saveConfig()
248 {
249     netmgr_hdl_t hdl = netmgr_get_dev(WIFI_DEV_PATH);
250     mp_int_t ret = netmgr_save_config(hdl);
251     return mp_obj_new_int(ret);
252 }
253 MP_DEFINE_CONST_FUN_OBJ_0(hapy_netmgr_saveConfig_obj, hapy_netmgr_saveConfig);
254 
hapy_netmgr_deleteConfig(mp_obj_t config_in)255 STATIC mp_obj_t hapy_netmgr_deleteConfig(mp_obj_t config_in)
256 {
257     netmgr_del_config_t config = { 0 };
258 
259     config.type = get_int_from_dict(config_in, "type");
260     const char *ssid = get_str_from_dict(config_in, "ssid");
261     memcpy(config.config.ssid, ssid, strlen(MP_QSTR_server_side));
262 
263     netmgr_hdl_t hdl = netmgr_get_dev(WIFI_DEV_PATH);
264     mp_int_t ret = netmgr_del_config(hdl, &config);
265     return mp_obj_new_int(ret);
266 }
267 MP_DEFINE_CONST_FUN_OBJ_1(hapy_netmgr_deleteConfig_obj, hapy_netmgr_deleteConfig);
268 
hapy_netmgr_getChannelList(mp_obj_t channel_num_in)269 STATIC mp_obj_t hapy_netmgr_getChannelList(mp_obj_t channel_num_in)
270 {
271     netmgr_hdl_t hdl = netmgr_get_dev(WIFI_DEV_PATH);
272 
273     int channel_num = mp_obj_get_int(channel_num_in);
274     int *channel_array = (int *)aos_calloc(channel_num, sizeof(int));
275     if (channel_array == NULL) {
276         return mp_const_none;
277     }
278 
279     mp_int_t ret = netmgr_wifi_get_channelist(hdl, &channel_array, &channel_num);
280     if (ret != 0) {
281         aos_free(channel_array);
282         LOGE(LOG_TAG, "netmgr_wifi_get_channelist failed, ret = %d\n", ret);
283         return mp_const_none;
284     }
285 
286     vstr_t vstr = { 0 };
287     vstr_init_len(&vstr, channel_num * sizeof(int));
288     memcpy(vstr.buf, channel_array, channel_num * sizeof(int));
289     aos_free(channel_array);
290 
291     return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
292 }
293 MP_DEFINE_CONST_FUN_OBJ_0(hapy_netmgr_getChannelList_obj, hapy_netmgr_getChannelList);
294 
hapy_netmgr_setChannelList(mp_obj_t channels_in)295 STATIC mp_obj_t hapy_netmgr_setChannelList(mp_obj_t channels_in)
296 {
297     netmgr_hdl_t hdl = netmgr_get_dev(WIFI_DEV_PATH);
298 
299     mp_buffer_info_t channels;
300     mp_get_buffer_raise(channels_in, &channels, MP_BUFFER_READ);
301 
302     mp_int_t ret = netmgr_wifi_set_channelist(hdl, channels.buf, channels.len);
303     return mp_obj_new_int(ret);
304 }
305 MP_DEFINE_CONST_FUN_OBJ_1(hapy_netmgr_setChannelList_obj, hapy_netmgr_setChannelList);
306 
disconnect_wifi(void)307 STATIC mp_obj_t disconnect_wifi(void)
308 {
309     mp_int_t ret = aos_wifi_disconnect();
310     return mp_obj_new_int(ret);
311 }
312 MP_DEFINE_CONST_FUN_OBJ_0(netmgr_obj_disconnect_wifi, disconnect_wifi);
313 
hapy_netmgr_on(mp_obj_t func)314 STATIC mp_obj_t hapy_netmgr_on(mp_obj_t func)
315 {
316     on_wifi_event_cb = func;
317     return mp_const_none;
318 }
319 MP_DEFINE_CONST_FUN_OBJ_1(hapy_netmgr_on_obj, hapy_netmgr_on);
320 
321 STATIC const mp_rom_map_elem_t netmgr_module_globals_table[] = {
322     { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_netmgr) },
323     { MP_OBJ_NEW_QSTR(MP_QSTR_init), MP_ROM_PTR(&hapy_netmgr_init_obj) },
324     // { MP_OBJ_NEW_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&hapy_netmgr_deinit_obj) },
325     { MP_OBJ_NEW_QSTR(MP_QSTR_connect), MP_ROM_PTR(&hapy_netmgr_connect_obj) },
326     { MP_OBJ_NEW_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&hapy_netmgr_disconnect_obj) },
327     { MP_OBJ_NEW_QSTR(MP_QSTR_getStatus), MP_ROM_PTR(&hapy_netmgr_getStatus_obj) },
328     { MP_OBJ_NEW_QSTR(MP_QSTR_getDev), MP_ROM_PTR(&hapy_netmgr_getDev_obj) },
329     { MP_OBJ_NEW_QSTR(MP_QSTR_autoReconnect), MP_ROM_PTR(&hapy_netmgr_autoReconnect_obj) },
330     { MP_OBJ_NEW_QSTR(MP_QSTR_autoSaveAP), MP_ROM_PTR(&hapy_netmgr_autoSavaAP_obj) },
331     { MP_OBJ_NEW_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&hapy_netmgr_ifconfig_obj) },
332     { MP_OBJ_NEW_QSTR(MP_QSTR_getConfig), MP_ROM_PTR(&hapy_netmgr_getConfig_obj) },
333     { MP_OBJ_NEW_QSTR(MP_QSTR_saveConfig), MP_ROM_PTR(&hapy_netmgr_saveConfig_obj) },
334     { MP_OBJ_NEW_QSTR(MP_QSTR_deleteConfig), MP_ROM_PTR(&hapy_netmgr_deleteConfig_obj) },
335     { MP_OBJ_NEW_QSTR(MP_QSTR_setChannelList), MP_ROM_PTR(&hapy_netmgr_setChannelList_obj) },
336     { MP_OBJ_NEW_QSTR(MP_QSTR_getChannelList), MP_ROM_PTR(&hapy_netmgr_getChannelList_obj) },
337     { MP_OBJ_NEW_QSTR(MP_QSTR_on), MP_ROM_PTR(&hapy_netmgr_on_obj) },
338     { MP_OBJ_NEW_QSTR(MP_QSTR_getInfo), MP_ROM_PTR(&hapy_netmgr_getInfo_obj) },
339     { MP_OBJ_NEW_QSTR(MP_QSTR_getType), MP_ROM_PTR(&hapy_netmgr_getType_obj) },
340 
341     /* network connect state */
342     { MP_ROM_QSTR(MP_QSTR_NET_AP_DISCONNECTING), MP_ROM_INT(CONN_STATE_DISCONNECTING) },
343     { MP_ROM_QSTR(MP_QSTR_NET_AP_DISCONNECTED), MP_ROM_INT(CONN_STATE_DISCONNECTED) },
344     { MP_ROM_QSTR(MP_QSTR_NET_AP_CONNECTING), MP_ROM_INT(CONN_STATE_CONNECTING) },
345     { MP_ROM_QSTR(MP_QSTR_NET_AP_CONNECTED), MP_ROM_INT(CONN_STATE_CONNECTED) },
346     { MP_ROM_QSTR(MP_QSTR_NET_IP_OBTAINING), MP_ROM_INT(CONN_STATE_OBTAINING_IP) },
347     { MP_ROM_QSTR(MP_QSTR_NET_IP_OBTAINED), MP_ROM_INT(CONN_STATE_NETWORK_CONNECTED) },
348     { MP_ROM_QSTR(MP_QSTR_NET_FAILED), MP_ROM_INT(CONN_STATE_FAILED) },
349 
350     /* network type */
351     { MP_ROM_QSTR(MP_QSTR_NET_TYPE_WIFI), MP_ROM_INT(AOS_NETWORK_WIFI) },
352     { MP_ROM_QSTR(MP_QSTR_NET_TYPE_CELLULAR), MP_ROM_INT(AOS_NETWORK_CELLULAR) },
353     { MP_ROM_QSTR(MP_QSTR_NET_TYPE_ETH), MP_ROM_INT(AOS_NETWORK_ETHERNET) },
354 };
355 STATIC MP_DEFINE_CONST_DICT(hapy_netmgr_module_globals, netmgr_module_globals_table);
356 
357 const mp_obj_module_t netmgr_module = {
358     .base = { &mp_type_module },
359     .globals = (mp_obj_dict_t *)&hapy_netmgr_module_globals,
360 };
361