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