blob: 47c5ba7217b9266bc4a6ed1e0d55ece4e2042231 [file] [log] [blame]
liubin281ac462023-07-19 14:22:54 +08001#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <errno.h>
5#include <sys/socket.h>
6#include <sys/un.h>
7#include <netinet/in.h>
8#include <pthread.h>
9#include <sys/epoll.h>
10#include <fcntl.h>
11#include <signal.h>
12#include <cutils/properties.h>
13
14#include "mbtk_type.h"
15#include "mbtk_info.h"
16#include "mbtk_queue.h"
17#include "atchannel.h"
18#include "at_tok.h"
19#include "mbtk_utils.h"
20#include "mbtk_ifc.h"
21#include "info_data.h"
wangyouqiang38e53362024-01-23 10:53:48 +080022#include "mbtk_led.h"
b.liue0ab2442024-02-06 18:53:28 +080023#include "cust_info.h"
b.liubb5e7682024-02-28 20:13:04 +080024#include "mbtk_device.h"
liubin281ac462023-07-19 14:22:54 +080025
b.liuf37bd332024-03-18 13:51:24 +080026typedef struct {
27 bool band_set_success;
28
29 mbtk_modem_band_area_enum band_area;
30 uint32 band_gsm;
31 uint32 band_wcdma;
32 uint32 band_tdlte;
33 uint32 band_fddlte;
34} band_set_info_t;
35
liubin281ac462023-07-19 14:22:54 +080036static int sock_listen_fd = -1;
37static int epoll_fd = -1;
38static list_node_t *sock_client_list = NULL;
39static mbtk_queue_node_t info_queue;
40static pthread_cond_t info_cond;
41static pthread_mutex_t info_mutex;
42static mbtk_queue_node_t urc_queue;
43static pthread_cond_t urc_cond;
44static pthread_mutex_t urc_mutex;
b.liuf37bd332024-03-18 13:51:24 +080045static band_set_info_t band_set_info;
liubin281ac462023-07-19 14:22:54 +080046
47static mbtk_band_info_t band_support;
48net_info_t net_info;
49mbtK_cell_pack_info_t cell_info;
50info_cgact_wait_t cgact_wait;
51static int cid_active[MBTK_APN_CID_MAX + 1] = {0};
52bool at_process = false;
53//mbtk wyq for data_call_ex add start
54// |2----7|
55//"00000000"+'\0'
56static char cid_bootconn[MBTK_APN_CID_MAX + 2] = {0};
57#define DATA_CALL_BOOTCONN_FD 0x5f6f7f8f
58//mbtk wyq for data_call_ex add end
59
60//mbtk wyq for server_ready_status add start
61static char server_ready_status = 0;
62//mbtk wyq for server_ready_status add end
63
r.xiaoec113d12024-01-12 02:13:28 -080064
65/*
66AT*POWERIND=0"
67or
68AT*POWERIND=1~31"
69
70OK
71
72AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
73其中PS DATA目前暂时不支持,只是保留了这个标志位,0 means resume all.
74
75AP power state: 1~31 means suspend,
76bitmap:
77bit0 - NETWORK;
78bit1 - SIM;
79bit2 - SMS;
80bit3 - CS CALL
81bit4 - PS DATA
82
83*/
84static int req_powerind_set(uint32 state, int *cme_err)
85{
86 ATResponse *response = NULL;
87 char cmd[100] = {0};
88
89 if (state >= 0 && state < 32)
90 {
91 sprintf(cmd, "AT*POWERIND=%d", state);
r.xiaocfd7c682024-01-22 03:59:46 -080092 LOG("Set the powerind command is = [%s]\n", cmd);
r.xiaoec113d12024-01-12 02:13:28 -080093 }
94 int err = at_send_command(cmd, &response);
95 if (err < 0 || response->success == 0){
96 *cme_err = at_get_cme_error(response);
97 goto exit;
98 }
99
100exit:
101 at_response_free(response);
102 return err;
103}
104
105/*
r.xiaocfd7c682024-01-22 03:59:46 -0800106AT+OOSPP=1
107or
108AT+OOSPP=0
109or
r.xiaoec113d12024-01-12 02:13:28 -0800110AT+OOSPP=1,20,30,40 //AtOospp()
111 param1:mode
112 param2:oosPhasePeriod[0] //5 times, 5s by default;
r.xiaocfd7c682024-01-22 03:59:46 -0800113 param3:oosPhasePeriod[1] //5 times, 10s by default;
114 param4:oosPhasePeriod[2] //unlimited, 20s by default;
r.xiaoec113d12024-01-12 02:13:28 -0800115
116
117BTW
1181, 如果只输入mode=1,其余参数不设置,相当于这个功能打开,时间间隔是这个功能的默认值。
1192, 如果当mode=1加上其余设置参数后,功能打开,时间间隔是本次设置的值;
r.xiaocfd7c682024-01-22 03:59:46 -08001203,如果再设置mode=0,相当于这个功能关闭,是走平台自己另一套的搜网设置。
121平台本身是有一套间隔搜网,也有历史频点优先处理的逻辑(不需要我们进行处理),
122提供给我们的AT+OOSPP指令是让我们可以自定义搜网间隔
r.xiaoec113d12024-01-12 02:13:28 -0800123*/
r.xiaocfd7c682024-01-22 03:59:46 -0800124static int req_oos_set(mbtk_oos_info* state, int *cme_err)
r.xiaoec113d12024-01-12 02:13:28 -0800125{
126 ATResponse *response = NULL;
127 char cmd[100] = {0};
r.xiaoec113d12024-01-12 02:13:28 -0800128
r.xiaocfd7c682024-01-22 03:59:46 -0800129 if ((state->mode == 1 && state->oosPhase[0] == 0 && state->oosPhase[1] == 0 && state->oosPhase[2] == 0) \
130 || state->mode == 0)
r.xiaoec113d12024-01-12 02:13:28 -0800131 {
r.xiaocfd7c682024-01-22 03:59:46 -0800132 sprintf(cmd, "AT+OOSPP=%d", state->mode);//只有一个值0/1
r.xiaoec113d12024-01-12 02:13:28 -0800133 }
134 else
135 {
r.xiaocfd7c682024-01-22 03:59:46 -0800136 if ((state->oosPhase[0] != 0) && (state->oosPhase[1] != 0) && (state->oosPhase[2] != 0))
137 {
138 sprintf(cmd, "AT+OOSPP=%d,%d,%d,%d", state->mode, state->oosPhase[0], state->oosPhase[1], state->oosPhase[2]);
139 }
140 else if ((state->oosPhase[0] != 0) && (state->oosPhase[1] != 0) && (state->oosPhase[2] == 0))
141 {
142 sprintf(cmd, "AT+OOSPP=%d,%d,%d", state->mode, state->oosPhase[0], state->oosPhase[1]);
143 }
144 else if ((state->oosPhase[0] != 0) && (state->oosPhase[1] == 0) && (state->oosPhase[2] == 0))
145 {
146 sprintf(cmd, "AT+OOSPP=%d,%d", state->mode, state->oosPhase[0]);
147 }
148 else
149 {
150 LOG("AT+OOSPP SET ERR");
151 goto exit;
152 }
r.xiaoec113d12024-01-12 02:13:28 -0800153 }
154
r.xiaocfd7c682024-01-22 03:59:46 -0800155 LOG("Set the oos command is = [%s]\n", cmd);
r.xiaoec113d12024-01-12 02:13:28 -0800156 int err = at_send_command(cmd, &response);
157 if (err < 0 || response->success == 0){
158 *cme_err = at_get_cme_error(response);
159 goto exit;
160 }
161
162exit:
163 at_response_free(response);
164 return err;
165}
166
167
168/*
169AT+OOSPP?
r.xiaocfd7c682024-01-22 03:59:46 -0800170开(默认值):
171+OOSPP:5,10,20
r.xiaoec113d12024-01-12 02:13:28 -0800172关:
173+OOSPP:0
174*/
175static int req_oos_get(mbtk_oos_info *req, int *cme_err)
176{
177 ATResponse *response = NULL;
178
r.xiaocfd7c682024-01-22 03:59:46 -0800179 int err = at_send_command_singleline("AT+OOSPP?", "+OOSPP:", &response);
r.xiaoec113d12024-01-12 02:13:28 -0800180
181 if (err < 0 || response->success == 0 || !response->p_intermediates){
182 *cme_err = at_get_cme_error(response);
183 goto exit;
184 }
185
186 char *line = response->p_intermediates->line;
187
188 char *tmp_str = NULL;
r.xiaocfd7c682024-01-22 03:59:46 -0800189 err = at_tok_start(&line);//+OOSPP:10,15,20,过滤+OOSPP:
190 if (err < 0)
191 {
192 goto exit;
193 }
194
195 //LOG("req_oos_get =[%s]",line);
196
r.xiaoec113d12024-01-12 02:13:28 -0800197 err = at_tok_nextstr(&line, &tmp_str);
198 if (err < 0)
199 {
200 goto exit;
201 }
202
r.xiaoec113d12024-01-12 02:13:28 -0800203 int mode = atoi(tmp_str);
204 if (mode == 0)//关闭状态
205 {
r.xiaocfd7c682024-01-22 03:59:46 -0800206 req->mode = mode;
r.xiaoec113d12024-01-12 02:13:28 -0800207 }
208 else//开状态
209 {
210 req->mode = 1;
r.xiaocfd7c682024-01-22 03:59:46 -0800211 //LOG("tmp_str =[%s]",tmp_str);
212 req->oosPhase[0] = atoi(tmp_str);
b.liufe320632024-01-17 20:38:08 +0800213
r.xiaoec113d12024-01-12 02:13:28 -0800214 err = at_tok_nextstr(&line, &tmp_str);
215 if (err < 0)
216 {
217 goto exit;
218 }
r.xiaocfd7c682024-01-22 03:59:46 -0800219 //LOG("tmp_str =[%s]",tmp_str);
220 req->oosPhase[1] = atoi(tmp_str);
r.xiaoec113d12024-01-12 02:13:28 -0800221
222 err = at_tok_nextstr(&line, &tmp_str);
223 if (err < 0)
224 {
225 goto exit;
226 }
r.xiaocfd7c682024-01-22 03:59:46 -0800227 //LOG("tmp_str =[%s]",tmp_str);
228 req->oosPhase[2] = atoi(tmp_str);
r.xiaoec113d12024-01-12 02:13:28 -0800229 }
230
r.xiaoec113d12024-01-12 02:13:28 -0800231exit:
232 at_response_free(response);
233 return err;
234}
235
liubin281ac462023-07-19 14:22:54 +0800236static void sock_cli_free_func(void *data)
237{
238 if (data)
239 {
240 sock_client_info_t *info = (sock_client_info_t*) data;
241 LOG("Free Socket client[fd = %d].", info->fd);
242 free(info);
243 }
244}
245
246static void cli_close(sock_client_info_t* client)
247{
248 struct epoll_event ev;
249 memset(&ev,0,sizeof(struct epoll_event));
250 ev.data.fd = client->fd;
251 ev.events = EPOLLIN | EPOLLERR | EPOLLET;
252 epoll_ctl(epoll_fd, EPOLL_CTL_DEL, client->fd, &ev);
253
254 close(client->fd);
255
256 if(list_remove(sock_client_list, client))
257 {
258 sock_cli_free_func(client);
259 }
260}
261
262static void pack_error_send(int fd, int info_id, int err)
263{
264 mbtk_info_pack_t* pack = mbtk_info_pack_creat(info_id);
265 if(pack)
266 {
267 pack->info_err = (uint16)err;
268 mbtk_info_pack_send(fd, pack);
269 mbtk_info_pack_free(&pack);
270 }
271 else
272 {
273 LOG("mbtk_info_pack_creat() fail.");
274 }
275}
276
277void pack_rsp_send(int fd, int info_id, const void* data, int data_len)
278{
279 mbtk_info_pack_t* pack = mbtk_info_pack_creat(info_id);
280 if(pack)
281 {
282 pack->info_err = (uint16)MBTK_INFO_ERR_SUCCESS;
283 if(data != NULL && data_len > 0)
284 {
285 //mbtk_info_pack_data_set(pack, data, data_len);
286 pack->data_len = (uint16)data_len;
287 pack->data = (const uint8*)data;
288 }
289 mbtk_info_pack_send(fd, pack);
290 mbtk_info_pack_free(&pack);
291 }
292 else
293 {
294 LOG("mbtk_info_pack_creat() fail.");
295 }
296}
297
298static int apn_prop_set(mbtk_apn_info_t *apn)
299{
300 char prop_name[20] = {0};
301 char prop_data[300] = {0};
302 sprintf(prop_name, "%s_%d",MBTK_APN_PROP,apn->cid);
303 snprintf(prop_data, 300, "%d,%s,%s,%s,%s", apn->ip_type, apn->apn,
304 str_empty(apn->user) ? "NULL" : apn->user,
305 str_empty(apn->pass) ? "NULL" : apn->pass,
306 str_empty(apn->auth) ? "NULL" : apn->auth);
307
308 return property_set(prop_name, prop_data);
309}
310
311/*
312AT*BAND=?
313*BAND:(0-18),79,147,482,524503
314
315
316OK
317
318AT*BAND=15,78,147,482,134742231
319
320
321*/
322static void band_support_get()
323{
324 // Support band has get.
325 if(band_support.net_pref != 0xFF) {
326 return;
327 }
328
329#if 1
330 // 79,147,482,524503
331 band_support.gsm_band = (uint16)79;
332 band_support.umts_band = (uint16)147;
333 band_support.tdlte_band = (uint32)482;
liubin281ac462023-07-19 14:22:54 +0800334 band_support.fddlte_band = (uint32)134742231;
b.liue0ab2442024-02-06 18:53:28 +0800335 //band_support.fddlte_band = (uint32)524503;
liubin281ac462023-07-19 14:22:54 +0800336 band_support.net_pref = (uint8)0;
337#else
338 ATResponse *response = NULL;
339 int tmp_int;
340 char *tmp_str;
341 int err = at_send_command_singleline("AT*BAND=?", "*BAND:", &response);
342
343 if (err < 0 || response->success == 0 || !response->p_intermediates)
344 goto exit;
345
346 char *line = response->p_intermediates->line;
347 err = at_tok_start(&line);
348 if (err < 0)
349 {
350 goto exit;
351 }
352
353 err = at_tok_nextstr(&line, &tmp_str);
354 if (err < 0)
355 {
356 goto exit;
357 }
358
359 err = at_tok_nextint(&line, &tmp_int);
360 if (err < 0)
361 {
362 goto exit;
363 }
364 band_support.gsm_band = (uint16)tmp_int;
365
366 err = at_tok_nextint(&line, &tmp_int);
367 if (err < 0)
368 {
369 goto exit;
370 }
371 band_support.umts_band = (uint16)tmp_int;
372
373 err = at_tok_nextint(&line, &tmp_int);
374 if (err < 0)
375 {
376 goto exit;
377 }
378 band_support.tdlte_band = (uint32)tmp_int;
379
380 err = at_tok_nextint(&line, &tmp_int);
381 if (err < 0)
382 {
383 goto exit;
384 }
385 band_support.fddlte_band = (uint32)tmp_int;
386 band_support.net_pref = (uint8)0;
387exit:
388 at_response_free(response);
389#endif
390}
391
392static int parseRegistrationState(char *str, int *items, int **response)
393{
394 int err;
395 char *line = str, *p;
396 int *resp = NULL;
397 int skip;
398 int commas;
399
400 LOGD("parseRegistrationState. Parsing: %s",str);
401 err = at_tok_start(&line);
402 if (err < 0) goto error;
403
404 /* Ok you have to be careful here
405 * The solicited version of the CREG response is
406 * +CREG: n, stat, [lac, cid]
407 * and the unsolicited version is
408 * +CREG: stat, [lac, cid]
409 * The <n> parameter is basically "is unsolicited creg on?"
410 * which it should always be
411 *
412 * Now we should normally get the solicited version here,
413 * but the unsolicited version could have snuck in
414 * so we have to handle both
415 *
416 * Also since the LAC and CID are only reported when registered,
417 * we can have 1, 2, 3, or 4 arguments here
418 *
419 * finally, a +CGREG: answer may have a fifth value that corresponds
420 * to the network type, as in;
421 *
422 * +CGREG: n, stat [,lac, cid [,networkType]]
423 */
424
425 /* count number of commas */
426 commas = 0;
427 for (p = line ; *p != '\0' ; p++)
428 {
429 if (*p == ',') commas++;
430 }
431
432 resp = (int *)calloc(commas + 1, sizeof(int));
433 if (!resp) goto error;
434 switch (commas)
435 {
436 case 0: /* +CREG: <stat> */
437 err = at_tok_nextint(&line, &resp[0]);
438 if (err < 0) goto error;
439 //resp[1] = -1;
440 //resp[2] = -1;
441 break;
442
443 case 1: /* +CREG: <n>, <stat> */
444 err = at_tok_nextint(&line, &skip);
445 if (err < 0) goto error;
446 err = at_tok_nextint(&line, &resp[0]);
447 if (err < 0) goto error;
448 resp[1] = -1;
449 //resp[2] = -1;
450 if (err < 0) goto error;
451 break;
452
453 case 2: /* +CREG: <stat>, <lac>, <cid> */
454 err = at_tok_nextint(&line, &resp[0]);
455 if (err < 0) goto error;
456 err = at_tok_nexthexint(&line, &resp[1]);
457 if (err < 0) goto error;
458 err = at_tok_nexthexint(&line, &resp[2]);
459 if (err < 0) goto error;
460 break;
461 case 3: /* +CREG: <n>, <stat>, <lac>, <cid> */
462 /* +CEREG: 1,"8330","06447340",7 */
463#if 0
464 err = at_tok_nextint(&line, &skip);
465 if (err < 0) goto error;
466 err = at_tok_nextint(&line, &resp[0]);
467 if (err < 0) goto error;
468 err = at_tok_nexthexint(&line, &resp[1]);
469 if (err < 0) goto error;
470 err = at_tok_nexthexint(&line, &resp[2]);
471 if (err < 0) goto error;
472#else
473 err = at_tok_nextint(&line, &resp[0]);
474 if (err < 0) goto error;
475 err = at_tok_nextint(&line, &resp[1]);
476 if (err < 0) goto error;
477 err = at_tok_nexthexint(&line, &resp[2]);
478 if (err < 0) goto error;
479 err = at_tok_nextint(&line, &resp[3]);
480 if (err < 0) goto error;
481#endif
482 break;
483 /* special case for CGREG, there is a fourth parameter
484 * that is the network type (unknown/gprs/edge/umts)
485 */
486 case 4: /* +CGREG: <n>, <stat>, <lac>, <cid>, <networkType> */
487 /* +CEREG: 2,1,"8330","06447340",7 */
488 err = at_tok_nextint(&line, &skip);
489 if (err < 0) goto error;
490 err = at_tok_nextint(&line, &resp[0]);
491 if (err < 0) goto error;
492 err = at_tok_nexthexint(&line, &resp[1]);
493 if (err < 0) goto error;
494 err = at_tok_nexthexint(&line, &resp[2]);
495 if (err < 0) goto error;
496 err = at_tok_nexthexint(&line, &resp[3]);
497 if (err < 0) goto error;
498 break;
499 default:
500 goto error;
501 }
502 /*
503 if(commas > 1) {
504 s_lac = resp[1];
505 s_cid = resp[2];
506 }*/
507 if (response)
508 *response = resp;
509 if (items)
510 *items = commas + 1;
511 return 0;
512error:
513 free(resp);
514 return -1;
515}
516
517/*
5180: minimum functionality
5191: full functionality
5203: disable phone receive RF circuits.
5214: disable phone both transmit and receive RF circuits
5225: disable SIM
5236: turn off full secondary receive.
524-1: fail
525*/
526static int isRadioOn()
527{
528 ATResponse *p_response = NULL;
529 int err;
530 char *line;
531 int ret;
532
533 err = at_send_command_singleline("AT+CFUN?", "+CFUN:", &p_response);
534
535 if (err < 0 || p_response->success == 0 || !p_response->p_intermediates)
536 {
537 // assume radio is off
538 goto error;
539 }
540
541 line = p_response->p_intermediates->line;
542
543 err = at_tok_start(&line);
544 if (err < 0) goto error;
545
546 err = at_tok_nextint(&line, &ret);
547 if (err < 0) goto error;
548
549 at_response_free(p_response);
550
551 if(ret == 1) {
552 net_info.radio_state = MBTK_RADIO_STATE_ON;
553 } else {
554 net_info.radio_state = MBTK_RADIO_STATE_OFF;
555 }
556
557 return ret;
558
559error:
560
561 at_response_free(p_response);
562 return -1;
563}
564
565/** Returns SIM_NOT_READY on error */
566static mbtk_sim_state_enum getSIMStatus()
567{
568 ATResponse *p_response = NULL;
569 int err;
570 mbtk_sim_state_enum ret;
571 char *cpinLine;
572 char *cpinResult;
573
574 err = at_send_command_singleline("AT+CPIN?", "+CPIN:", &p_response);
575
576 if (err < 0 || p_response->success == 0 || !p_response->p_intermediates)
577 {
578 ret = MBTK_SIM_NOT_READY;
579 goto done;
580 }
581
582 switch (at_get_cme_error(p_response))
583 {
584 case CME_SUCCESS:
585 break;
586
587 case CME_SIM_NOT_INSERTED:
588 ret = MBTK_SIM_ABSENT;
589 goto done;
590
591 default:
592 ret = MBTK_SIM_NOT_READY;
593 goto done;
594 }
595
596 /* CPIN? has succeeded, now look at the result */
597
598 cpinLine = p_response->p_intermediates->line;
599 err = at_tok_start (&cpinLine);
600
601 if (err < 0)
602 {
603 ret = MBTK_SIM_NOT_READY;
604 goto done;
605 }
606
607 err = at_tok_nextstr(&cpinLine, &cpinResult);
608
609 if (err < 0)
610 {
611 ret = MBTK_SIM_NOT_READY;
612 goto done;
613 }
614
615 if (0 == strcmp (cpinResult, "SIM PIN"))
616 {
617 ret = MBTK_SIM_PIN;
618 goto done;
619 }
620 else if (0 == strcmp (cpinResult, "SIM PUK"))
621 {
622 ret = MBTK_SIM_PUK;
623 goto done;
624 }
625 else if (0 == strcmp (cpinResult, "PH-NET PIN"))
626 {
627 return MBTK_SIM_NETWORK_PERSONALIZATION;
628 }
629 else if (0 != strcmp (cpinResult, "READY"))
630 {
631 /* we're treating unsupported lock types as "sim absent" */
632 ret = MBTK_SIM_ABSENT;
633 goto done;
634 }
635
636 at_response_free(p_response);
637 p_response = NULL;
638 cpinResult = NULL;
639
640 // ret = net_info.radio_state == MBTK_RADIO_STATE_ON ? MBTK_SIM_READY : MBTK_SIM_NOT_READY;
641 net_info.sim_state = MBTK_SIM_READY;
642 return MBTK_SIM_READY;
643done:
644 at_response_free(p_response);
645 net_info.sim_state = ret;
646 return ret;
647}
648
649void setRadioPower(int isOn)
650{
651 int err;
652 ATResponse *p_response = NULL;
653
654 LOGI("RadioPower - %s", isOn == 0 ? "OFF" : "ON");
655
656 if(isOn == 0 && net_info.radio_state == MBTK_RADIO_STATE_ON)
657 {
658 err = at_send_command("AT+CFUN=0", &p_response);
659 if (err || !p_response->success)
660 goto error;
661
662 net_info.radio_state = MBTK_RADIO_STATE_OFF;
663 }
664 else if(isOn && net_info.radio_state != MBTK_RADIO_STATE_ON)
665 {
666 err = at_send_command("AT+CFUN=1", &p_response);
667 if (err || !p_response->success)
668 {
669 if(isRadioOn() == 1)
670 {
671 net_info.radio_state = MBTK_RADIO_STATE_ON;
672 }
673 goto error;
674 }
675
676 net_info.radio_state = MBTK_RADIO_STATE_ON;
677 }
678
679 at_response_free(p_response);
680 return;
681error:
682 at_response_free(p_response);
683}
684
685static int apn_user_pass_set_by_cid(int cid, mbtk_apn_info_t *apn)
686{
687 char prop_name[20] = {0};
688 char prop_data[300] = {0};
689 sprintf(prop_name, "%s_%d",MBTK_APN_PROP,cid);
690 if(property_get(prop_name, prop_data, "") > 0 && !str_empty(prop_data)) {
691 char apn_name[128] = {0};
692 char *ptr_1 = prop_data;
693 mbtk_ip_type_enum ip_type = (mbtk_ip_type_enum)atoi(ptr_1);
694 ptr_1 = strstr(ptr_1, ",");
695 if(!ptr_1) {
696 return -1;
697 }
698 ptr_1++; // Jump ',' to apn
699
700 char *ptr_2 = strstr(ptr_1, ",");
701 if(!ptr_2) {
702 return -1;
703 }
704 memcpy(apn_name, ptr_1, ptr_2 - ptr_1); // apn
705
706 // Check ip_type and apn_name
707 if(ip_type != apn->ip_type || strcmp(apn_name, apn->apn)) {
708 LOGD("APN Changed, not get user/pass/auth.");
709 return -1;
710 }
711
712 ptr_2++; // Jump ',' to user
713 ptr_1 = strstr(ptr_2, ",");
714 if(!ptr_1) {
715 return -1;
716 }
717 if(memcmp(ptr_2, "NULL", 4)) { // Not "NULL"
718 memcpy(apn->user, ptr_2, ptr_1 - ptr_2); // user
719 }
720
721 ptr_1++; // Jump ',' to pass
722 ptr_2 = strstr(ptr_1, ",");
723 if(!ptr_2) {
724 return -1;
725 }
726 if(memcmp(ptr_1, "NULL", 4)) { // Not "NULL"
727 memcpy(apn->pass, ptr_1, ptr_2 - ptr_1); // pass
728 }
729
730 ptr_2++; // Jump ',' to auth (Is last item)
731 if(memcmp(ptr_2, "NULL", 4)) { // Not "NULL"
732 memcpy(apn->auth, ptr_2, strlen(ptr_2)); // auth
733 }
734
735 return 0;
736 }
737 return -1;
738}
739
740
741/*
742AT+CPOL?
743*EUICC: 1
744
745OK
746*/
747static int req_plmn_get(mbtk_plmn_info *type, int *cme_err)
748{
749 ATResponse *response = NULL;
750 char *tmp_ptr = NULL;
751 int err = at_send_command_multiline("AT+CPOL?", "+CPOL:", &response);
752
753 if (err < 0 || response->success == 0 || !response->p_intermediates){
754 *cme_err = at_get_cme_error(response);
755 goto exit;
756 }
757
758 int mccmnc_type = -1;
759 int count = -1;
760 char *mccmnc_name = NULL;
761 ATLine* lines_ptr = response->p_intermediates;
762 char *line = NULL;
763 while(lines_ptr)
764 {
765 line = lines_ptr->line;
766 //if(strStartsWith(line, "+CPOL:"))
767 {
768 err = at_tok_start(&line);
769 if (err < 0)
770 {
771 goto exit;
772 }
773 err = at_tok_nextint(&line, &count);
774 if (err < 0)
775 {
776 goto exit;
777 }
778 type->count = count;
779
780 err = at_tok_nextint(&line, &mccmnc_type);
781 if (err < 0)
782 {
783 goto exit;
784 }
785 type->mbtk_plmn_name[count-1].format = mccmnc_type;
786
787 err = at_tok_nextstr(&line, &mccmnc_name);
788 if (err < 0)
789 {
790 goto exit;
791 }
792 memcpy(type->mbtk_plmn_name[count-1].plmn_name, mccmnc_name, strlen(mccmnc_name));
793 mccmnc_name = NULL;
794 }
795 lines_ptr = lines_ptr->p_next;
796 }
797
798exit:
799 at_response_free(response);
800 return err;
801}
802
803
804/*
805AT*EUICC?
806*EUICC: 1
807
808OK
809*/
810static int req_sim_card_type_get(uint8 *type, int *cme_err)
811{
812 ATResponse *response = NULL;
813 char *tmp_ptr = NULL;
814 int err = at_send_command_singleline("AT*EUICC?", "*EUICC:", &response);
815
816 if (err < 0 || response->success == 0 || !response->p_intermediates){
817 *cme_err = at_get_cme_error(response);
818 goto exit;
819 }
820
821 char *line = response->p_intermediates->line;
822 err = at_tok_start(&line);
823 if (err < 0)
824 {
825 goto exit;
826 }
827 int sim_card_type = -1;
828 err = at_tok_nextint(&line, &sim_card_type);
829 if (err < 0)
830 {
831 goto exit;
832 }
833 if(sim_card_type != -1)
834 *type = sim_card_type;
835 goto exit;
836exit:
837 at_response_free(response);
838 return err;
839}
840
841/*
842AT+EPIN?
843+EPIN: 3,0,10,0
844
845OK
846*/
847static int req_pin_puk_last_times_get(mbtk_pin_puk_last_times *times, int *cme_err)
848{
849 ATResponse *response = NULL;
850 char *tmp_ptr = NULL;
851 int err = at_send_command_singleline("AT+EPIN?", "+EPIN:", &response);
852
853 if (err < 0 || response->success == 0 || !response->p_intermediates){
854 *cme_err = at_get_cme_error(response);
855 goto exit;
856 }
857
858 char *line = response->p_intermediates->line;
859 err = at_tok_start(&line);
860 if (err < 0)
861 {
862 goto exit;
863 }
864 mbtk_pin_puk_last_times last_times={0};
865 err = at_tok_nextint(&line, &(last_times.p1_retry));
866 if (err < 0)
867 {
868 goto exit;
869 }
870 times->p1_retry = last_times.p1_retry;
871 err = at_tok_nextint(&line, &(last_times.p2_retry));
872 if (err < 0)
873 {
874 goto exit;
875 }
876 times->p2_retry = last_times.p2_retry;
877 err = at_tok_nextint(&line, &(last_times.puk1_retry));
878 if (err < 0)
879 {
880 goto exit;
881 }
882 times->puk1_retry = last_times.puk1_retry;
883 err = at_tok_nextint(&line, &(last_times.puk2_retry));
884 if (err < 0)
885 {
886 goto exit;
887 }
888 times->puk2_retry = last_times.puk2_retry;
889
890exit:
891 at_response_free(response);
892 return err;
893}
894
895
896/*
897AT+CGSN
898864788050901201
899
900OK
901*/
902static int req_imei_get(void *data, int *cme_err)
903{
904 ATResponse *response = NULL;
905 int err = at_send_command_numeric("AT+CGSN", &response);
906
907 if (err < 0 || response->success == 0 || !response->p_intermediates) {
908 *cme_err = at_get_cme_error(response);
909 goto exit;
910 }
911
912 memcpy(data, response->p_intermediates->line, strlen(response->p_intermediates->line));
913exit:
914 at_response_free(response);
915 return err;
916}
917
918/*
919AT+MRD_SN=R
920+MRD_SN:0101,Thu Nov 12 00:00:00 2020,G4M32301020006
921
922OK
923
924*/
925static int req_sn_get(void *data, int *cme_err)
926{
927 ATResponse *response = NULL;
928 char *tmp_ptr = NULL;
929 int err = at_send_command_singleline("AT+MRD_SN=R", "+MRD_SN:", &response);
930
931 if (err < 0 || response->success == 0 || !response->p_intermediates){
932 *cme_err = at_get_cme_error(response);
933 goto exit;
934 }
935
936 char *line = response->p_intermediates->line;
937 err = at_tok_start(&line);
938 if (err < 0)
939 {
940 goto exit;
941 }
942
943 err = at_tok_nextstr(&line, &tmp_ptr);
944 if (err < 0)
945 {
946 goto exit;
947 }
948
949 err = at_tok_nextstr(&line, &tmp_ptr);
950 if (err < 0)
951 {
952 goto exit;
953 }
954
955 err = at_tok_nextstr(&line, &tmp_ptr);
956 if (err < 0)
957 {
958 goto exit;
959 }
960
961 memcpy(data, tmp_ptr, strlen(tmp_ptr));
962
963 goto exit;
964exit:
965 at_response_free(response);
966 return err;
967}
968
969/*
970AT+SYSTIME?
971+SYSTIME: 1
972
973OK
974
975*/
976static int req_time_get(int *data, int *cme_err)
977{
978 ATResponse *response = NULL;
979 int tmp_int;
980 int err = at_send_command_singleline("AT+SYSTIME?", "+SYSTIME:", &response);
981
982 if (err < 0 || response->success == 0 || !response->p_intermediates){
983 *cme_err = at_get_cme_error(response);
984 goto exit;
985 }
986
987 char *line = response->p_intermediates->line;
988 err = at_tok_start(&line);
989 if (err < 0)
990 {
991 goto exit;
992 }
993 err = at_tok_nextint(&line, &tmp_int);
994 if (err < 0)
995 {
996 goto exit;
997 }
998 *data = tmp_int;
999
1000exit:
1001 at_response_free(response);
1002 return err;
1003}
1004
1005/*
1006AT+CCLK?
1007+CCLK: "23/03/20,01:58:00+32"
1008
1009OK
1010
1011*/
1012static int req_net_time_get(char *data, int *cme_err)
1013{
1014 ATResponse *response = NULL;
1015 char *tmp_ptr = NULL;
1016 int err = at_send_command_singleline("AT+CCLK?", "+CCLK:", &response);
1017
1018 if (err < 0 || response->success == 0 || !response->p_intermediates){
1019 *cme_err = at_get_cme_error(response);
1020 goto exit;
1021 }
1022
1023 char *line = response->p_intermediates->line;
1024 err = at_tok_start(&line);
1025 if (err < 0)
1026 {
1027 goto exit;
1028 }
1029 err = at_tok_nextstr(&line, &tmp_ptr);
1030 if (err < 0)
1031 {
1032 goto exit;
1033 }
1034 memcpy(data, tmp_ptr, strlen(tmp_ptr));
1035
1036exit:
1037 at_response_free(response);
1038 return err;
1039}
1040
1041/*
1042AT+CFUN?
1043+CFUN: 1
1044OK
1045*/
1046static int req_modem_get(int *data, int *cme_err)
1047{
1048 ATResponse *response = NULL;
1049 int modem;
1050 int err = at_send_command_singleline("AT+CFUN?", "+CFUN:", &response);
1051
1052 if (err < 0 || response->success == 0 || !response->p_intermediates){
1053 *cme_err = at_get_cme_error(response);
1054 goto exit;
1055 }
1056
1057 char *line = response->p_intermediates->line;
1058 err = at_tok_start(&line);
1059 if (err < 0)
1060 {
1061 goto exit;
1062 }
1063 err = at_tok_nextint(&line, &modem);
1064 if (err < 0)
1065 {
1066 goto exit;
1067 }
1068 *data = modem;
1069
1070exit:
1071 at_response_free(response);
1072 return err;
1073}
1074
1075/*
1076AT+CFUN=<fun>[,<rst>]
1077OK
1078*/
1079static int req_modem_set(mbtk_modem_info_t* modem, int *cme_err)
1080{
1081 ATResponse *response = NULL;
1082 char cmd[30] = {0};
1083 int err = -1;
1084
1085 sprintf(cmd, "AT+CFUN=%d,%d", modem->fun, modem->rst);
1086 err = at_send_command(cmd, &response);
1087
1088 if (err < 0 || response->success == 0){
1089 *cme_err = at_get_cme_error(response);
1090 goto exit;
1091 }
1092/*
1093 ATResponse *response = NULL;
1094 int err = at_send_command_multiline(cmd, "", &response);
1095
1096 if (err < 0 || response->success == 0 || !response->p_intermediates){
1097 *cme_err = at_get_cme_error(response);
1098 goto exit;
1099 }
1100
1101 ATLine* lines_ptr = response->p_intermediates;
1102 char *line = NULL;
1103 while(lines_ptr)
1104 {
1105 line = lines_ptr->line;
1106 if(strStartsWith(line, "Revision"))
1107 {
1108 err = at_tok_start(&line);
1109 if (err < 0)
1110 {
1111 goto exit;
1112 }
1113 memcpy(data, line, strlen(line));
1114 break;
1115 }
1116 lines_ptr = lines_ptr->p_next;
1117 }
1118
1119 goto exit;
1120*/
1121exit:
1122 at_response_free(response);
1123 return err;
1124}
1125
1126
1127/*
1128AT+SYSTIME=0,"2022-01-25-11:15:30"
1129OK
1130
1131AT+SYSTIME=1
1132OK
1133*/
1134static int req_time_set(int type, char *time, int *cme_err)
1135{
1136 ATResponse *response = NULL;
1137 int tmp_int;
1138 char cmd[200] = {0};
1139 if(str_empty(time)){
1140 sprintf(cmd, "AT+SYSTIME=%d", type);
1141 } else {
1142 sprintf(cmd, "AT+SYSTIME=%d,\"%s\"", type, time);
1143 }
1144 int err = at_send_command(cmd, &response);
1145
1146 if (err < 0 || response->success == 0){
1147 *cme_err = at_get_cme_error(response);
1148 goto exit;
1149 }
1150
1151exit:
1152 at_response_free(response);
1153 return err;
1154}
1155
1156
1157/*
1158ATI
1159Manufacturer:"LYNQ"
1160Model:"LYNQ_L508TLC"
1161Revision:L508TLCv02.01b01.00
1162IMEI:864788050901201
1163
1164OK
1165
1166*/
1167static int req_version_get(void *data, int *cme_err)
1168{
1169 ATResponse *response = NULL;
1170 int err = at_send_command_multiline("ATI", "", &response);
1171
1172 if (err < 0 || response->success == 0 || !response->p_intermediates){
1173 *cme_err = at_get_cme_error(response);
1174 goto exit;
1175 }
1176
1177 ATLine* lines_ptr = response->p_intermediates;
1178 char *line = NULL;
1179 while(lines_ptr)
1180 {
1181 line = lines_ptr->line;
1182 if(strStartsWith(line, "Revision"))
1183 {
1184 err = at_tok_start(&line);
1185 if (err < 0)
1186 {
1187 goto exit;
1188 }
1189 memcpy(data, line, strlen(line));
1190 break;
1191 }
1192 lines_ptr = lines_ptr->p_next;
1193 }
1194
1195 goto exit;
1196exit:
1197 at_response_free(response);
1198 return err;
1199}
1200
1201/*
1202ATI
1203Manufacturer:"LYNQ"
1204Model:"LYNQ_L508TLC"
1205Revision:L508TLCv02.01b01.00
1206IMEI:864788050901201
1207
1208OK
1209
1210*/
1211static int req_model_get(void *data, int *cme_err)
1212{
1213 ATResponse *response = NULL;
1214 int err = at_send_command_multiline("ATI", "", &response);
1215
1216 if (err < 0 || response->success == 0 || !response->p_intermediates){
1217 *cme_err = at_get_cme_error(response);
1218 goto exit;
1219 }
1220
1221 ATLine* lines_ptr = response->p_intermediates;
1222 char *line = NULL;
1223 while(lines_ptr)
1224 {
1225 line = lines_ptr->line;
1226 if(strStartsWith(line, "Model"))
1227 {
1228 err = at_tok_start(&line);
1229 if (err < 0)
1230 {
1231 goto exit;
1232 }
1233 memcpy(data, line, strlen(line));
1234 break;
1235 }
1236 lines_ptr = lines_ptr->p_next;
1237 }
1238
1239 goto exit;
1240exit:
1241 at_response_free(response);
1242 return err;
1243}
1244
1245/*
1246AT+ACONFIG="IMSD=1"
1247or
1248AT+ACONFIG="IMSD=0"
1249
1250OK
1251*/
1252static int req_volte_set(int state, int *cme_err)
1253{
1254 ATResponse *response = NULL;
1255 char cmd[30] = {0};
1256 if(state)
1257 {
1258 strcpy(cmd, "AT+ACONFIG=\"IMSD=1\"");
1259 }
1260 else
1261 {
1262 strcpy(cmd, "AT+ACONFIG=\"IMSD=0\"");
1263 }
1264 int err = at_send_command(cmd, &response);
1265
1266 if (err < 0 || response->success == 0) {
1267 *cme_err = at_get_cme_error(response);
1268 goto exit;
1269 }
1270
1271 err = 0;
1272exit:
1273 at_response_free(response);
1274 return err;
1275}
1276
1277/*
1278AT+ACONFIG?
1279PID=0,VID=0,IMSD=1,PIPE=0,FAST=0,RDUP=1,NOCP=0,GEFL=-1237040617
1280
1281OK
1282*/
1283static int req_volte_get(int *state, int *cme_err)
1284{
1285 ATResponse *response = NULL;
1286 char *tmp_ptr = NULL;
1287 int err = at_send_command_singleline("AT+ACONFIG?", "", &response);
1288
1289 if (err < 0 || response->success == 0 || !response->p_intermediates){
1290 *cme_err = at_get_cme_error(response);
1291 goto exit;
1292 }
1293
1294 char *line = response->p_intermediates->line;
1295 char* ptr = strstr(line, "IMSD=");
1296 if(ptr)
1297 {
1298 *state = atoi(ptr + strlen("IMSD="));
1299 }
1300 else
1301 {
1302 err = -1;
1303 }
1304exit:
1305 at_response_free(response);
1306 return err;
1307}
1308
1309
1310/*
1311* Get system temperature.
1312*
1313* type[IN]:
1314* 0: Soc temperature.
1315* 1: RF temperature.
1316* temp[OUT]:
1317* temperature in celsius.
1318*
1319
1320AT*RFTEMP
1321*RFTEMP:0,28
1322OK
1323
1324AT*SOCTEMP
1325*SOCTEMP:24000
1326OK
1327
1328*/
1329static int req_temp_get(int type, int *temp, int *cme_err)
1330{
1331 ATResponse *response = NULL;
1332 int err = -1;
1333 int tmp_int;
1334 if(type == 0) { // Soc
1335 err = at_send_command_singleline("AT*SOCTEMP", "*SOCTEMP:", &response);
1336 } else { // RF
1337 err = at_send_command_singleline("AT*RFTEMP", "*RFTEMP:", &response);
1338 }
1339
1340 if (err < 0 || response->success == 0 || !response->p_intermediates){
1341 *cme_err = at_get_cme_error(response);
1342 goto exit;
1343 }
1344
1345 char *line = response->p_intermediates->line;
1346 err = at_tok_start(&line);
1347 if (err < 0)
1348 {
1349 goto exit;
1350 }
1351 err = at_tok_nextint(&line, &tmp_int);
1352 if (err < 0)
1353 {
1354 goto exit;
1355 }
1356
1357 if(type == 1) { // RF
1358 err = at_tok_nextint(&line, &tmp_int);
1359 if (err < 0)
1360 {
1361 goto exit;
1362 }
1363 *temp = tmp_int;
1364 } else {
1365 *temp = tmp_int / 1000;
1366 }
1367
1368exit:
1369 at_response_free(response);
1370 return err;
1371}
1372
1373/*
1374AT*BAND=15
1375OK
1376
1377*/
1378static int req_band_set(mbtk_band_info_t* band, int *cme_err)
1379{
1380 ATResponse *response = NULL;
1381 char cmd[30] = {0};
1382 int err = -1;
1383
1384 if(band->gsm_band == 0 && band->umts_band == 0
1385 && band->tdlte_band == 0 && band->fddlte_band == 0) {
1386 sprintf(cmd, "AT*BAND=%d", band->net_pref);
1387 } else {
1388 band_support_get();
1389
1390 log_hex("BAND_SUPPORT", &band_support, sizeof(mbtk_band_info_t));
1391 log_hex("BAND", band, sizeof(mbtk_band_info_t));
1392
1393 if(band->gsm_band == 0) {
1394 band->gsm_band = band_support.gsm_band;
1395 }
1396 if(band->umts_band == 0) {
1397 band->umts_band = band_support.umts_band;
1398 }
1399 if(band->tdlte_band == 0) {
1400 band->tdlte_band = band_support.tdlte_band;
1401 }
1402 if(band->fddlte_band == 0) {
1403 band->fddlte_band = band_support.fddlte_band;
1404 }
1405
1406 if((band->gsm_band & band_support.gsm_band) != band->gsm_band) {
1407 LOG("GSM band error.");
1408 goto exit;
1409 }
1410
1411 if((band->umts_band & band_support.umts_band) != band->umts_band) {
1412 LOG("UMTS band error.");
1413 goto exit;
1414 }
1415
1416 if((band->tdlte_band & band_support.tdlte_band) != band->tdlte_band) {
1417 LOG("TDLTE band error.");
1418 goto exit;
1419 }
1420
1421 if((band->fddlte_band & band_support.fddlte_band) != band->fddlte_band) {
1422 LOG("FDDLTE band error.");
1423 goto exit;
1424 }
1425
1426 if(band->net_pref == 0xFF) { // No change net_pref.
1427 int tmp_int;
1428 err = at_send_command_singleline("AT*BAND?", "*BAND:", &response);
1429 if (err < 0 || response->success == 0 || !response->p_intermediates){
1430 *cme_err = at_get_cme_error(response);
1431 goto exit;
1432 }
1433
1434 char *line = response->p_intermediates->line;
1435 err = at_tok_start(&line);
1436 if (err < 0)
1437 {
1438 goto exit;
1439 }
1440
1441 err = at_tok_nextint(&line, &tmp_int);
1442 if (err < 0)
1443 {
1444 goto exit;
1445 }
1446 band->net_pref = (uint8)tmp_int; // Set to current net_pref.
1447
1448 at_response_free(response);
1449 }
1450
1451 sprintf(cmd, "AT*BAND=%d,%d,%d,%d,%d", band->net_pref, band->gsm_band, band->umts_band, band->tdlte_band, band->fddlte_band);
1452 }
1453 err = at_send_command(cmd, &response);
1454
1455 if (err < 0 || response->success == 0){
1456 *cme_err = at_get_cme_error(response);
1457 goto exit;
1458 }
1459
1460 err = 0;
1461exit:
1462 at_response_free(response);
1463 return err;
1464}
1465
1466/*
1467// ???????
1468AT*BAND=?
1469*BAND:(0-18),79,147,482,524503
1470
1471OK
1472
1473// ???????????
1474AT*BAND?
1475*BAND: 15, 78, 147, 482, 524503, 0, 2, 2, 0, 0
1476
1477OK
1478
1479// ?????????
1480AT*BAND=5,79,147,128,1
1481OK
1482
1483net_prefferred??
1484 0 : GSM only
1485 1 : UMTS only
1486 2 : GSM/UMTS(auto)
1487 3 : GSM/UMTS(GSM preferred)
1488 4 : GSM/UMTS(UMTS preferred)
1489 5 : LTE only
1490 6 : GSM/LTE(auto)
1491 7 : GSM/LTE(GSM preferred)
1492 8 : GSM/LTE(LTE preferred)
1493 9 : UMTS/LTE(auto)
1494 10 : UMTS/LTE(UMTS preferred)
1495 11 : UMTS/LTE(LTE preferred)
1496 12 : GSM/UMTS/LTE(auto)
1497 13 : GSM/UMTS/LTE(GSM preferred)
1498 14 : GSM/UMTS/LTE(UMTS preferred)
1499 15 : GSM/UMTS/LTE(LTE preferred)
1500GSM band??
1501 1 ?C PGSM 900 (standard or primary)
1502 2 ?C DCS GSM 1800
1503 4 ?C PCS GSM 1900
1504 8 ?C EGSM 900 (extended)
1505 16 ?C GSM 450
1506 32 ?C GSM 480
1507 64 ?C GSM 850
1508 512 - BAND_LOCK_BIT // used for GSM band setting
1509UMTS band??
1510 1 ?C UMTS_BAND_1
1511 2 ?C UMTS_BAND_2
1512 4 ?C UMTS_BAND_3
1513 8 ?C UMTS_BAND_4
1514 16 ?C UMTS_BAND_5
1515 32 ?C UMTS_BAND_6
1516 64 ?C UMTS_BAND_7
1517 128 ?C UMTS_BAND_8
1518 256 ?C UMTS_BAND_9
1519LTEbandH(TDD-LTE band)
1520 32 ?C TDLTE_BAND_38
1521 64 ?C TDLTE_BAND_39
1522 128 ?C TDLTE_BAND_40
1523 256 ?C TDLTE_BAND_41
1524LTEbandL(FDD-LTE band)
1525 1 ?C FDDLTE_BAND_1
1526 4 ?C FDDLTE _BAND_3
1527 8 ?C FDDLTE _BAND_4
1528 64 ?C FDDLTE _BAND_7
1529 65536 ?C FDDLTE _BAND_17
1530 524288 ?C FDDLTE _BAND_20
1531*/
1532static int req_band_get(mbtk_band_info_t *band, int *cme_err)
1533{
1534 ATResponse *response = NULL;
1535 int tmp_int;
1536
1537 band_support_get();
1538
1539 log_hex("BAND_SUPPORT", &band_support, sizeof(mbtk_band_info_t));
1540 int err = at_send_command_singleline("AT*BAND?", "*BAND:", &response);
1541 if (err < 0 || response->success == 0 || !response->p_intermediates){
1542 *cme_err = at_get_cme_error(response);
1543 goto exit;
1544 }
1545
1546 char *line = response->p_intermediates->line;
1547 err = at_tok_start(&line);
1548 if (err < 0)
1549 {
1550 goto exit;
1551 }
1552
1553 err = at_tok_nextint(&line, &tmp_int);
1554 if (err < 0)
1555 {
1556 goto exit;
1557 }
1558 band->net_pref = (uint8)tmp_int;
1559
1560 err = at_tok_nextint(&line, &tmp_int);
1561 if (err < 0)
1562 {
1563 goto exit;
1564 }
1565 band->gsm_band = (uint16)tmp_int;
1566
1567 err = at_tok_nextint(&line, &tmp_int);
1568 if (err < 0)
1569 {
1570 goto exit;
1571 }
1572 band->umts_band = (uint16)tmp_int;
1573
1574 err = at_tok_nextint(&line, &tmp_int);
1575 if (err < 0)
1576 {
1577 goto exit;
1578 }
1579 band->tdlte_band = (uint32)tmp_int;
1580
1581 err = at_tok_nextint(&line, &tmp_int);
1582 if (err < 0)
1583 {
1584 goto exit;
1585 }
1586 band->fddlte_band = (uint32)tmp_int;
1587
1588 log_hex("BAND", band, sizeof(mbtk_band_info_t));
1589
1590exit:
1591 at_response_free(response);
1592 return err;
1593}
1594
1595/*
1596AT+ICCID
1597+ICCID: 89860621330065648041
1598
1599OK
1600*/
1601static int req_iccid_get(void *data, int *cme_err)
1602{
1603 ATResponse *response = NULL;
1604 char *tmp_ptr = NULL;
1605 int err = at_send_command_singleline("AT+ICCID", "+ICCID:", &response);
1606
1607 if (err < 0 || response->success == 0 || !response->p_intermediates){
1608 *cme_err = at_get_cme_error(response);
1609 goto exit;
1610 }
1611
1612 char *line = response->p_intermediates->line;
1613 err = at_tok_start(&line);
1614 if (err < 0)
1615 {
1616 goto exit;
1617 }
1618
1619 err = at_tok_nextstr(&line, &tmp_ptr);
1620 if (err < 0)
1621 {
1622 goto exit;
1623 }
1624
1625 memcpy(data, tmp_ptr, strlen(tmp_ptr));
1626exit:
1627 at_response_free(response);
1628 return err;
1629}
1630
1631/*
1632AT+CNUM?
1633+CNUM: "","13980414101",129
1634
1635OK
1636
1637*/
1638static int req_phone_number_get(void *data, int *cme_err)
1639{
1640 ATResponse *response = NULL;
1641 char *tmp_ptr = NULL;
1642 int err = at_send_command_singleline("AT+CNUM?", "+CNUM:", &response);
1643 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
1644 if(response) {
1645 *cme_err = at_get_cme_error(response);
1646 }
1647 LOGD("AT+CNUM? fail.");
1648 goto exit;
1649 }
1650
1651 char *line = response->p_intermediates->line;
1652 if(line == NULL) {
1653 LOGD("line is NULL");
1654 goto exit;
1655 }
1656 err = at_tok_start(&line);
1657 if (err < 0)
1658 {
1659 goto exit;
1660 }
1661
1662 err = at_tok_nextstr(&line, &tmp_ptr);
1663 if (err < 0)
1664 {
1665 goto exit;
1666 }
1667
1668 err = at_tok_nextstr(&line, &tmp_ptr);
1669 if (err < 0)
1670 {
1671 goto exit;
1672 }
1673
1674 memcpy(data, tmp_ptr, strlen(tmp_ptr));
1675exit:
1676 at_response_free(response);
1677 return err;
1678}
1679
1680
1681/*
1682AT+CIMI
1683460068103383304
1684
1685OK
1686
1687*/
1688static int req_imsi_get(void *data, int *cme_err)
1689{
1690 ATResponse *response = NULL;
1691 int err = at_send_command_numeric("AT+CIMI", &response);
1692
1693 if (err < 0 || response->success == 0 || !response->p_intermediates){
1694 *cme_err = at_get_cme_error(response);
1695 goto exit;
1696 }
1697
1698 memcpy(data, response->p_intermediates->line, strlen(response->p_intermediates->line));
1699exit:
1700 at_response_free(response);
1701 return err;
1702}
1703
1704
1705/*
1706AT+CLCK=SC,1/0,1234
1707+CLCK:1/0
1708
1709OK
1710
1711*/
1712static int req_pin_enable(mbtk_enable_pin_info *data, int *cme_err)
1713{
1714 ATResponse *response = NULL;
1715 char cmd[64]={0};
1716 sprintf(cmd, "AT+CLCK=SC,%d,%s", data->enable, data->pin_value);
1717
1718 int err = at_send_command_singleline(cmd, "+CLCK:", &response);
1719 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
1720 if(response) {
1721 *cme_err = at_get_cme_error(response);
1722 }
1723 LOGD("AT+CLCK? fail.");
1724 goto exit;
1725 }
1726
1727 char *line = response->p_intermediates->line;
1728 if(line == NULL) {
1729 LOGD("line is NULL");
1730 goto exit;
1731 }
1732 err = at_tok_start(&line);
1733 if (err < 0)
1734 {
1735 goto exit;
1736 }
1737 int clck;
1738 err = at_tok_nextint(&line, &clck);
1739 if (err < 0)
1740 {
1741 goto exit;
1742 }
1743
1744exit:
1745 at_response_free(response);
1746 return err;
1747}
1748
1749/*
1750AT+CPIN=1234
1751
1752OK
1753
1754*/
1755static int req_pin_verify(char *data, int *cme_err)
1756{
1757 ATResponse *response = NULL;
1758 char cmd[64]={0};
1759 sprintf(cmd, "AT+CPIN=%s", data);
1760 int err = at_send_command(cmd, &response);
1761 if (err < 0 || response->success == 0){
1762 if(cme_err) {
1763 *cme_err = at_get_cme_error(response);
1764 }
1765 goto exit;
1766 }
1767
1768exit:
1769 at_response_free(response);
1770 return err;
1771}
1772
1773/*
1774AT+CLCK=SC,2
1775+CLCK: 1
1776
1777OK
1778
1779AT+CLCK="SC",1,"1234"
1780+CLCK:1
1781
1782OK
1783
1784AT+CPWD="SC","1234","4321"
1785
1786OK
1787
1788*/
1789static int req_pin_change(mbtk_change_pin_info *data, int *cme_err)
1790{
1791 ATResponse *response = NULL;
1792 char cmd[64]={0};
1793
1794 int err = at_send_command_singleline("AT+CLCK=SC,2", "+CLCK:", &response);
1795 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
1796 if(response) {
1797 *cme_err = at_get_cme_error(response);
1798 }
1799 LOGD("AT+CLCK fail.");
1800 goto exit;
1801 }
1802
1803 char *line = response->p_intermediates->line;
1804 if(line == NULL) {
1805 LOGD("line is NULL");
1806 goto exit;
1807 }
1808 err = at_tok_start(&line);
1809 if (err < 0)
1810 {
1811 goto exit;
1812 }
1813 int clck;
1814 err = at_tok_nextint(&line, &clck);
1815 if (err < 0)
1816 {
1817 goto exit;
1818 }
1819 at_response_free(response);
1820
1821 if(clck==0)
1822 {
1823 sprintf(cmd, "AT+CLCK=SC,1,%s", data->old_pin_value);
1824 err = at_send_command_singleline(cmd, "+CLCK:", &response);
1825 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
1826 if(response) {
1827 *cme_err = at_get_cme_error(response);
1828 }
1829 LOGD("AT+CLCK fail.");
1830 goto exit;
1831 }
1832 line = response->p_intermediates->line;
1833 if(line == NULL) {
1834 LOGD("line is NULL");
1835 goto exit;
1836 }
1837 err = at_tok_start(&line);
1838 if (err < 0)
1839 {
1840 goto exit;
1841 }
1842 clck = -1;
1843 err = at_tok_nextint(&line, &clck);
1844 if (err < 0)
1845 {
1846 goto exit;
1847 }
1848 at_response_free(response);
1849 if(clck != 1)
1850 return err;
1851 }
1852 memset(cmd, 0, 64);
1853 sprintf(cmd, "AT+CPWD=SC,%s,%s", data->old_pin_value,data->new_pin_value);
1854 err = at_send_command(cmd, &response);
1855 if (err < 0 || response->success == 0){
1856 if(cme_err) {
1857 *cme_err = at_get_cme_error(response);
1858 }
1859 goto exit;
1860 }
1861
1862exit:
1863 at_response_free(response);
1864 return err;
1865}
1866
1867/*
1868AT+CPIN?
1869+CPIN:SIM PUK
1870
1871OK
1872
1873AT+CPIN="PUK","PIN"
1874+CPIN: READY
1875
1876OK
1877*/
1878static int req_puk_unlock_pin(mbtk_unlock_pin_info *data, int *cme_err)
1879{
1880 ATResponse *response = NULL;
1881 char cmd[64]={0};
1882#if 0
1883 int err = at_send_command_singleline("AT+CPIN?", "+CPIN:", &response);
1884 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
1885 if(response) {
1886 *cme_err = at_get_cme_error(response);
1887 }
1888 LOGD("AT+CNUM? fail.");
1889 goto exit;
1890 }
1891
1892 char *line = response->p_intermediates->line;
1893 if(line == NULL) {
1894 LOGD("line is NULL");
1895 goto exit;
1896 }
1897 err = at_tok_start(&line);
1898 if (err < 0)
1899 {
1900 goto exit;
1901 }
1902 char *tmp_ptr = NULL;
1903 err = at_tok_nextstr(&line, &tmp_ptr);
1904 if (err < 0)
1905 {
1906 goto exit;
1907 }
1908 at_response_free(response);
1909
1910 if(!strstr(tmp_ptr,"SIM PUK"))
1911 {
1912 sprintf(cmd, "AT+CPIN=%s,%s", data->puk_value, data->pin_value);
1913 err = at_send_command_singleline(cmd, "+CPIN:", &response);
1914 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
1915 if(response) {
1916 *cme_err = at_get_cme_error(response);
1917 }
1918 LOGD("AT+CNUM? fail.");
1919 goto exit;
1920 }
1921 line = response->p_intermediates->line;
1922 if(line == NULL) {
1923 LOGD("line is NULL");
1924 goto exit;
1925 }
1926 err = at_tok_start(&line);
1927 if (err < 0)
1928 {
1929 goto exit;
1930 }
1931 memset(tmp_ptr, 0, strlen(tmp_ptr));
1932 err = at_tok_nextstr(&line, &tmp_ptr);
1933 if (err < 0)
1934 {
1935 goto exit;
1936 }
1937 at_response_free(response);
1938 if(strstr(tmp_ptr, "READY"))
1939 return err;
1940 }
1941 else
1942 return err;
1943#else
1944 sprintf(cmd, "AT+CPIN=%s,%s", data->puk_value, data->pin_value);
r.xiao2ad43d12024-03-23 00:03:29 -07001945 int err = at_send_command(cmd, &response);
1946 if (err < 0 || response->success == 0){
1947 if(cme_err) {
liubin281ac462023-07-19 14:22:54 +08001948 *cme_err = at_get_cme_error(response);
1949 }
liubin281ac462023-07-19 14:22:54 +08001950 goto exit;
1951 }
r.xiao2ad43d12024-03-23 00:03:29 -07001952
liubin281ac462023-07-19 14:22:54 +08001953#endif
1954exit:
1955 at_response_free(response);
1956 return err;
1957}
1958
1959/*
1960AT+COPS=?
1961
1962+COPS: (2, "CHINA MOBILE", "CMCC", "46000", 7),(3, "CHN-CT", "CT", "46011", 7),(3, "CHN-UNICOM", "UNICOM", "46001", 7),(1, "460 15", "460 15", "46015", 7),,(0,1,2,3,4),(0,1,2)
1963
1964OK
1965
1966// Return [sel_mode(uint8)type(uint8)plmn(uint32)...sel_mode(uint8)type(uint8)plmn(uint32)]
1967*/
1968#if 0
1969static int req_available_net_get(mbtk_net_array_info_t *data_ptr)
1970{
1971 ATResponse *response = NULL;
1972 char *tmp_ptr = NULL;
1973 int tmp_int;
1974 int err = at_send_command_singleline("AT+COPS=?", "+COPS:", &response);
1975
1976 if (err < 0 || response->success == 0 || !response->p_intermediates)
1977 goto exit;
1978#if 1
1979 char *line_ptr = response->p_intermediates->line;
1980 if(line_ptr == NULL) {
1981 LOG("line is NULL");
1982 goto exit;
1983 }
1984 //LOG("Line:%s",line_ptr);
1985 line_ptr = strstr(line_ptr, "(");
1986 while(line_ptr) {
1987 line_ptr++;
1988 // Only for available/current net.
1989 if(*line_ptr == '1' || *line_ptr == '2') {
1990 //LOG("Temp:%s",line_ptr);
1991 //sleep(1);
1992 line_ptr = strstr(line_ptr, ",");
1993 if(line_ptr == NULL)
1994 goto exit;
1995 line_ptr++;
1996
1997 line_ptr = strstr(line_ptr, ",");
1998 if(line_ptr == NULL)
1999 goto exit;
2000 line_ptr++;
2001
2002 line_ptr = strstr(line_ptr, ",");
2003 if(line_ptr == NULL)
2004 goto exit;
2005
2006 while(*line_ptr != '\0' && (*line_ptr == ',' || *line_ptr == ' ' || *line_ptr == '"'))
2007 line_ptr++;
2008
2009 mbtk_net_info_t *net = (mbtk_net_info_t*)malloc(sizeof(mbtk_net_info_t));
2010 if(net == NULL) {
2011 LOG("malloc() fail.");
2012 goto exit;
2013 }
2014 memset(net, 0, sizeof(mbtk_net_info_t));
2015
2016 // Point to "46000"
2017 //LOG("PLMN:%s",line_ptr);
2018 //sleep(1);
2019 net->plmn = (uint32)atoi(line_ptr);
2020
2021 line_ptr = strstr(line_ptr, ",");
2022 if(line_ptr == NULL)
2023 goto exit;
2024
2025 while(*line_ptr != '\0' && (*line_ptr == ',' || *line_ptr == ' '))
2026 line_ptr++;
2027
2028 // Point to "7"
2029 if(*line_ptr == '\0') {
2030 free(net);
2031 goto exit;
2032 }
2033 //LOG("Type:%s",line_ptr);
2034 //sleep(1);
2035 net->net_type = (uint8)atoi(line_ptr);
2036 list_add(data_ptr->net_list, net);
2037 data_ptr->count++;
2038 }
2039
2040 line_ptr = strstr(line_ptr, "(");
2041 }
2042#endif
2043exit:
2044 at_response_free(response);
2045 return err;
2046}
2047#else
2048static int req_available_net_get(void* buff, int *cme_err)
2049{
2050 ATResponse *response = NULL;
2051 char *tmp_ptr = NULL;
2052 int tmp_int;
2053 int buff_size = 0;
2054 int err = at_send_command_singleline("AT+COPS=?", "+COPS:", &response);
2055
2056 if (err < 0 || response->success == 0 || !response->p_intermediates){
2057 *cme_err = at_get_cme_error(response);
2058 goto exit;
2059 }
2060 char *line_ptr = response->p_intermediates->line;
2061 if(line_ptr == NULL) {
2062 LOG("line is NULL");
2063 goto exit;
2064 }
2065 uint8* buff_ptr = (uint8*)buff;
2066 //LOG("Line:%s",line_ptr);
2067 line_ptr = strstr(line_ptr, "(");
2068 while(line_ptr) {
2069 line_ptr++;
2070 // Only for available/current net.
2071 if(*line_ptr == '1' || *line_ptr == '2' || *line_ptr == '3') {
2072 *(buff_ptr + 2) = (uint8)atoi(line_ptr); // net_state
2073
2074 line_ptr = strstr(line_ptr, ",");
2075 if(line_ptr == NULL)
2076 goto exit;
2077 line_ptr++;
2078
2079 line_ptr = strstr(line_ptr, ",");
2080 if(line_ptr == NULL)
2081 goto exit;
2082 line_ptr++;
2083
2084 line_ptr = strstr(line_ptr, ",");
2085 if(line_ptr == NULL)
2086 goto exit;
2087
2088 while(*line_ptr != '\0' && (*line_ptr == ',' || *line_ptr == ' ' || *line_ptr == '"'))
2089 line_ptr++;
2090
2091 // set sel_mode to 0
2092 *buff_ptr = (uint8)0;
2093 // Point to "46000"
2094 //LOG("PLMN:%s",line_ptr);
2095 //sleep(1);
2096 uint32_2_byte((uint32)atoi(line_ptr), buff_ptr + 3, false); // plmn
2097
2098 line_ptr = strstr(line_ptr, ",");
2099 if(line_ptr == NULL)
2100 goto exit;
2101
2102 while(*line_ptr != '\0' && (*line_ptr == ',' || *line_ptr == ' '))
2103 line_ptr++;
2104
2105 // Point to "7"
2106 if(*line_ptr == '\0') {
2107 goto exit;
2108 }
2109 //LOG("Type:%s",line_ptr);
2110 //sleep(1);
2111 *(buff_ptr + 1) = (uint8)atoi(line_ptr); // net_type
2112
2113 buff_size += sizeof(mbtk_net_info_t);
2114 buff_ptr += sizeof(mbtk_net_info_t);
2115 }
2116
2117 line_ptr = strstr(line_ptr, "(");
2118 }
2119exit:
2120 at_response_free(response);
2121 return buff_size;
2122}
2123#endif
2124
2125/*
2126AT+COPS?
2127+COPS: 1
2128
2129OK
2130
2131or
2132
2133AT+COPS?
2134+COPS: 0,2,"46001",7
2135
2136OK
2137
2138*/
2139static int req_net_sel_mode_get(mbtk_net_info_t *net, int *cme_err)
2140{
2141 //LOG("req_net_sel_mode_get() 0");
2142 //sleep(1);
2143 ATResponse *response = NULL;
2144 int tmp_int;
2145 char *tmp_ptr = NULL;
2146 int err = at_send_command_singleline("AT+COPS?", "+COPS:", &response);
2147 //LOG("req_net_sel_mode_get() 00");
2148 //sleep(1);
2149 if (err < 0 || response->success == 0 || !response->p_intermediates){
2150 if(cme_err != NULL)
2151 *cme_err = at_get_cme_error(response);
2152 err = -1;
2153 goto exit;
2154 }
2155 //LOG("req_net_sel_mode_get() 1");
2156 //sleep(1);
2157 char *line = response->p_intermediates->line;
2158 if(line == NULL) {
2159 LOG("line is NULL");
2160 goto exit;
2161 }
2162 //LOG("req_net_sel_mode_get() 2");
2163 //sleep(1);
2164 err = at_tok_start(&line);
2165 if (err < 0)
2166 {
2167 goto exit;
2168 }
2169 //LOG("req_net_sel_mode_get() 3");
2170 //sleep(1);
2171 err = at_tok_nextint(&line, &tmp_int);
2172 if (err < 0)
2173 {
2174 goto exit;
2175 }
2176 net->net_sel_mode = (uint8)tmp_int;
2177 //LOG("req_net_sel_mode_get() 4");
2178 //sleep(1);
2179 // +COPS: 1
2180 if(!at_tok_hasmore(&line)) {
2181 goto exit;
2182 }
2183 //LOG("req_net_sel_mode_get() 5");
2184 //sleep(1);
2185 err = at_tok_nextint(&line, &tmp_int);
2186 if (err < 0)
2187 {
2188 goto exit;
2189 }
2190 //LOG("req_net_sel_mode_get() 6");
2191 //sleep(1);
2192 err = at_tok_nextstr(&line, &tmp_ptr);
2193 if (err < 0)
2194 {
2195 goto exit;
2196 }
2197 // memcpy(net->plmn, tmp_ptr, strlen(tmp_ptr));
2198 net->plmn = (uint32)atoi(tmp_ptr);
2199 //LOG("req_net_sel_mode_get() 7");
2200 //sleep(1);
2201 err = at_tok_nextint(&line, &tmp_int);
2202 if (err < 0)
2203 {
2204 goto exit;
2205 }
2206 net->net_type = (uint8)tmp_int;
2207
2208 net->net_state = (uint8)MBTK_NET_AVIL_STATE_CURRENT;
2209
2210exit:
2211 //LOG("req_net_sel_mode_get() 8");
2212 //sleep(1);
2213 at_response_free(response);
2214 return err;
2215}
2216
2217/*
2218AT+COPS=0
2219or
2220AT+COPS=1,2,"46000",7
2221
2222OK
2223
2224*/
2225static int req_net_sel_mode_set(mbtk_net_info_t* net, int *cme_err)
2226{
2227 ATResponse *response = NULL;
2228 char cmd[50] = {0};
2229 char* cmp_ptr = cmd;
2230 if(net == NULL) {
2231 cmp_ptr += sprintf(cmp_ptr, "AT+COPS=0");
2232 } else {
2233 if(net->net_sel_mode == 0) {
2234 cmp_ptr += sprintf(cmp_ptr, "AT+COPS=0");
2235 } else if(net->net_type == 0xFF) {
2236 cmp_ptr += sprintf(cmp_ptr, "AT+COPS=1,2,\"%d\"",net->plmn);
2237 } else {
2238 cmp_ptr += sprintf(cmp_ptr, "AT+COPS=1,2,\"%d\",%d",net->plmn, net->net_type);
2239 }
2240 }
2241
2242 int err = at_send_command(cmd, &response);
2243
2244 if (err < 0 || response->success == 0) {
2245 *cme_err = at_get_cme_error(response);
2246 goto exit;
2247 }
2248
2249exit:
2250 at_response_free(response);
2251 return err;
2252}
2253
2254/*
2255AT+EEMOPT=1
2256OK
2257
2258// LTE
2259AT+EEMGINFO?
2260// <mcc>, <length of mnc>, <mnc>, <tac>, <PCI>, <dlEuarfcn>, < ulEuarfcn >, <band>, <dlBandwidth>,
2261// <rsrp>,<rsrq>, <sinr>,
2262// errcModeState,emmState,serviceState,IsSingleEmmRejectCause,EMMRejectCause,mmeGroupId,mmeCode,mTmsi,
2263// cellId,subFrameAssignType,specialSubframePatterns,transMode
2264// mainRsrp,diversityRsrp,mainRsrq,diversityRsrq,rssi,cqi,pathLoss,tb0DlTpt,tb1DlTpt,tb0DlPeakTpt,tb1DlPeakTpt,tb0UlPeakTpt,
2265// tb1UlPeakTpt,dlThroughPut,dlPeakThroughPut,averDlPRB,averCQITb0,averCQITb1,rankIndex,grantTotal,ulThroughPut,ulPeakThroughPut,currPuschTxPower,averUlPRB,
2266// dlBer, ulBer,
2267// diversitySinr, diversityRssi
2268+EEMLTESVC: 1120, 2, 0, 33584, 430, 40936, 40936, 41, 20,
22690, 0, 0,
22701, 10, 0, 1, 0, 1059, 78, 3959566565,
2271105149248, 2, 7, 7,
22720, 0, 0, 0, 0, 0, 0, 1190919, 0, 0, 0, 16779777,
22730, 5112867, 3959566565, 2, 0, 0, 0, 0, 0, 0, 0, 0,
22740, 0,
22757, 44
2276
2277// index,phyCellId,euArfcn,rsrp,rsrq
2278+EEMLTEINTER: 0, 65535, 38950, 0, 0
2279
2280+EEMLTEINTER: 1, 0, 0, 0, 0
2281
2282+EEMLTEINTER: 2, 0, 4294967295, 255, 255
2283
2284+EEMLTEINTER: 3, 65535, 1300, 0, 0
2285
2286+EEMLTEINTER: 4, 0, 0, 0, 0
2287
2288+EEMLTEINTER: 5, 0, 4294967295, 247, 0
2289
2290+EEMLTEINTER: 6, 197, 41332, 24, 9
2291
2292+EEMLTEINTER: 7, 0, 0, 0, 0
2293
2294+EEMLTEINTER: 8, 0, 0, 0, 0
2295
2296+EEMLTEINTRA: 0, 429, 40936, 56, 12
2297
2298+EEMLTEINTERRAT: 0,0
2299
2300+EEMLTEINTERRAT: 1,0
2301
2302+EEMGINFO: 3, 2 // <state>:
2303 // 0: ME in Idle mode
2304 // 1: ME in Dedicated mode
2305 // 2: ME in PS PTM mode
2306 // 3: invalid state
2307 // <nw_type>:
2308 // 0: GSM 1: UMTS 2: LTE
2309
2310OK
2311
2312// WCDMA
2313AT+EEMGINFO?
2314// Mode, sCMeasPresent, sCParamPresent, ueOpStatusPresent,
2315
2316// if sCMeasPresent == 1
2317// cpichRSCP, utraRssi, cpichEcN0, sQual, sRxLev, txPower,
2318// endif
2319
2320// if sCParamPresent == 1
2321// rac, nom, mcc, mnc_len, mnc, lac, ci,
2322// uraId, psc, arfcn, t3212, t3312, hcsUsed, attDetAllowed,
2323// csDrxCycleLen, psDrxCycleLen, utranDrxCycleLen, HSDPASupport, HSUPASupport,
2324// endif
2325
2326// if ueOpStatusPresent == 1
2327// rrcState, numLinks, srncId, sRnti,
2328// algPresent, cipherAlg, cipherOn, algPresent, cipherAlg, cipherOn,
2329// HSDPAActive, HSUPAActive, MccLastRegisteredNetwork, MncLastRegisteredNetwork, TMSI, PTMSI, IsSingleMmRejectCause, IsSingleGmmRejectCause,
2330// MMRejectCause, GMMRejectCause, mmState, gmmState, gprsReadyState, readyTimerValueInSecs, NumActivePDPContext, ULThroughput, DLThroughput,
2331// serviceStatus, pmmState, LAU_status, LAU_count, RAU_status, RAU_count
2332// endif
2333//
2334+EEMUMTSSVC: 3, 1, 1, 1,
2335-80, 27, -6, -18, -115, -32768,
23361, 1, 1120, 2, 1, 61697, 168432821,
233715, 24, 10763, 0, 0, 0, 0,
2338128, 128, 65535, 0, 0,
23392, 255, 65535, 4294967295,
23400, 0, 0, 0, 0, 0,
23410, 0, 0, 0, 0, 0, 1, 1,
234228672, 28672, 0, 0, 0, 0, 0, 0, 0,
23430, 0, 0, 0, 0, 0
2344
2345// index, cpichRSCP, utraRssi, cpichEcN0, sQual, sRxLev ,mcc, mnc, lac, ci, arfcn, psc
2346+EEMUMTSINTRA: 0, -32768, -1, -32768, -18, -115, 0, 0, 65534, 1, 10763, 32
2347
2348+EEMUMTSINTRA: 1, -1, -32768, -18, -115, 0, 0, 65534, 2, 10763, 40, 32768
2349
2350+EEMUMTSINTRA: 2, -32768, -18, -115, 0, 0, 65534, 3, 10763, 278, 32768, 65535
2351
2352+EEMUMTSINTRA: 3, -18, -115, 0, 0, -2, 4, 10763, 28, 32768, 65535, 32768
2353
2354+EEMUMTSINTRA: 4, -115, 0, 0, -2, 5, 10763, 270, 32768, 65535, 32768, 65518
2355
2356+EEMUMTSINTRA: 5, 0, 0, -2, 6, 10763, 286, 32768, 65535, 32768, 65518, 65421
2357
2358+EEMUMTSINTRA: 6, 0, -2, 7, 10763, 80, 32768, 65535, 32768, 65518, 65421, 0
2359
2360+EEMUMTSINTRA: 7, -2, 8, 10763, 206, -32768, 65535, 32768, 65518, 65421, 0, 0
2361
2362+EEMUMTSINTRA: 8, 9, 10763, 11, -32768, -1, 32768, 65518, 65421, 0, 0, 65534
2363
2364+EEMUMTSINTRA: 9, 10763, 19, -32768, -1, -32768, 65518, 65421, 0, 0, 65534, 11
2365
2366+EEMUMTSINTRA: 10, 232, -32768, -1, -32768, -18, 65421, 0, 0, 65534, 12, 10763
2367
2368+EEMUMTSINTRA: 11, -32768, -1, -32768, -18, -115, 0, 0, 65534, 13, 10763, 66
2369
2370+EEMUMTSINTRA: 12, -1, -32768, -18, -115, 0, 0, 65534, 14, 10763, 216, 32768
2371
2372+EEMUMTSINTRA: 13, -32768, -18, -115, 0, 0, 65534, 15, 10763, 183, 32768, 65535
2373
2374+EEMUMTSINTRA: 14, -18, -115, 0, 0, -2, 16, 10763, 165, 32768, 65535, 32768
2375
2376+EEMUMTSINTRA: 15, -115, 0, 0, -2, 17, 10763, 151, 32768, 65535, 32768, 65518
2377
2378+EEMUMTSINTRA: 16, 0, 0, -2, 18, 10763, 43, 32768, 65535, 32768, 65518, 65421
2379
2380+EEMUMTSINTRA: 17, 0, -2, 19, 10763, 72, 32768, 65535, 32768, 65518, 65421, 0
2381
2382+EEMUMTSINTRA: 18, -2, 20, 10763, 157, -32768, 65535, 32768, 65518, 65421, 0, 0
2383
2384+EEMUMTSINTRA: 19, 21, 10763, 165, -32768, -1, 32768, 65518, 65421, 0, 0, 65534
2385
2386+EEMUMTSINTRA: 20, 10763, 301, -32768, -1, -32768, 65518, 65421, 0, 0, 65534, 23
2387
2388+EEMUMTSINTRA: 21, 23, -32768, -1, -32768, -18, 65421, 0, 0, 65534, 24, 10763
2389
2390+EEMUMTSINTRA: 22, -32768, -1, -32768, -18, -115, 0, 0, 65534, 25, 10763, 0
2391
2392+EEMUMTSINTRA: 23, -1, -32768, -18, -115, 0, 0, 65534, 26, 10763, 167, 32768
2393
2394+EEMUMTSINTRA: 24, -32768, -18, -115, 0, 0, 65534, 27, 10763, 34, 32768, 65535
2395
2396+EEMUMTSINTRA: 25, -18, -115, 0, 0, -2, 28, 10763, 313, 32768, 65535, 32768
2397
2398+EEMUMTSINTRA: 26, -115, 0, 0, -2, 29, 10763, 152, 32768, 65535, 32768, 65518
2399
2400+EEMUMTSINTRA: 27, 0, 0, -2, 30, 10763, 239, 0, 0, 0, 0, 0
2401
2402+EEMUMTSINTRA: 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
2403
2404+EEMUMTSINTRA: 29, 0, 0, 0, 0, -115, 0, 0, 65534, 30, 10763, 239
2405
2406// index,gsmRssi,rxLev,C1,C2,mcc,mnc,lac,ci,arfcn,bsic
2407+EEMUMTSINTERRAT: 0, -32768, -107, -1, -1, 0, 0, 65534, 0, 117, 36
2408
2409+EEMUMTSINTERRAT: 1, -107, -1, -1, 0, 0, 65534, 1, 72, 49, 0
2410
2411+EEMUMTSINTERRAT: 2, -1, -1, 0, 0, 65534, 2, 119, 15, 32768, 149
2412
2413+EEMUMTSINTERRAT: 3, -1, 0, 0, -2, 3, 121, 23, 0, 0, 0
2414
2415+EEMGINFO: 3, 1
2416
2417OK
2418
2419
2420// GSM
2421AT+EEMGINFO?
2422+EEMGINFOBASIC: 2
2423
2424// mcc, mnc_len, mnc, lac, ci, nom, nco,
2425// bsic, C1, C2, TA, TxPwr,
2426// RxSig, RxSigFull, RxSigSub, RxQualFull, RxQualSub,
2427// ARFCB_tch, hopping_chnl, chnl_type, TS, PacketIdle, rac, arfcn,
2428// bs_pa_mfrms, C31, C32, t3212, t3312, pbcch_support, EDGE_support,
2429// ncc_permitted, rl_timeout, ho_count, ho_succ, chnl_access_count, chnl_access_succ_count,
2430// gsmBand,channelMode
2431+EEMGINFOSVC: 1120, 2, 0, 32784, 24741, 2, 0,
243263, 36, 146, 1, 7,
243346, 42, 42, 7, 0,
243453, 0, 8, 0, 1, 6, 53,
24352, 0, 146, 42, 54, 0, 1,
24361, 32, 0, 0, 0, 0,
24370, 0
2438
2439// PS_attached, attach_type, service_type, tx_power, c_value,
2440// ul_ts, dl_ts, ul_cs, dl_cs, ul_modulation, dl_modulation,
2441// gmsk_cv_bep, 8psk_cv_bep, gmsk_mean_bep, 8psk_mean_bep, EDGE_bep_period, single_gmm_rej_cause
2442// pdp_active_num, mac_mode, network_control, network_mode, EDGE_slq_measurement_mode, edge_status
2443+EEMGINFOPS: 1, 255, 0, 0, 0,
24440, 0, 268435501, 1, 0, 0,
24454, 0, 96, 0, 0, 0,
24460, 0, 0, 65535, 0, 13350
2447
2448+EEMGINFO: 0, 0
2449
2450OK
2451
2452*/
2453static int req_cell_info_get(int *cme_err)
2454{
2455 ATResponse *response = NULL;
2456 int tmp_int;
2457 int buff_size = 0;
2458 // AT+EEMOPT=1 in the first.
2459 int err = at_send_command("AT+EEMOPT=1", &response);
2460 if (err < 0 || response->success == 0){
2461 *cme_err = at_get_cme_error(response);
2462 goto exit;
2463 }
2464
2465 // Reset buffer in the first.
2466 memset(&cell_info, 0xFF, sizeof(mbtK_cell_pack_info_t));
2467 cell_info.running = true;
2468 cell_info.cell_num = 0;
2469
2470 err = at_send_command_singleline("AT+EEMGINFO?", "+EEMGINFO:", &response);
2471 if (err < 0 || response->success == 0 || !response->p_intermediates){
2472 *cme_err = at_get_cme_error(response);
2473 goto exit;
2474 }
2475
2476 // Now, cell infomation has get from URC message.
2477
2478 char *line = response->p_intermediates->line;
2479 err = at_tok_start(&line);
2480 if (err < 0)
2481 {
2482 goto exit;
2483 }
2484 err = at_tok_nextint(&line, &tmp_int);
2485 if (err < 0)
2486 {
2487 goto exit;
2488 }
2489 err = at_tok_nextint(&line, &tmp_int);
2490 if (err < 0)
2491 {
2492 goto exit;
2493 }
2494
2495 cell_info.type = (uint8)tmp_int;
2496 cell_info.running = false;
2497
2498#if 0
2499 while(lines_ptr)
2500 {
2501 // LTE
2502 if(strStartsWith(line, "+EEMLTESVC:")) // LTE Server Cell
2503 {
2504
2505 }
b.liue0ab2442024-02-06 18:53:28 +08002506 else if(strStartsWith(line, "+EEMLTEINTER:")) // LTE
liubin281ac462023-07-19 14:22:54 +08002507 {
2508
2509 }
b.liue0ab2442024-02-06 18:53:28 +08002510 else if(strStartsWith(line, "+EEMLTEINTRA:")) // LTE
liubin281ac462023-07-19 14:22:54 +08002511 {
2512
2513 }
b.liue0ab2442024-02-06 18:53:28 +08002514 else if(strStartsWith(line, "+EEMLTEINTERRAT:")) // LTE
liubin281ac462023-07-19 14:22:54 +08002515 {
2516
2517 }
2518 else if(strStartsWith(line, "+EEMGINFO:")) // <state>: 0: ME in Idle mode 1: ME in Dedicated mode 2: ME in PS PTM mode 3: invalid state
2519 // <nw_type>: 0: GSM 1: UMTS 2: LTE
2520 {
2521
2522 }
2523 // WCDMA
2524 else if(strStartsWith(line, "+EEMUMTSSVC:")) // WCDMA Server Cell
2525 {
2526
2527 }
b.liue0ab2442024-02-06 18:53:28 +08002528 else if(strStartsWith(line, "+EEMUMTSINTRA:")) // WCDMA
liubin281ac462023-07-19 14:22:54 +08002529 {
2530
2531 }
b.liue0ab2442024-02-06 18:53:28 +08002532 else if(strStartsWith(line, "+EEMUMTSINTERRAT:")) // WCDMA
liubin281ac462023-07-19 14:22:54 +08002533 {
2534
2535 }
2536 // GSM
2537 else if(strStartsWith(line, "+EEMGINFOBASIC:")) // Basic information in GSM
2538 // 0: ME in Idle mode 1: ME in Dedicated mode 2: ME in PS PTM mode
2539 {
2540
2541 }
2542 else if(strStartsWith(line, "+EEMGINFOSVC:")) // GSM Server Cell
2543 {
2544
2545 }
b.liue0ab2442024-02-06 18:53:28 +08002546 else if(strStartsWith(line, "+EEMGINFOPS:")) // PS
liubin281ac462023-07-19 14:22:54 +08002547 {
2548
2549 }
2550
2551
2552 lines_ptr = lines_ptr->p_next;
2553 }
2554#endif
2555
2556exit:
2557 at_response_free(response);
2558 return buff_size;
2559}
2560
2561static int req_cell_info_set(const char *cmgl, char *reg, int len, int *cme_err)
2562{
2563 printf("req_cmgl_set(2)-----------------start\n");
2564 printf("cmgl:%s\n", cmgl);
2565 ATResponse *response = NULL;
2566 char cmd[30] = {0};
2567 char data[218] = {0};
2568 int err = 0;
2569
2570 memcpy(data, cmgl, len);
2571
2572 sprintf(cmd, "at*cell=%s", data);
2573 printf("cmd:%s\n", cmd);
2574
2575 if(strlen(cmd) > 0)
2576 {
2577 err = at_send_command_multiline(cmd, "", &response);
2578 if (err < 0 || response->success == 0 || !response->p_intermediates){
2579 *cme_err = at_get_cme_error(response);
2580 // printf("at_send_command_multiline() is err-----------------\n");
2581 goto exit;
2582 }
2583
2584 ATLine* lines_ptr = response->p_intermediates;
2585 char *line = NULL;
2586 int reg_len = 0;
2587 bool flag = false;
2588 while(lines_ptr)
2589 {
2590 line = lines_ptr->line;
2591 if(line ==NULL)
2592 {
2593 printf("line is null----------------------\n");
2594 }
2595 printf("-----line:%s\n", line);
2596
2597 lines_ptr = lines_ptr->p_next;
2598 }
2599 }
2600 err = 0;
2601 memcpy(reg, "req_cell_info_set succss", strlen("req_cell_info_set succss"));
2602exit:
2603 at_response_free(response);
2604 printf("req_cell_info_set()-----------------end\n");
2605 return err;
2606}
2607
2608
2609
2610/*
2611AT+CSQ
2612+CSQ: 31,99
2613
2614OK
2615
2616AT+CESQ
2617+CESQ: 60,99,255,255,20,61
2618
2619OK
2620
2621AT+COPS?
2622+COPS: 0,2,"46001",7
2623
2624OK
2625
2626*/
2627static int req_net_signal_get(mbtk_signal_info_t *signal, int *cme_err)
2628{
2629 ATResponse *response = NULL;
2630 int tmp_int;
2631 char *tmp_ptr = NULL;
2632 // AT+EEMOPT=1 in the first.
2633 int err = at_send_command_singleline("AT+CSQ", "+CSQ:", &response);
2634 if (err < 0 || response->success == 0 || !response->p_intermediates){
2635 if(cme_err != NULL)
2636 *cme_err = at_get_cme_error(response);
2637 err = -1;
2638 goto exit;
2639 }
2640
2641 char *line = response->p_intermediates->line;
2642 err = at_tok_start(&line);
2643 if (err < 0)
2644 {
2645 goto exit;
2646 }
2647 err = at_tok_nextint(&line, &tmp_int);
2648 if (err < 0)
2649 {
2650 goto exit;
2651 }
2652 signal->rssi = (uint8)tmp_int;
2653 at_response_free(response);
2654
2655 err = at_send_command_singleline("AT+CESQ", "+CESQ:", &response);
2656 if (err < 0 || response->success == 0 || !response->p_intermediates){
2657 if(cme_err != NULL)
2658 *cme_err = at_get_cme_error(response);
2659 err = -1;
2660 goto exit;
2661 }
2662
2663 line = response->p_intermediates->line;
2664 err = at_tok_start(&line);
2665 if (err < 0)
2666 {
2667 goto exit;
2668 }
2669 err = at_tok_nextint(&line, &tmp_int);
2670 if (err < 0)
2671 {
2672 goto exit;
2673 }
2674 signal->rxlev = (uint8)tmp_int;
2675
2676 err = at_tok_nextint(&line, &tmp_int);
2677 if (err < 0)
2678 {
2679 goto exit;
2680 }
2681 signal->ber = (uint8)tmp_int;
2682
2683 err = at_tok_nextint(&line, &tmp_int);
2684 if (err < 0)
2685 {
2686 goto exit;
2687 }
2688 signal->rscp = (uint8)tmp_int;
2689
2690 err = at_tok_nextint(&line, &tmp_int);
2691 if (err < 0)
2692 {
2693 goto exit;
2694 }
2695 signal->ecno = (uint8)tmp_int;
2696
2697 err = at_tok_nextint(&line, &tmp_int);
2698 if (err < 0)
2699 {
2700 goto exit;
2701 }
2702 signal->rsrq = (uint8)tmp_int;
2703
2704 err = at_tok_nextint(&line, &tmp_int);
2705 if (err < 0)
2706 {
2707 goto exit;
2708 }
2709 signal->rsrp = (uint8)tmp_int;
2710
2711 at_response_free(response);
2712 err = at_send_command_singleline("AT+COPS?", "+COPS:", &response);
2713 if (err < 0 || response->success == 0 || !response->p_intermediates){
2714 if(cme_err != NULL)
2715 *cme_err = at_get_cme_error(response);
2716 err = -1;
2717 goto exit;
2718 }
2719 line = response->p_intermediates->line;
2720 err = at_tok_start(&line);
2721 if (err < 0)
2722 {
2723 goto exit;
2724 }
2725 err = at_tok_nextint(&line, &tmp_int);
2726 if (err < 0)
2727 {
2728 goto exit;
2729 }
2730 if(!at_tok_hasmore(&line)) {
2731 goto exit;
2732 }
2733 err = at_tok_nextint(&line, &tmp_int);
2734 if (err < 0)
2735 {
2736 goto exit;
2737 }
2738 err = at_tok_nextstr(&line, &tmp_ptr);
2739 if (err < 0)
2740 {
2741 goto exit;
2742 }
2743 err = at_tok_nextint(&line, &tmp_int);
2744 if (err < 0)
2745 {
2746 goto exit;
2747 }
2748 signal->type = (uint8)tmp_int;
2749 net_info.net_type = signal->type;
2750
2751exit:
2752 at_response_free(response);
2753 return err;
2754}
2755
2756/*
2757AT+CREG=3
2758OK
2759
2760AT+CREG?
2761+CREG: 3,1,"8330","06447340",7
2762
2763OK
2764
2765AT+CREG?
2766+CREG: 3,0
2767
2768OK
2769
2770AT+CEREG?
2771+CEREG: 3,1,"8330","06447340",7
2772
2773OK
2774
2775
2776AT+CIREG?
2777+CIREG: 2,1,15
2778
2779OK
2780
2781AT+CIREG?
2782+CIREG: 0
2783
2784OK
2785
2786
2787*/
2788static int req_net_reg_get(mbtk_net_reg_info_t *reg, int *cme_err)
2789{
2790 ATResponse *response = NULL;
2791 int tmp_int;
2792 char *tmp_str = NULL;
2793 int err = at_send_command("AT+CREG=3", &response);
2794 if (err < 0 || response->success == 0){
2795 *cme_err = at_get_cme_error(response);
2796 goto exit;
2797 }
2798 at_response_free(response);
2799
2800 err = at_send_command_multiline("AT+CREG?", "+CREG:", &response);
2801 if (err < 0 || response->success == 0 || !response->p_intermediates){
2802 *cme_err = at_get_cme_error(response);
2803 goto exit;
2804 }
2805
2806 char *line = response->p_intermediates->line;
2807 err = at_tok_start(&line);
2808 if (err < 0)
2809 {
2810 goto exit;
2811 }
2812 err = at_tok_nextint(&line, &tmp_int); // n
2813 if (err < 0)
2814 {
2815 goto exit;
2816 }
2817 err = at_tok_nextint(&line, &tmp_int);// stat
2818 if (err < 0)
2819 {
2820 goto exit;
2821 }
2822 reg->call_state = (uint8)tmp_int;
2823
2824 if(at_tok_hasmore(&line)) {
2825 err = at_tok_nextstr(&line, &tmp_str); // lac
2826 if (err < 0)
2827 {
2828 goto exit;
2829 }
2830 reg->lac = strtol(tmp_str, NULL, 16);
2831
2832 err = at_tok_nextstr(&line, &tmp_str); // ci
2833 if (err < 0)
2834 {
2835 goto exit;
2836 }
2837 reg->ci = strtol(tmp_str, NULL, 16);
2838
2839 err = at_tok_nextint(&line, &tmp_int);// AcT
2840 if (err < 0)
2841 {
2842 goto exit;
2843 }
2844 reg->type = (uint8)tmp_int;
2845 }
2846 at_response_free(response);
2847
2848 err = at_send_command_multiline("AT+CEREG?", "+CEREG:", &response);
2849 if (err < 0 || response->success == 0 || !response->p_intermediates){
2850 *cme_err = at_get_cme_error(response);
2851 goto exit;
2852 }
2853
2854 line = response->p_intermediates->line;
2855 err = at_tok_start(&line);
2856 if (err < 0)
2857 {
2858 goto exit;
2859 }
2860 err = at_tok_nextint(&line, &tmp_int); // n
2861 if (err < 0)
2862 {
2863 goto exit;
2864 }
2865 err = at_tok_nextint(&line, &tmp_int);// stat
2866 if (err < 0)
2867 {
2868 goto exit;
2869 }
2870 reg->data_state = (uint8)tmp_int;
2871
2872 if(reg->lac == 0 && at_tok_hasmore(&line)) {
2873 err = at_tok_nextstr(&line, &tmp_str); // lac
2874 if (err < 0)
2875 {
2876 goto exit;
2877 }
2878 reg->lac = strtol(tmp_str, NULL, 16);
2879
2880 err = at_tok_nextstr(&line, &tmp_str); // ci
2881 if (err < 0)
2882 {
2883 goto exit;
2884 }
2885 reg->ci = strtol(tmp_str, NULL, 16);
2886
2887 err = at_tok_nextint(&line, &tmp_int);// AcT
2888 if (err < 0)
2889 {
2890 goto exit;
2891 }
2892 reg->type = (uint8)tmp_int;
2893 }
2894 at_response_free(response);
2895
2896 err = at_send_command_multiline("AT+CIREG?", "+CIREG:", &response);
2897 if (err < 0 || response->success == 0 || !response->p_intermediates){
2898 reg->ims_state = (uint8)0;
2899 err = 0;
2900 goto exit;
2901 }
2902 line = response->p_intermediates->line;
2903 err = at_tok_start(&line);
2904 if (err < 0)
2905 {
2906 goto exit;
2907 }
2908 err = at_tok_nextint(&line, &tmp_int); // n/stat
2909 if (err < 0)
2910 {
2911 goto exit;
2912 }
2913 if(at_tok_hasmore(&line)) {
2914 err = at_tok_nextint(&line, &tmp_int);// stat
2915 if (err < 0)
2916 {
2917 goto exit;
2918 }
2919 reg->ims_state = (uint8)tmp_int;
2920 } else {
2921 reg->ims_state = (uint8)tmp_int;
2922 }
2923
2924exit:
2925 at_response_free(response);
2926 return err;
2927}
2928
r.xiao06db9a12024-04-14 18:51:15 -07002929
2930static int net_ims_set(uint8 reg, int *cme_err)
2931{
2932 ATResponse *response = NULL;
2933 char cmd[30] = {0};
2934 int err = -1;
2935
2936 sprintf(cmd, "AT+CIREG=%d", reg);
2937 err = at_send_command(cmd, &response);
2938 LOG("cmd : %s", cmd);
2939
2940 if (err < 0 || response->success == 0){
2941 *cme_err = at_get_cme_error(response);
2942 goto exit;
2943 }
2944
2945exit:
2946 at_response_free(response);
2947 return err;
2948}
2949
2950
2951static int net_ims_get(int *reg, int *cme_err)
2952{
2953 ATResponse *response = NULL;
2954 int tmp_int, tmp_reg;
2955 int err;
2956 char *tmp_str = NULL;
2957
2958 err = at_send_command_multiline("AT+CIREG?", "+CIREG:", &response);
2959 if (err < 0 || response->success == 0 || !response->p_intermediates){
2960 tmp_reg = 0;
2961 err = 0;
2962 goto exit;
2963 }
2964 char *line = response->p_intermediates->line;
2965 err = at_tok_start(&line);
2966 if (err < 0)
2967 {
2968 goto exit;
2969 }
2970 err = at_tok_nextint(&line, &tmp_int); // n/stat
2971 if (err < 0)
2972 {
2973 goto exit;
2974 }
2975 if(at_tok_hasmore(&line)) {
2976 err = at_tok_nextint(&line, &tmp_int);// stat
2977 if (err < 0)
2978 {
2979 goto exit;
2980 }
2981 tmp_reg = tmp_int;
2982 } else {
2983 tmp_reg = tmp_int;
2984 }
2985
2986 LOG("net_ims_get reg : %u", tmp_reg);
2987
2988exit:
2989 at_response_free(response);
2990 *reg = tmp_reg;
2991 return err;
2992}
2993
2994
liubin281ac462023-07-19 14:22:54 +08002995/*
2996AT+CGDCONT?
2997+CGDCONT: 1,"IPV4V6","cmnet.MNC000.MCC460.GPRS","10.131.67.146 254.128.0.0.0.0.0.0.0.1.0.2.200.2.158.0",0,0,,,,
2998
2999+CGDCONT: 8,"IPV4V6","IMS","254.128.0.0.0.0.0.0.0.1.0.2.200.2.160.160",0,0,0,2,1,1
3000
3001OK
3002
3003
3004*/
wangyouqianged88c722023-11-22 16:33:43 +08003005#ifdef MBTK_AF_SUPPORT
3006mbtk_ip_type_enum default_iptype = MBTK_IP_TYPE_IPV4V6;
3007#endif
3008
liubin281ac462023-07-19 14:22:54 +08003009static int req_apn_get(void *data, int *data_len, int *cme_err)
3010{
3011 ATResponse *response = NULL;
3012 int err = at_send_command_multiline("AT+CGDCONT?", "+CGDCONT:", &response);
3013
3014 if (err < 0 || response->success == 0 || !response->p_intermediates){
3015 *cme_err = at_get_cme_error(response);
3016 goto exit;
3017 }
3018
3019 ATLine* lines_ptr = response->p_intermediates;
3020 char *line = NULL;
3021 int tmp_int;
3022 char *tmp_str = NULL;
3023 /*
3024 <apn_num[1]><cid[1]><ip_type[1]><apn_len[2]><apn><user_len[2]><user><pass_len[2]><pass><auth_len[2]><auth>...
3025 <cid[1]><ip_type[1]><apn_len[2]><apn><user_len[2]><user><pass_len[2]><pass><auth_len[2]><auth>
3026 */
3027 uint8* apn_num = (uint8*)data;
3028 uint8* data_ptr = (uint8*)(data + sizeof(uint8)); // Jump apn_num[1]
3029 mbtk_apn_info_t apn;
3030 while(lines_ptr)
3031 {
3032 line = lines_ptr->line;
3033 err = at_tok_start(&line);
3034 if (err < 0)
3035 {
3036 goto exit;
3037 }
3038
3039 err = at_tok_nextint(&line, &tmp_int); // cid
3040 if (err < 0)
3041 {
3042 goto exit;
3043 }
3044 // Only get CID 1-7
3045 if(tmp_int >= MBTK_APN_CID_MIN && tmp_int <= MBTK_APN_CID_MAX) {
3046 memset(&apn, 0x0, sizeof(mbtk_apn_info_t));
3047 apn.cid = tmp_int;
3048 *data_ptr++ = (uint8)tmp_int; // cid
3049
3050 err = at_tok_nextstr(&line, &tmp_str);// ip type
3051 if (err < 0)
3052 {
3053 goto exit;
3054 }
3055 if(!strcasecmp(tmp_str, "IP")) {
3056 *data_ptr++ = (uint8)MBTK_IP_TYPE_IP;
3057 apn.ip_type = MBTK_IP_TYPE_IP;
3058 } else if(!strcasecmp(tmp_str, "IPV6")) {
3059 *data_ptr++ = (uint8)MBTK_IP_TYPE_IPV6;
3060 apn.ip_type = MBTK_IP_TYPE_IPV6;
3061 } else if(!strcasecmp(tmp_str, "IPV4V6")) {
3062 *data_ptr++ = (uint8)MBTK_IP_TYPE_IPV4V6;
3063 apn.ip_type = MBTK_IP_TYPE_IPV4V6;
3064 } else {
3065 *data_ptr++ = (uint8)MBTK_IP_TYPE_PPP;
3066 apn.ip_type = MBTK_IP_TYPE_PPP;
3067 }
3068
wangyouqianged88c722023-11-22 16:33:43 +08003069#ifdef MBTK_AF_SUPPORT
3070 if(apn.cid == 1)
3071 {
3072 default_iptype = apn.ip_type;
3073 }
3074#endif
liubin281ac462023-07-19 14:22:54 +08003075 err = at_tok_nextstr(&line, &tmp_str); // apn
3076 if (err < 0)
3077 {
3078 goto exit;
3079 }
3080 if(str_empty(tmp_str)) {
3081 uint16_2_byte((uint16)0, data_ptr, false);
3082 data_ptr += sizeof(uint16);
3083 } else {
3084 uint16_2_byte((uint16)strlen(tmp_str), data_ptr, false);
3085 data_ptr += sizeof(uint16);
3086 memcpy(data_ptr, tmp_str, strlen(tmp_str));
3087 data_ptr += strlen(tmp_str);
3088 memcpy(apn.apn, tmp_str, strlen(tmp_str));
3089 }
3090
3091 if(apn_user_pass_set_by_cid(apn.cid, &apn)) {
3092 // user
3093 uint16_2_byte((uint16)0, data_ptr, false);
3094 data_ptr += sizeof(uint16);
3095
3096 // pass
3097 uint16_2_byte((uint16)0, data_ptr, false);
3098 data_ptr += sizeof(uint16);
3099
3100 // auth
3101 uint16_2_byte((uint16)0, data_ptr, false);
3102 data_ptr += sizeof(uint16);
3103 } else {
3104 // user
3105 if(str_empty(apn.user)) {
3106 uint16_2_byte((uint16)0, data_ptr, false);
3107 data_ptr += sizeof(uint16);
3108 } else {
3109 uint16_2_byte((uint16)strlen(apn.user), data_ptr, false);
3110 data_ptr += sizeof(uint16);
3111 memcpy(data_ptr, apn.user, strlen(apn.user));
3112 data_ptr += strlen(apn.user);
3113 }
3114
3115 // pass
3116 if(str_empty(apn.pass)) {
3117 uint16_2_byte((uint16)0, data_ptr, false);
3118 data_ptr += sizeof(uint16);
3119 } else {
3120 uint16_2_byte((uint16)strlen(apn.pass), data_ptr, false);
3121 data_ptr += sizeof(uint16);
3122 memcpy(data_ptr, apn.pass, strlen(apn.pass));
3123 data_ptr += strlen(apn.pass);
3124 }
3125
3126 // auth
3127 if(str_empty(apn.auth)) {
3128 uint16_2_byte((uint16)0, data_ptr, false);
3129 data_ptr += sizeof(uint16);
3130 } else {
3131 uint16_2_byte((uint16)strlen(apn.auth), data_ptr, false);
3132 data_ptr += sizeof(uint16);
3133 memcpy(data_ptr, apn.auth, strlen(apn.auth));
3134 data_ptr += strlen(apn.auth);
3135 }
3136 }
3137
3138 (*apn_num)++;
3139 }
3140
3141 lines_ptr = lines_ptr->p_next;
3142 }
3143
3144 *data_len = data_ptr - (uint8*)data;
3145
3146 goto exit;
3147exit:
3148 at_response_free(response);
3149 return err;
3150}
3151
3152#if 0
3153/*
3154LTE APN
3155AT+CFUN=4
3156AT*CGDFLT=1,IP,"private.vpdn",1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1
3157AT*CGDFAUTH=1,2,"noc@njcc.vpdn.js","123456"
3158AT+CFUN=1
3159AT+CEREG?
3160AT+CGDCONT?
3161
31622/3G APN
3163AT+CGREG?
3164AT+CGDCONT=6,IP,"private.vpdn"
3165AT*AUTHREQ=6,2,"noc@njcc.vpdn.js","123456"
3166AT+CGDATA="",6
3167AT+CGDCONT?
3168*/
3169static int req_apn_set_username(mbtk_apn_info_t *apn, int *cme_err)
3170{
3171 ATResponse *response = NULL;
3172 char cmd[400] = {0};
3173 int index = 0;
3174 int err = 0;
3175
3176 err = at_send_command_singleline("AT+COPS?", "+COPS:", &response);
3177 if (err < 0 || response->success == 0 || !response->p_intermediates){
3178 if(cme_err != NULL)
3179 *cme_err = at_get_cme_error(response);
3180 err = -1;
3181 goto apn_set;
3182 }
3183
3184 int tmp_int = 0;
3185 int state=0;
3186 char cmd_buf[64];
3187 char *line = response->p_intermediates->line;
3188 err = at_tok_start(&line);
3189 if (err < 0)
3190 {
3191 goto apn_set;
3192 }
3193 err = at_tok_nextint(&line, &tmp_int);
3194 if (err < 0)
3195 {
3196 goto apn_set;
3197 }
3198 err = at_tok_nextint(&line, &tmp_int);
3199 if (err < 0)
3200 {
3201 goto apn_set;
3202 }
3203 err = at_tok_nextstr(&line, &cmd_buf);
3204 if (err < 0)
3205 {
3206 goto apn_set;
3207 }
3208 err = at_tok_nextint(&line, &tmp_int);
3209 if (err < 0)
3210 {
3211 goto apn_set;
3212 }
3213 else
3214 state = tmp_int;
3215
3216apn_set:
3217 at_response_free(response);
3218 *cme_err = MBTK_INFO_ERR_CME_NON;
3219 //if(state == 7 && apn->cid == 1) //LTE && cid = 1
3220 if(0) //LTE && cid = 1
3221 {
3222 err = at_send_command("AT+CFUN=4", &response);
3223 if (err < 0 || response->success == 0){
3224 *cme_err = at_get_cme_error(response);
3225 goto exit;
3226 }
3227 at_response_free(response);
3228
3229 memset(cmd, 0, 400);
3230 index = 0;
3231 index += sprintf(cmd, "AT*CGDFLT=%d,", 1);
3232 switch(apn->ip_type) {
3233 case MBTK_IP_TYPE_IP: {
3234 index += sprintf(cmd + index,"\"IP\",");
3235 break;
3236 }
3237 case MBTK_IP_TYPE_IPV6: {
3238 index += sprintf(cmd + index,"\"IPV6\",");
3239 break;
3240 }
3241 case MBTK_IP_TYPE_IPV4V6: {
3242 index += sprintf(cmd + index,"\"IPV4V6\",");
3243 break;
3244 }
3245 default: {
3246 index += sprintf(cmd + index,"\"PPP\",");
3247 break;
3248 }
3249 }
3250
3251 index += sprintf(cmd + index,"\"%s\",1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1",apn->apn);
3252 err = at_send_command(cmd, &response);
3253 if (err < 0 || response->success == 0){
3254 *cme_err = at_get_cme_error(response);
3255 goto exit;
3256 }
3257 at_response_free(response);
3258
3259 memset(cmd, 0, 400);
3260 int cmd_auth=0;
3261 if(strstr(apn->auth,"NONE"))
3262 cmd_auth = 0;
3263 else if(strstr(apn->auth,"PAP"))
3264 cmd_auth = 1;
3265 else if(strstr(apn->auth,"CHAP"))
3266 cmd_auth = 2;
3267 else if(strstr(apn->auth,"PAP AND CHAP"))
3268 cmd_auth = 3;
3269 else
3270 goto exit;
3271
3272 sprintf(cmd,"AT*CGDFAUTH=1,%d,%s,%s",cmd_auth,apn->user,apn->pass);
3273
3274 err = at_send_command(cmd, &response);
3275 if (err < 0 || response->success == 0){
3276 *cme_err = at_get_cme_error(response);
3277 goto exit;
3278 }
3279 }
3280 else //2/3G
3281 {
3282 memset(cmd,0,400);
3283 index = 0;
3284 index += sprintf(cmd, "AT+CGDCONT=%d,", apn->cid);
3285 switch(apn->ip_type) {
3286 case MBTK_IP_TYPE_IP: {
3287 index += sprintf(cmd + index,"\"IP\",");
3288 break;
3289 }
3290 case MBTK_IP_TYPE_IPV6: {
3291 index += sprintf(cmd + index,"\"IPV6\",");
3292 break;
3293 }
3294 case MBTK_IP_TYPE_IPV4V6: {
3295 index += sprintf(cmd + index,"\"IPV4V6\",");
3296 break;
3297 }
3298 default: {
3299 index += sprintf(cmd + index,"\"PPP\",");
3300 break;
3301 }
3302 }
3303 index += sprintf(cmd + index, "\"%s\"", apn->apn);
3304
3305 err = at_send_command(cmd, &response);
3306 if (err < 0 || response->success == 0){
3307 *cme_err = at_get_cme_error(response);
3308 goto exit;
3309 }
3310 at_response_free(response);
3311
3312 memset(cmd,0,400);
3313 int cmd_auth=0;
3314 if(strstr(apn->auth,"NONE"))
3315 cmd_auth = 0;
3316 else if(strstr(apn->auth,"PAP"))
3317 cmd_auth = 1;
3318 else if(strstr(apn->auth,"CHAP"))
3319 cmd_auth = 2;
3320 else if(strstr(apn->auth,"PAP AND CHAP"))
3321 cmd_auth = 3;
3322 else
3323 goto exit;
3324
3325 sprintf(cmd, "AT*AUTHREQ=%d,%d,%s,%s",apn->cid,cmd_auth,apn->user,apn->pass);
3326 err = at_send_command(cmd, &response);
3327 if (err < 0 || response->success == 0){
3328 *cme_err = at_get_cme_error(response);
3329 goto exit;
3330 }
3331 }
3332
3333exit:
3334 at_response_free(response);
3335 return err;
3336}
3337#endif
3338
3339/*
3340AT+CGDCONT=1,"IPV4V6","cmnet"
3341OK
3342
3343AT*CGDFLT=1,"IPv4v6","reliance.grevpdn.zj",,,,,,,,,,,,,,,,,,1
3344OK
3345
3346*/
3347static int req_apn_set(mbtk_apn_info_t *apn, int *cme_err)
3348{
3349 ATResponse *response = NULL;
3350 char cmd[400] = {0};
3351 int index = 0;
3352 int err = 0;
3353
3354 index += sprintf(cmd, "AT+CGDCONT=%d,", apn->cid);
3355 switch(apn->ip_type) {
3356 case MBTK_IP_TYPE_IP: {
3357 index += sprintf(cmd + index,"\"IP\",");
3358 break;
3359 }
3360 case MBTK_IP_TYPE_IPV6: {
3361 index += sprintf(cmd + index,"\"IPV6\",");
3362 break;
3363 }
3364 case MBTK_IP_TYPE_IPV4V6: {
3365 index += sprintf(cmd + index,"\"IPV4V6\",");
3366 break;
3367 }
3368 default: {
3369 index += sprintf(cmd + index,"\"PPP\",");
3370 break;
3371 }
3372 }
3373 if(strlen(apn->apn) > 0) {
3374 index += sprintf(cmd + index,"\"%s\"", apn->apn);
3375 } else {
3376 LOGE("No set APN.");
3377 err = -1;
3378 goto exit;
3379 }
3380
3381 err = at_send_command(cmd, &response);
3382 if (err < 0 || response->success == 0){
3383 if(cme_err) {
3384 *cme_err = at_get_cme_error(response);
3385 }
3386 goto exit;
3387 }
3388
3389 if(!str_empty(apn->user) || !str_empty(apn->pass)) {
3390 at_response_free(response);
3391
3392 memset(cmd,0,400);
3393 int cmd_auth=0;
3394 if(strstr(apn->auth,"NONE"))
3395 cmd_auth = 0;
3396 else if(strstr(apn->auth,"PAP"))
3397 cmd_auth = 1;
3398 else if(strstr(apn->auth,"CHAP"))
3399 cmd_auth = 2;
3400#if 0
3401 else if(strstr(apn->auth,"PAP AND CHAP"))
3402 cmd_auth = 3;
3403#endif
3404 else
3405 goto exit;
3406
3407 sprintf(cmd, "AT*AUTHREQ=%d,%d,%s,%s",apn->cid,cmd_auth,apn->user,apn->pass);
3408 err = at_send_command(cmd, &response);
3409 if (err < 0 || response->success == 0){
3410 *cme_err = at_get_cme_error(response);
3411 goto exit;
3412 }
3413 }
3414
3415exit:
3416 at_response_free(response);
3417 return err;
3418}
3419
3420int wait_cgact_complete(int timeout)
3421{
3422 int count = timeout * 10; // timeout * 1000 / 100
3423 int i = 0;
3424
3425 while(cgact_wait.waitting && i < count) {
3426 i++;
3427 usleep(100000); // 100ms
3428 }
3429
3430 if(i == count) { // Timeout
3431 return -1;
3432 } else {
3433 return 0;
3434 }
3435}
3436
3437/*
3438AT+CGDATA="",6
3439CONNECT
3440
3441OK
3442
3443AT+CFUN=1
3444
3445OK
3446
3447*/
3448static int req_data_call_user_start(int cid, int *cme_err)
3449{
3450 ATResponse *response = NULL;
3451 char cmd[400] = {0};
3452 int index = 0;
3453 int err = 0;
3454
3455 err = at_send_command_singleline("AT+COPS?", "+COPS:", &response);
3456 if (err < 0 || response->success == 0 || !response->p_intermediates){
3457 if(cme_err != NULL)
3458 *cme_err = at_get_cme_error(response);
3459 err = -1;
3460 goto exit;
3461 }
3462
3463 int tmp_int;
3464 char cmd_buf[64];
3465 char *line = response->p_intermediates->line;
3466 err = at_tok_start(&line);
3467 if (err < 0)
3468 {
3469 goto exit;
3470 }
3471 err = at_tok_nextint(&line, &tmp_int);
3472 if (err < 0)
3473 {
3474 goto exit;
3475 }
3476 err = at_tok_nextint(&line, &tmp_int);
3477 if (err < 0)
3478 {
3479 goto exit;
3480 }
3481 err = at_tok_nextstr(&line, &cmd_buf);
3482 if (err < 0)
3483 {
3484 goto exit;
3485 }
3486 err = at_tok_nextint(&line, &tmp_int);
3487 if (err < 0)
3488 {
3489 goto exit;
3490 }
3491 at_response_free(response);
3492
3493 if(tmp_int == 7 && cid == 1) //LTE && cid = 1
3494 {
3495 ATResponse *response = NULL;
3496 char cmd[400] = {0};
3497 int err = 0;
3498
3499 err = at_send_command("AT+CFUN=1", &response);
3500 if (err < 0 || response->success == 0){
3501 if(cme_err) {
3502 *cme_err = at_get_cme_error(response);
3503 }
3504 goto exit;
3505 }
3506 }
3507 else
3508 {
3509 ATResponse *response = NULL;
3510 char cmd[400] = {0};
3511 int err = 0;
3512 sprintf(cmd, "AT+CGDATA=\"\",%d", cid);
3513 err = at_send_command(cmd, &response);
3514 if (err < 0 || response->success == 0){
3515 if(cme_err) {
3516 *cme_err = at_get_cme_error(response);
3517 }
3518 goto exit;
3519 }
3520 }
3521
3522exit:
3523 at_response_free(response);
3524 return err;
3525}
3526
3527/*
3528AT+CGACT?
3529+CGACT: 1,1
3530+CGACT: 8,1
3531OK
3532
3533AT+CGACT=1,<cid>
3534OK
3535
3536*/
3537static int req_data_call_start(int cid, int *cme_err)
3538{
3539 ATResponse *response = NULL;
3540 char cmd[400] = {0};
3541 int err = 0;
3542#if 0
3543 err = at_send_command_multiline("AT+CGACT?", "+CGACT:", &response);
3544 if (err < 0 || response->success == 0 || !response->p_intermediates){
3545 *cme_err = at_get_cme_error(response);
3546 goto exit;
3547 }
3548 ATLine* lines_ptr = response->p_intermediates;
3549 char *line = NULL;
3550 int tmp_int;
3551 while(lines_ptr)
3552 {
3553 line = lines_ptr->line;
3554 err = at_tok_start(&line);
3555 if (err < 0)
3556 {
3557 goto exit;
3558 }
3559
3560 err = at_tok_nextint(&line, &tmp_int); // cid
3561 if (err < 0)
3562 {
3563 goto exit;
3564 }
3565 if(tmp_int == cid) { // Found cid
3566 err = at_tok_nextint(&line, &tmp_int); // cid
3567 if (err < 0)
3568 {
3569 goto exit;
3570 }
3571 if(tmp_int == 1) { // This cid has active.
3572 goto net_config;
3573 } else {
3574 goto cid_active;
3575 }
3576 break;
3577 }
3578
3579 lines_ptr = lines_ptr->p_next;
3580 }
3581
3582 if(lines_ptr == NULL) { // No found this cid.
3583 LOGE("No found cid : %d", cid);
3584 goto exit;
3585 }
3586 at_response_free(response);
3587
3588 // Start active cid.
3589cid_active:
3590#endif
3591
3592 sprintf(cmd, "AT+CGACT=1,%d", cid);
3593 err = at_send_command(cmd, &response);
3594 if (err < 0 || response->success == 0){
3595 if(cme_err) {
3596 *cme_err = at_get_cme_error(response);
3597 }
3598 goto exit;
3599 }
3600
3601exit:
3602 at_response_free(response);
3603 return err;
3604}
3605
3606/*
3607AT+CGACT=0,<cid>
3608OK
3609
3610*/
3611static int req_data_call_stop(int cid, int *cme_err)
3612{
3613 ATResponse *response = NULL;
3614 char cmd[400] = {0};
3615 int err = 0;
3616#if 0
3617 err = at_send_command_multiline("AT+CGACT?", "+CGACT:", &response);
3618 if (err < 0 || response->success == 0 || !response->p_intermediates){
3619 *cme_err = at_get_cme_error(response);
3620 goto exit;
3621 }
3622 ATLine* lines_ptr = response->p_intermediates;
3623 char *line = NULL;
3624 int tmp_int;
3625 while(lines_ptr)
3626 {
3627 line = lines_ptr->line;
3628 err = at_tok_start(&line);
3629 if (err < 0)
3630 {
3631 goto exit;
3632 }
3633
3634 err = at_tok_nextint(&line, &tmp_int); // cid
3635 if (err < 0)
3636 {
3637 goto exit;
3638 }
3639 if(tmp_int == cid) { // Found cid
3640 err = at_tok_nextint(&line, &tmp_int); // cid
3641 if (err < 0)
3642 {
3643 goto exit;
3644 }
3645 if(tmp_int == 1) { // This cid has active.
3646 goto net_config;
3647 } else {
3648 goto cid_active;
3649 }
3650 break;
3651 }
3652
3653 lines_ptr = lines_ptr->p_next;
3654 }
3655
3656 if(lines_ptr == NULL) { // No found this cid.
3657 LOGE("No found cid : %d", cid);
3658 goto exit;
3659 }
3660 at_response_free(response);
3661
3662 // Start active cid.
3663cid_active:
3664#endif
3665
3666 sprintf(cmd, "AT+CGACT=0,%d", cid);
3667 err = at_send_command(cmd, &response);
3668 if (err < 0 || response->success == 0){
3669 *cme_err = at_get_cme_error(response);
3670 goto exit;
3671 }
3672
3673exit:
3674 at_response_free(response);
3675 return err;
3676}
3677
3678/*
3679IPv4 : 10.255.74.26
3680IPv6 : 254.128.0.0.0.0.0.0.0.1.0.2.144.5.212.239
3681*/
3682static bool is_ipv4(const char *ip)
3683{
3684 const char *ptr = ip;
3685 int count = 0;
3686 while(*ptr) {
3687 if(*ptr == '.')
3688 count++;
3689 ptr++;
3690 }
3691
3692 if(count == 3) {
3693 return true;
3694 } else {
3695 return false;
3696 }
3697}
3698
3699/*
3700AT+CGCONTRDP=1
3701+CGCONTRDP: 1,7,"cmnet-2.MNC000.MCC460.GPRS","10.255.74.26","","223.87.253.100","223.87.253.253","","",0,0
3702+CGCONTRDP: 1,7,"cmnet-2.MNC000.MCC460.GPRS","254.128.0.0.0.0.0.0.0.1.0.2.144.5.212.239","","36.9.128.98.32.0.0.2.0.0.0.0.0.0.0.1","36.9.128.98.32.0.0.2.0.0.0.0.0.0.0.2","","",0,0
3703
3704OK
3705
3706*/
3707static int req_data_call_state_get(int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6, int *cme_err)
3708{
3709 ATResponse *response = NULL;
3710 char cmd[50] = {0};
3711 int err = 0;
3712
3713 sprintf(cmd, "AT+CGCONTRDP=%d", cid);
3714
3715 err = at_send_command_multiline(cmd, "+CGCONTRDP:", &response);
3716 if (err < 0 || response->success == 0 || !response->p_intermediates){
3717 *cme_err = at_get_cme_error(response);
3718 goto exit;
3719 }
3720 ATLine* lines_ptr = response->p_intermediates;
3721 char *line = NULL;
3722 int tmp_int;
3723 char *tmp_ptr = NULL;
3724 while(lines_ptr)
3725 {
3726 line = lines_ptr->line;
3727 err = at_tok_start(&line);
3728 if (err < 0)
3729 {
3730 goto exit;
3731 }
3732
3733 err = at_tok_nextint(&line, &tmp_int); // cid
3734 if (err < 0)
3735 {
3736 goto exit;
3737 }
3738 err = at_tok_nextint(&line, &tmp_int); // bearer_id
3739 if (err < 0)
3740 {
3741 goto exit;
3742 }
3743 err = at_tok_nextstr(&line, &tmp_ptr); // APN
3744 if (err < 0)
3745 {
3746 goto exit;
3747 }
3748
3749 err = at_tok_nextstr(&line, &tmp_ptr); // IP
3750 if (err < 0 || str_empty(tmp_ptr))
3751 {
3752 goto exit;
3753 }
3754 if(is_ipv4(tmp_ptr)) {
3755 if(inet_pton(AF_INET, tmp_ptr, &(ipv4->IPAddr)) < 0) {
3756 LOGE("inet_pton() fail.");
3757 err = -1;
3758 goto exit;
3759 }
3760
3761 ipv4->valid = true;
3762 //log_hex("IPv4", &(ipv4->IPAddr), sizeof(struct in_addr));
3763 } else {
3764 if(str_2_ipv6(tmp_ptr, &(ipv6->IPV6Addr))) {
3765 LOGE("str_2_ipv6() fail.");
3766 err = -1;
3767 goto exit;
3768 }
3769
3770 ipv6->valid = true;
3771 //log_hex("IPv6", &(ipv6->IPV6Addr), 16);
3772 }
3773
3774 err = at_tok_nextstr(&line, &tmp_ptr); // Gateway
3775 if (err < 0)
3776 {
3777 goto exit;
3778 }
3779 if(!str_empty(tmp_ptr)) { // No found gateway
3780 if(is_ipv4(tmp_ptr)) {
3781 if(inet_pton(AF_INET, tmp_ptr, &(ipv4->GateWay)) < 0) {
3782 LOGE("inet_pton() fail.");
3783 err = -1;
3784 goto exit;
3785 }
3786
3787 //log_hex("IPv4", &(ipv4->GateWay), sizeof(struct in_addr));
3788 } else {
3789 if(str_2_ipv6(tmp_ptr, &(ipv6->GateWay))) {
3790 LOGE("str_2_ipv6() fail.");
3791 err = -1;
3792 goto exit;
3793 }
3794
3795 //log_hex("IPv6", &(ipv6->GateWay), 16);
3796 }
3797 }
3798
3799 err = at_tok_nextstr(&line, &tmp_ptr); // prim_DNS
3800 if (err < 0)
3801 {
3802 goto exit;
3803 }
3804 if(!str_empty(tmp_ptr)) { // No found Primary DNS
3805 if(is_ipv4(tmp_ptr)) {
3806 if(inet_pton(AF_INET, tmp_ptr, &(ipv4->PrimaryDNS)) < 0) {
3807 LOGE("inet_pton() fail.");
3808 err = -1;
3809 goto exit;
3810 }
3811
3812 //log_hex("IPv4", &(ipv4->PrimaryDNS), sizeof(struct in_addr));
3813 } else {
3814 if(str_2_ipv6(tmp_ptr, &(ipv6->PrimaryDNS))) {
3815 LOGE("str_2_ipv6() fail.");
3816 err = -1;
3817 goto exit;
3818 }
3819
3820 //log_hex("IPv6", &(ipv6->PrimaryDNS), 16);
3821 }
3822 }
3823
3824 err = at_tok_nextstr(&line, &tmp_ptr); // sec_DNS
3825 if (err < 0)
3826 {
3827 goto exit;
3828 }
3829 if(!str_empty(tmp_ptr)) { // No found Secondary DNS
3830 if(is_ipv4(tmp_ptr)) {
3831 if(inet_pton(AF_INET, tmp_ptr, &(ipv4->SecondaryDNS)) < 0) {
3832 LOGE("inet_pton() fail.");
3833 err = -1;
3834 goto exit;
3835 }
3836
3837 //log_hex("IPv4", &(ipv4->SecondaryDNS), sizeof(struct in_addr));
3838 } else {
3839 if(str_2_ipv6(tmp_ptr, &(ipv6->SecondaryDNS))) {
3840 LOGE("str_2_ipv6() fail.");
3841 err = -1;
3842 goto exit;
3843 }
3844
3845 //log_hex("IPv6", &(ipv6->SecondaryDNS), 16);
3846 }
3847 }
3848
3849 lines_ptr = lines_ptr->p_next;
3850 }
3851
3852exit:
3853 at_response_free(response);
3854 return err;
3855}
3856
3857/*
3858AT+CGCONTRDP
3859+CGCONTRDP: 1,5,"cmnet.MNC000.MCC460.GPRS","10.156.238.86","","223.87.253.100","223.87.253.253","","",0,0
3860+CGCONTRDP: 1,5,"cmnet.MNC000.MCC460.GPRS","254.128.0.0.0.0.0.0.0.1.0.1.181.5.77.221","","36.9.128.98.32.0.0.2.0.0.0.0.0.0.0.1","36.9.128.98.32.0.0.2.0,0,0
3861+CGCONTRDP: 8,6,"IMS.MNC000.MCC460.GPRS","254.128.0.0.0.0.0.0.0.1.0.1.181.5.79.116","","","","36.9.128.98.80.2.0.87.0.0.0.0.0.3.31.1","36.9.128.98.80.2,1,0
3862OK
3863
3864*/
3865static int apn_state_get(list_node_t **apn_list)
3866{
3867 ATResponse *response = NULL;
3868 int err = 0;
3869 *apn_list = list_create(NULL);
3870 if(*apn_list == NULL)
3871 {
3872 LOG("list_create() fail.");
3873 return -1;
3874 }
3875
3876 err = at_send_command_multiline("AT+CGCONTRDP", "+CGCONTRDP:", &response);
3877 if (err < 0 || response->success == 0 || !response->p_intermediates){
3878 goto exit;
3879 }
3880 ATLine* lines_ptr = response->p_intermediates;
3881 char *line = NULL;
3882 int tmp_int;
3883 char *tmp_ptr = NULL;
3884 int cid_current = 0;
3885 info_apn_ip_t *apn = NULL;
3886 while(lines_ptr)
3887 {
3888 line = lines_ptr->line;
3889 err = at_tok_start(&line);
3890 if (err < 0)
3891 {
3892 goto exit;
3893 }
3894
3895 err = at_tok_nextint(&line, &tmp_int); // cid
3896 if (err < 0)
3897 {
3898 goto exit;
3899 }
3900
3901 if(tmp_int != 1 && tmp_int != 8) { // Not process cid 1 and 8.
3902 if(cid_current != tmp_int) { // New cid.
3903 apn = (info_apn_ip_t*)malloc(sizeof(info_apn_ip_t));
3904 if(apn == NULL) {
3905 goto exit;
3906 }
3907 memset(apn, 0, sizeof(info_apn_ip_t));
3908 apn->cid = tmp_int;
3909 cid_current = tmp_int;
3910
3911 list_add(*apn_list, apn);
3912 }
3913 err = at_tok_nextint(&line, &tmp_int); // bearer_id
3914 if (err < 0)
3915 {
3916 goto exit;
3917 }
3918 err = at_tok_nextstr(&line, &tmp_ptr); // APN
3919 if (err < 0)
3920 {
3921 goto exit;
3922 }
3923
3924 err = at_tok_nextstr(&line, &tmp_ptr); // IP
3925 if (err < 0 || str_empty(tmp_ptr))
3926 {
3927 goto exit;
3928 }
3929 if(is_ipv4(tmp_ptr)) {
3930 apn->ipv4_valid = true;
3931 memcpy(apn->ipv4, tmp_ptr, strlen(tmp_ptr));
3932 } else {
3933 apn->ipv6_valid = true;
3934 uint8 tmp_ipv6[16];
3935 if(str_2_ipv6(tmp_ptr, tmp_ipv6)) {
3936 LOGE("str_2_ipv6() fail.");
3937 err = -1;
3938 goto exit;
3939 }
3940
3941 if(inet_ntop(AF_INET6, tmp_ipv6, apn->ipv6, 50) == NULL) {
3942 err = -1;
3943 LOGE("inet_ntop ipv6 ip fail.");
3944 goto exit;
3945 }
3946 }
3947 }
3948
3949 lines_ptr = lines_ptr->p_next;
3950 }
3951
3952exit:
3953 at_response_free(response);
3954 return err;
3955}
3956
3957mbtk_info_err_enum call_pack_req_process(sock_client_info_t* cli_info, mbtk_info_pack_t* pack);
3958mbtk_info_err_enum sms_pack_req_process(sock_client_info_t* cli_info, mbtk_info_pack_t* pack);
3959mbtk_info_err_enum pb_pack_req_process(sock_client_info_t* cli_info, mbtk_info_pack_t* pack);
r.xiaoec113d12024-01-12 02:13:28 -08003960
liubin281ac462023-07-19 14:22:54 +08003961//mbtk wyq for data_call_ex add start
3962void data_call_bootconn_save(int cid, int bootconn);
3963//mbtk wyq for data_call_ex add end
3964
3965//void net_list_free(void *data);
3966// Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
3967// Otherwise, do not call pack_error_send().
3968static mbtk_info_err_enum pack_req_process(sock_client_info_t* cli_info, mbtk_info_pack_t* pack)
3969{
3970 if(pack->info_id > MBTK_INFO_ID_CALL_BEGIN && pack->info_id < MBTK_INFO_ID_CALL_END) {
3971 return call_pack_req_process(cli_info, pack);
3972 } else if(pack->info_id > MBTK_INFO_ID_SMS_BEGIN && pack->info_id < MBTK_INFO_ID_SMS_END) {
3973 return sms_pack_req_process(cli_info, pack);
3974 } else if(pack->info_id > MBTK_INFO_ID_PB_BEGIN && pack->info_id < MBTK_INFO_ID_PB_END) {
3975 return pb_pack_req_process(cli_info, pack);
3976 } else {
3977 mbtk_info_err_enum err = MBTK_INFO_ERR_SUCCESS;
3978 int cme_err = MBTK_INFO_ERR_CME_NON;
3979 switch(pack->info_id)
3980 {
3981 case MBTK_INFO_ID_DEV_IMEI_REQ: // <string> IMEI
3982 {
3983 if(pack->data_len == 0 || pack->data == NULL) // Get IMEI
3984 {
3985 char imei[20] = {0};
3986 if(req_imei_get(imei, &cme_err) || strlen(imei) == 0 || cme_err != MBTK_INFO_ERR_CME_NON)
3987 {
3988 if(cme_err != MBTK_INFO_ERR_CME_NON) {
3989 err = MBTK_INFO_ERR_CME + cme_err;
3990 } else {
3991 err = MBTK_INFO_ERR_UNKNOWN;
3992 }
3993 LOG("Get IMEI fail.");
3994 }
3995 else
3996 {
3997 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_IMEI_RSP, imei, strlen(imei));
3998 }
3999 }
4000 else // Set IMEI(Unsupport).
4001 {
4002 err = MBTK_INFO_ERR_UNSUPPORTED;
4003 LOG("Unsupport set IMEI.");
4004 }
4005 break;
4006 }
4007 case MBTK_INFO_ID_DEV_SN_REQ: // <string> SN
4008 {
4009 if(pack->data_len == 0 || pack->data == NULL) // Get SN
4010 {
4011 char sn[20] = {0};
4012 if(req_sn_get(sn, &cme_err) || strlen(sn) == 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4013 {
4014 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4015 err = MBTK_INFO_ERR_CME + cme_err;
4016 } else {
4017 err = MBTK_INFO_ERR_UNKNOWN;
4018 }
4019 LOG("Get SN fail.");
4020 }
4021 else
4022 {
4023 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_SN_RSP, sn, strlen(sn));
4024 }
4025 }
4026 else // Set SN(Unsupport).
4027 {
4028 err = MBTK_INFO_ERR_UNSUPPORTED;
4029 LOG("Unsupport set SN.");
4030 }
4031 break;
4032 }
4033 case MBTK_INFO_ID_DEV_MEID_REQ: // <string> MEID (Only for CDMA)
4034 {
4035 if(pack->data_len == 0 || pack->data == NULL) // Get MEID
4036 {
4037 err = MBTK_INFO_ERR_UNSUPPORTED;
4038 LOG("Support only for CDMA.");
4039 }
4040 else // Set MEID(Unsupport).
4041 {
4042 err = MBTK_INFO_ERR_UNSUPPORTED;
4043 LOG("Unsupport set MEID.");
4044 }
4045 break;
4046 }
4047 case MBTK_INFO_ID_DEV_VERSION_REQ: // <string> VERSION
4048 {
4049 if(pack->data_len == 0 || pack->data == NULL) // Get VERSION
4050 {
4051 char version[50] = {0};
4052 if(req_version_get(version, &cme_err) || strlen(version) == 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4053 {
4054 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4055 err = MBTK_INFO_ERR_CME + cme_err;
4056 } else {
4057 err = MBTK_INFO_ERR_UNKNOWN;
4058 }
4059 LOG("Get Version fail.");
4060 }
4061 else
4062 {
4063 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_VERSION_RSP, version, strlen(version));
4064 }
4065 }
4066 else // Set VERSION(Unsupport).
4067 {
4068 err = MBTK_INFO_ERR_UNSUPPORTED;
4069 LOG("Unsupport set VERSION.");
4070 }
4071 break;
4072 }
4073 case MBTK_INFO_ID_DEV_MODEL_REQ: //MODEL
4074 {
4075 if(pack->data_len == 0 || pack->data == NULL) // Get MODEL
4076 {
4077 char model[50] = {0};
4078 if(req_model_get(model, &cme_err) || strlen(model) == 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4079 {
4080 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4081 err = MBTK_INFO_ERR_CME + cme_err;
4082 } else {
4083 err = MBTK_INFO_ERR_UNKNOWN;
4084 }
4085 LOG("Get model fail.");
4086 }
4087 else
4088 {
4089 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_VERSION_RSP, model, strlen(model));
4090 }
4091 }
4092 else // Set model(Unsupport).
4093 {
4094 err = MBTK_INFO_ERR_UNSUPPORTED;
4095 LOG("Unsupport set model.");
4096 }
4097 break;
4098 }
4099 case MBTK_INFO_ID_DEV_MODEM_REQ: //MODEM
4100 {
4101 if(pack->data_len == 0 || pack->data == NULL) // Get MODEM
4102 {
4103 int modem = -1;
4104 if(req_modem_get(&modem, &cme_err) || modem < 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4105 {
4106 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4107 err = MBTK_INFO_ERR_CME + cme_err;
4108 } else {
4109 err = MBTK_INFO_ERR_UNKNOWN;
4110 }
4111 LOG("Get modem fail.");
4112 }
4113 else
4114 {
4115 uint8 modem_type = (uint8)modem;
4116 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_MODEM_RSP, &modem_type, sizeof(uint8));
4117 }
4118 }
4119 else // Set modem
4120 {
4121 mbtk_modem_info_t *modem = (mbtk_modem_info_t *)pack->data;
4122 if(pack->data_len != sizeof(mbtk_modem_info_t))
4123 {
4124 err = MBTK_INFO_ERR_REQ_PARAMETER;
4125 LOG("Set modem error.");
4126 break;
4127 }
4128 if(req_modem_set(modem, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4129 {
4130 LOG("Set modem fail.");
4131 err = MBTK_INFO_ERR_FORMAT;
4132 } else {
4133 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_MODEM_RSP, NULL, 0);
4134 }
4135 }
4136 break;
4137 }
4138 case MBTK_INFO_ID_DEV_TIME_REQ: // <uint8><string> YYYY-MM-DD-HH:MM:SS
4139 {
4140 if(pack->data_len == 0 || pack->data == NULL) // Get Time
4141 {
4142 int type = -1;
4143 if(req_time_get(&type, &cme_err) || type < 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4144 {
4145 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4146 err = MBTK_INFO_ERR_CME + cme_err;
4147 } else {
4148 err = MBTK_INFO_ERR_UNKNOWN;
4149 }
4150 LOG("Get Time fail.");
4151 }
4152 else
4153 {
4154 uint8 time_type = (uint8)type;
4155 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_TIME_RSP, &time_type, sizeof(uint8));
4156 }
4157 }
4158 else // Set Time
4159 {
4160 if(pack->data_len == sizeof(uint8)) {
4161 if(req_time_set(*(pack->data), NULL, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4162 {
4163 LOG("Set Time fail.");
4164 err = MBTK_INFO_ERR_FORMAT;
4165 } else {
4166 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_TIME_RSP, NULL, 0);
4167 }
4168 } else {
4169 char time_ptr[100] = {0};
4170 memcpy(time_ptr, pack->data + sizeof(uint8), pack->data_len - sizeof(uint8));
4171 if(req_time_set(*(pack->data), time_ptr, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4172 {
4173 LOG("Set Time fail.");
4174 err = MBTK_INFO_ERR_FORMAT;
4175 } else {
4176 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_TIME_RSP, NULL, 0);
4177 }
4178 }
4179 }
4180 break;
4181 }
4182 case MBTK_INFO_ID_NET_TIME_REQ: // <string> YYYY-MM-DD-HH:MM:SS
4183 {
4184 if(pack->data_len == 0 || pack->data == NULL) // Get Time
4185 {
4186 char time[100];
4187 if(req_net_time_get(time, &cme_err) || strlen(time) == 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4188 {
4189 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4190 err = MBTK_INFO_ERR_CME + cme_err;
4191 } else {
4192 err = MBTK_INFO_ERR_UNKNOWN;
4193 }
4194 LOG("Get Time fail.");
4195 }
4196 else
4197 {
4198 char time_ser[100]={0};
4199 memcpy(time_ser,time,strlen(time));
4200 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_TIME_RSP, time_ser, strlen(time_ser));
4201 }
4202 }
4203 else // Set Time
4204 {
4205 err = MBTK_INFO_ERR_UNSUPPORTED;
4206 LOG("Unsupport set TIME.");
4207 }
4208 break;
4209 }
4210 case MBTK_INFO_ID_DEV_VOLTE_REQ: // <uint8> 0:Close 1:Open
4211 {
4212 if(pack->data_len == 0 || pack->data == NULL) // Get VoLTE state.
4213 {
4214 int state;
4215 if(req_volte_get(&state, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4216 {
4217 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4218 err = MBTK_INFO_ERR_CME + cme_err;
4219 } else {
4220 err = MBTK_INFO_ERR_UNKNOWN;
4221 }
4222 LOG("Get VoLTE state fail.");
4223 }
4224 else
4225 {
4226 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_VOLTE_RSP, &state, sizeof(uint8));
4227 }
4228 }
4229 else // Set VoLTE state.
4230 {
4231 uint8 on = *(pack->data);
4232 if(pack->data_len != sizeof(uint8) || (on != 0 && on != 1))
4233 {
4234 err = MBTK_INFO_ERR_REQ_PARAMETER;
4235 LOG("Set VOLTE parameter error.");
4236 break;
4237 }
4238
4239 if(req_volte_set(on, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4240 {
4241 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4242 err = MBTK_INFO_ERR_CME + cme_err;
4243 } else {
4244 err = MBTK_INFO_ERR_UNKNOWN;
4245 }
4246 LOG("Set VoLTE state fail.");
4247 }
4248 else
4249 {
4250 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_VOLTE_RSP, NULL, 0);
4251
4252 // Restart is required to take effect.
4253 LOG("Will reboot system...");
4254 }
4255 }
4256 break;
4257 }
4258 case MBTK_INFO_ID_DEV_TEMP_REQ: // <string> Temperature
4259 {
4260 if(pack->data_len == sizeof(uint8) && pack->data) {
4261 int temp;
4262 if(req_temp_get(*(pack->data), &temp, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4263 {
4264 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4265 err = MBTK_INFO_ERR_CME + cme_err;
4266 } else {
4267 err = MBTK_INFO_ERR_UNKNOWN;
4268 }
4269 LOG("Get temperature fail.");
4270 }
4271 else
4272 {
4273 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_DEV_TEMP_RSP, &temp, sizeof(uint8));
4274 }
4275 } else {
4276 err = MBTK_INFO_ERR_FORMAT;
4277 LOG("Unsupport get Temperature.");
4278 }
4279 break;
4280 }
4281 case MBTK_INFO_ID_SIM_PLMN_REQ: // plmn
4282 {
4283 if(pack->data_len == 0 || pack->data == NULL) // plmn
4284 {
4285 mbtk_plmn_info plmn;
4286 if(req_plmn_get(&plmn, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4287 {
4288 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4289 err = MBTK_INFO_ERR_CME + cme_err;
4290 } else {
4291 err = MBTK_INFO_ERR_UNKNOWN;
4292 }
4293 LOG("Get PLMN fail.");
4294 }
4295 else
4296 {
4297 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_PLMN_RSP, &plmn, sizeof(mbtk_plmn_info));
4298 }
4299 }
4300 else // Set
4301 {
4302 err = MBTK_INFO_ERR_UNSUPPORTED;
4303 LOG("Set sim state fail.");
4304 }
4305 break;
4306 }
4307 case MBTK_INFO_ID_SIM_STATE_REQ: // mbtk_sim_state_enum
4308 {
4309 if(pack->data_len == 0 || pack->data == NULL) // Get sim state.
4310 {
4311 uint8 sim_state = (uint8)getSIMStatus();
4312 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_STATE_RSP, &sim_state, sizeof(uint8));
4313 }
4314 else // Set
4315 {
4316 err = MBTK_INFO_ERR_UNSUPPORTED;
4317 LOG("Set sim state fail.");
4318 }
4319 break;
4320 }
4321 case MBTK_INFO_ID_SIM_STYPE_REQ: // mbtk_sim_card_type_enum
4322 {
4323 if(pack->data_len == 0 || pack->data == NULL) // Get sim card type
4324 {
4325 uint8 sim_card_type;
4326 if(req_sim_card_type_get(&sim_card_type, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4327 {
4328 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4329 err = MBTK_INFO_ERR_CME + cme_err;
4330 } else {
4331 err = MBTK_INFO_ERR_UNKNOWN;
4332 }
4333 LOG("Get IMSI fail.");
4334 }
4335 else
4336 {
4337 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_STYPE_RSP, &sim_card_type, sizeof(uint8));
4338 }
4339 }
4340 else // Set
4341 {
4342 err = MBTK_INFO_ERR_UNSUPPORTED;
4343 LOG("Set sim state fail.");
4344 }
4345 break;
4346 }
4347 case MBTK_INFO_ID_SIM_PINPUK_TIMES_REQ: // mbtk_pin_puk_last_times
4348 {
4349 if(pack->data_len == 0 || pack->data == NULL) // Get sim card type
4350 {
4351 mbtk_pin_puk_last_times pin_puk_last_times;
4352 if(req_pin_puk_last_times_get(&pin_puk_last_times, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4353 {
4354 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4355 err = MBTK_INFO_ERR_CME + cme_err;
4356 } else {
4357 err = MBTK_INFO_ERR_UNKNOWN;
4358 }
4359 LOG("Get IMSI fail.");
4360 }
4361 else
4362 {
4363 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_PINPUK_TIMES_RSP, &pin_puk_last_times, sizeof(mbtk_pin_puk_last_times));
4364 }
4365 }
4366 else // Set
4367 {
4368 err = MBTK_INFO_ERR_UNSUPPORTED;
4369 LOG("Set sim state fail.");
4370 }
4371 break;
4372 }
4373 case MBTK_INFO_ID_SIM_ENABLE_PIN_REQ: // <string> PIN
4374 {
4375 if(pack->data_len == 0 || pack->data == NULL) // Enable PIN
4376 {
4377 err = MBTK_INFO_ERR_UNSUPPORTED;
4378 LOG("Unsupport GET PIN.");
4379 }
4380 else // Enable PIN
4381 {
4382 mbtk_enable_pin_info *pin = NULL;
4383 pin = (mbtk_enable_pin_info *)pack->data;
4384 if(req_pin_enable(pin, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4385 {
4386 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4387 err = MBTK_INFO_ERR_CME + cme_err;
4388 } else {
4389 err = MBTK_INFO_ERR_UNKNOWN;
4390 }
4391 LOG("Get IMSI fail.");
4392 }
4393 else
4394 {
4395 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_ENABLE_PIN_RSP, NULL, 0);
4396 }
4397 }
4398 break;
4399 }
4400 case MBTK_INFO_ID_SIM_PIN_REQ: // <string> PIN
4401 {
4402 if(pack->data_len == 0 || pack->data == NULL) // PIN
4403 {
4404 err = MBTK_INFO_ERR_UNSUPPORTED;
4405 LOG("Unsupport GET PIN.");
4406 }
4407 else // Set PIN
4408 {
4409 char pin[16] = {0};
4410 memcpy(pin, pack->data, pack->data_len);
4411 if(req_pin_verify(pin, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4412 {
4413 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4414 err = MBTK_INFO_ERR_CME + cme_err;
4415 } else {
4416 err = MBTK_INFO_ERR_UNKNOWN;
4417 }
4418 LOG("Set PIN fail.");
4419 }
4420 else
4421 {
4422 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_PIN_RSP, NULL, 0);
4423 }
4424 }
4425 break;
4426 }
4427 case MBTK_INFO_ID_SIM_PUK_REQ: // <string> PUK
4428 {
4429 if(pack->data_len == 0 || pack->data == NULL)
4430 {
4431 err = MBTK_INFO_ERR_UNSUPPORTED;
4432 LOG("Unsupport.");
4433 }
4434 else // change PIN
4435 {
4436 mbtk_unlock_pin_info *pin_info = NULL;
4437 pin_info = (mbtk_unlock_pin_info *)pack->data;
4438 if(req_puk_unlock_pin(pin_info, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4439 {
4440 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4441 err = MBTK_INFO_ERR_CME + cme_err;
4442 } else {
4443 err = MBTK_INFO_ERR_UNKNOWN;
4444 }
4445 LOG("Get IMSI fail.");
4446 }
4447 else
4448 {
4449 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_CHANGE_PIN_RSP, NULL, 0);
4450 }
4451 }
4452 break;
4453 }
4454 case MBTK_INFO_ID_SIM_CHANGE_PIN_REQ: // <string> <string> old_PIN new_PIN
4455 {
4456 if(pack->data_len == 0 || pack->data == NULL)
4457 {
4458 err = MBTK_INFO_ERR_UNSUPPORTED;
4459 LOG("Unsupport.");
4460 }
4461 else // change PIN
4462 {
4463 mbtk_change_pin_info *pin_info = NULL;
4464 pin_info = (mbtk_change_pin_info *)pack->data;
4465 if(req_pin_change(pin_info, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4466 {
4467 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4468 err = MBTK_INFO_ERR_CME + cme_err;
4469 } else {
4470 err = MBTK_INFO_ERR_UNKNOWN;
4471 }
4472 LOG("Get IMSI fail.");
4473 }
4474 else
4475 {
4476 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_CHANGE_PIN_RSP, NULL, 0);
4477 }
4478 }
4479 break;
4480 }
4481 case MBTK_INFO_ID_SIM_IMSI_REQ: // <string> IMSI
4482 {
4483 if(pack->data_len == 0 || pack->data == NULL) // Get IMSI
4484 {
4485 char imsi[20] = {0};
4486 if(req_imsi_get(imsi, &cme_err) || strlen(imsi) == 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4487 {
4488 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4489 err = MBTK_INFO_ERR_CME + cme_err;
4490 } else {
4491 err = MBTK_INFO_ERR_UNKNOWN;
4492 }
4493 LOG("Get IMSI fail.");
4494 }
4495 else
4496 {
4497 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_IMSI_RSP, imsi, strlen(imsi));
4498 }
4499 }
4500 else // Set IMSI(Unsupport).
4501 {
4502 err = MBTK_INFO_ERR_UNSUPPORTED;
4503 LOG("Unsupport set IMSI.");
4504 }
4505 break;
4506 }
4507 case MBTK_INFO_ID_SIM_ICCID_REQ: // <string> ICCID
4508 {
4509 if(pack->data_len == 0 || pack->data == NULL) // Get ICCID
4510 {
4511 //log_hex("pack", pack, sizeof(mbtk_info_pack_t));
4512 //sleep(1);
4513 char iccid[50] = {0};
4514 if(req_iccid_get(iccid, &cme_err) || strlen(iccid) == 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4515 {
4516 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4517 err = MBTK_INFO_ERR_CME + cme_err;
4518 } else {
4519 err = MBTK_INFO_ERR_UNKNOWN;
4520 }
4521 LOG("Get ICCID fail.");
4522 }
4523 else
4524 {
4525 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_ICCID_RSP, iccid, strlen(iccid));
4526 }
4527 }
4528 else // Set ICCID(Unsupport).
4529 {
4530 err = MBTK_INFO_ERR_UNSUPPORTED;
4531 LOG("Unsupport set ICCID.");
4532 }
4533 break;
4534 }
4535 case MBTK_INFO_ID_SIM_PN_REQ: // <string> Phone Number
4536 {
4537 if(pack->data_len == 0 || pack->data == NULL) // Get Phone Number
4538 {
4539 //log_hex("pack", pack, sizeof(mbtk_info_pack_t));
4540 //sleep(1);
4541 char phone_number[50] = {0};
4542 if(req_phone_number_get(phone_number, &cme_err) || strlen(phone_number) == 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4543 {
4544 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4545 err = MBTK_INFO_ERR_CME + cme_err;
4546 } else {
4547 err = MBTK_INFO_ERR_UNKNOWN;
4548 }
4549 LOG("Get Phone Number fail.");
4550 }
4551 else
4552 {
4553 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_SIM_PN_RSP, phone_number, strlen(phone_number));
4554 }
4555 }
4556 else // Set Phone Number(Unsupport).
4557 {
4558 err = MBTK_INFO_ERR_UNSUPPORTED;
4559 LOG("Unsupport set Phone Number.");
4560 }
4561 break;
4562 }
4563 case MBTK_INFO_ID_NET_SEL_MODE_REQ: // <mbtk_net_info_t> Operator
4564 {
4565 if(pack->data_len == 0 || pack->data == NULL) // Get
4566 {
4567 mbtk_net_info_t info;
4568 memset(&info, 0, sizeof(mbtk_net_info_t));
4569 if(req_net_sel_mode_get(&info, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4570 {
4571 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4572 err = MBTK_INFO_ERR_CME + cme_err;
4573 } else {
4574 err = MBTK_INFO_ERR_UNKNOWN;
4575 }
4576 LOG("Get Net select mode fail.");
4577 }
4578 else
4579 {
4580 LOG("NET : %d, %d, %d, %d", info.net_sel_mode, info.net_type, info.net_state, info.plmn);
4581 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_SEL_MODE_RSP, &info, sizeof(mbtk_net_info_t));
4582 }
4583 }
4584 else // Set
4585 {
4586 //LOG("1 pack-%p,data-%p,data_len-%d", pack, pack->data, pack->data_len);
4587 //log_hex("pack", pack, sizeof(mbtk_info_pack_t));
4588 //log_hex("data", pack->data, pack->data_len);
4589
4590 mbtk_net_info_t* info = (mbtk_net_info_t*)pack->data;//(mbtk_net_info_t*)mbtk_info_pack_data_get(pack, NULL);
4591 if(info == NULL) {
4592 err = MBTK_INFO_ERR_FORMAT;
4593 LOG("Get Net select mode fail.");
4594 } else {
4595 LOG("NET : %d, %d, %d", info->net_sel_mode, info->net_type, info->plmn);
4596 if(req_net_sel_mode_set(info, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON) {
4597 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4598 err = MBTK_INFO_ERR_CME + cme_err;
4599 } else {
4600 err = MBTK_INFO_ERR_UNKNOWN;
4601 }
4602 LOG("Get Net select mode fail.");
4603 } else {
4604 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_SEL_MODE_RSP, NULL, 0);
4605 }
4606 }
4607 }
4608 break;
4609 }
4610 case MBTK_INFO_ID_NET_AVAILABLE_REQ:// sel_mode(uint8)type(uint8)plmn(uint32)...sel_mode(uint8)type(uint8)plmn(uint32)
4611 {
4612 if(pack->data_len == 0 || pack->data == NULL) // Get Available Net.
4613 {
4614 int buffer_size;
4615 uint8 buffer[SOCK_MSG_LEN_MAX];
4616 memset(buffer, 0, SOCK_MSG_LEN_MAX);
4617 if((buffer_size = req_available_net_get(buffer, &cme_err)) <= 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4618 {
4619 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4620 err = MBTK_INFO_ERR_CME + cme_err;
4621 } else {
4622 err = MBTK_INFO_ERR_UNKNOWN;
4623 }
4624 LOG("Get Available Net fail.");
4625 }
4626 else
4627 {
4628 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_AVAILABLE_RSP, buffer, buffer_size);
4629 }
4630 }
4631 else // Set Available Net(Unsupport).
4632 {
4633 err = MBTK_INFO_ERR_UNSUPPORTED;
4634 LOG("Unsupport set available net.");
4635 }
4636 break;
4637 }
4638 case MBTK_INFO_ID_NET_BAND_REQ:
4639 {
4640 if(pack->data_len == 0 || pack->data == NULL)
4641 {
4642 err = MBTK_INFO_ERR_REQ_PARAMETER;
4643 LOG("No data found.");
4644 }
4645 else // Get support/current bands.
4646 {
4647 if(pack->data_len == sizeof(uint8)) {
4648 if(*(pack->data)) { // Get current bands.
4649 mbtk_band_info_t band;
4650 if(req_band_get(&band, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4651 {
4652 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4653 err = MBTK_INFO_ERR_CME + cme_err;
4654 } else {
4655 err = MBTK_INFO_ERR_UNKNOWN;
4656 }
4657 LOG("Get net band fail.");
4658 }
4659 else
4660 {
4661 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_BAND_RSP, &band, sizeof(mbtk_band_info_t));
4662 }
4663 } else { // Get support bands.
4664 band_support_get();
4665 if(band_support.net_pref != 0)
4666 {
4667 err = MBTK_INFO_ERR_UNKNOWN;
4668 LOG("Get support bands fail.");
4669 }
4670 else
4671 {
4672 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_BAND_RSP, &band_support, sizeof(mbtk_band_info_t));
4673 }
4674 }
4675 } else { // Set current bands.
4676 mbtk_band_info_t* band = (mbtk_band_info_t*)pack->data;
4677 if(pack->data_len != sizeof(mbtk_band_info_t))
4678 {
4679 err = MBTK_INFO_ERR_REQ_PARAMETER;
4680 LOG("Set net band error.");
4681 break;
4682 }
4683
4684 if(req_band_set(band, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4685 {
4686 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4687 err = MBTK_INFO_ERR_CME + cme_err;
4688 } else {
4689 err = MBTK_INFO_ERR_UNKNOWN;
4690 }
4691 LOG("Set net band fail.");
4692 }
4693 else
4694 {
4695 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_BAND_RSP, NULL, 0);
4696 }
4697 }
4698 }
4699 break;
4700 }
4701 case MBTK_INFO_ID_NET_CELL_REQ: // mbtk_cell_info_t[]
4702 {
4703 if(pack->data_len == 0 || pack->data == NULL) // Get net cell.
4704 {
4705 if(req_cell_info_get(&cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4706 {
4707 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4708 err = MBTK_INFO_ERR_CME + cme_err;
4709 } else {
4710 err = MBTK_INFO_ERR_UNKNOWN;
4711 }
4712 LOG("Get net cell fail.");
4713 }
4714 else
4715 {
4716 LOG("req_cell_info_get() success,cell number: %d", cell_info.cell_num);
4717 //sleep(1);
4718 // mbtK_cell_pack_info_t
4719 if(cell_info.cell_num > 0 && cell_info.cell_num <= CELL_NUM_MAX && cell_info.type >= 0 && cell_info.type <= 2) {
4720 uint8 *data = (uint8*)malloc(sizeof(uint8) + sizeof(mbtk_cell_info_t) * cell_info.cell_num);
4721 if(data == NULL){
4722 err = MBTK_INFO_ERR_MEMORY;
4723 LOG("Get net cell fail.");
4724 } else {
4725 *data = cell_info.type; // Set network type.
4726 // Copy cell info item.
4727 #if 0
4728 int i = 0;
4729 while(i < cell_info.cell_num) {
4730 memcpy(data + sizeof(uint8) + sizeof(mbtk_cell_info_t) * i,
4731 &(cell_info.cell[i]),
4732 sizeof(mbtk_cell_info_t));
4733 i++;
4734 }
4735 #else
4736 memcpy(data + sizeof(uint8),
4737 &(cell_info.cell),
4738 sizeof(mbtk_cell_info_t) * cell_info.cell_num);
4739 #endif
4740 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_CELL_RSP, data, sizeof(uint8) + sizeof(mbtk_cell_info_t) * cell_info.cell_num);
4741 free(data);
4742 }
4743 } else {
4744 err = MBTK_INFO_ERR_UNKNOWN;
4745 LOG("Get net cell fail.");
4746 }
4747 }
4748 }
4749 else // Lock cell
4750 {
4751 char *mem = (char*)(pack->data);
4752 int len = pack->data_len;
4753 char reg[100] = {0};
4754 printf("mem:%s, len:%d", pack->data, pack->data_len);
4755
4756 if(req_cell_info_set(mem, reg, len, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4757 {
4758 // printf("cpms_set fail\n");
4759 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4760 err = MBTK_INFO_ERR_CME + cme_err;
4761 } else {
4762 err = MBTK_INFO_ERR_UNKNOWN;
4763 }
4764 // LOG("Set req_cell_info_set fail.");
4765 }
4766 else
4767 {
4768
4769 printf("req_cell_info_set success, reg:%s\n", reg);
4770 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_CELL_RSP, reg, strlen(reg));
4771
4772 // Restart is required to take effect.
4773 LOG("Will reboot system...");
4774 }
4775 }
4776 break;
4777 }
4778 case MBTK_INFO_ID_NET_RADIO_REQ: // <uint8> 0:OFF 1:ON
4779 {
4780 if(pack->data_len == 0 || pack->data == NULL) // Get
4781 {
4782 uint8 radio_on = (uint8)isRadioOn();
4783 if(radio_on < 0)
4784 {
4785 err = MBTK_INFO_ERR_UNKNOWN;
4786 LOG("Get radio state fail.");
4787 }
4788 else
4789 {
4790 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_RADIO_RSP, &radio_on, sizeof(uint8));
4791 }
4792 }
4793 else // Set
4794 {
4795 uint8 radio_on = *(pack->data);
4796 if(radio_on != 0 && radio_on != 1)
4797 {
4798 err = MBTK_INFO_ERR_REQ_PARAMETER;
4799 LOG("Set radio state fail.");
4800 }
4801 else
4802 {
4803 setRadioPower(radio_on);
4804 if((radio_on && net_info.radio_state == MBTK_RADIO_STATE_ON)
4805 || (!radio_on && net_info.radio_state == MBTK_RADIO_STATE_OFF)) {
4806 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_RADIO_RSP, NULL, 0);
4807 } else {
4808 err = MBTK_INFO_ERR_UNKNOWN;
4809 LOG("Set radio state fail.");
4810 }
4811 }
4812 }
4813 break;
4814 }
4815 case MBTK_INFO_ID_NET_SIGNAL_REQ: // mbtk_signal_info_t
4816 {
4817 if(pack->data_len == 0 || pack->data == NULL) // Get net signal.
4818 {
4819 mbtk_signal_info_t signal;
4820 memset(&signal, 0, sizeof(mbtk_signal_info_t));
4821 if(req_net_signal_get(&signal, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4822 {
4823 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4824 err = MBTK_INFO_ERR_CME + cme_err;
4825 } else {
4826 err = MBTK_INFO_ERR_UNKNOWN;
4827 }
4828 LOG("Get net signal fail.");
4829 }
4830 else
4831 {
4832 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_SIGNAL_RSP, &signal, sizeof(mbtk_signal_info_t));
4833 }
4834 }
4835 else // Set
4836 {
4837 err = MBTK_INFO_ERR_UNSUPPORTED;
4838 LOG("Set net signal fail.");
4839 }
4840 break;
4841 }
4842 case MBTK_INFO_ID_NET_REG_REQ: // mbtk_net_reg_info_t
4843 {
4844 if(pack->data_len == 0 || pack->data == NULL) // Get net reg.
4845 {
4846 mbtk_net_reg_info_t reg;
4847 memset(&reg, 0, sizeof(mbtk_net_reg_info_t));
4848 if(req_net_reg_get(&reg, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4849 {
4850 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4851 err = MBTK_INFO_ERR_CME + cme_err;
4852 } else {
4853 err = MBTK_INFO_ERR_UNKNOWN;
4854 }
4855 LOG("Get net reg fail.");
4856 }
4857 else
4858 {
4859 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_REG_RSP, &reg, sizeof(mbtk_net_reg_info_t));
4860 }
4861 }
4862 else // Set
4863 {
4864 err = MBTK_INFO_ERR_UNSUPPORTED;
4865 LOG("Set net reg fail.");
4866 }
4867 break;
4868 }
4869 case MBTK_INFO_ID_NET_APN_REQ: // mbtk_apn_info_t
4870 {
4871 if(pack->data_len == 0 || pack->data == NULL) // Get APN
4872 {
4873 uint8 buff[SOCK_MSG_LEN_MAX];
4874 memset(buff, 0, SOCK_MSG_LEN_MAX);
4875 int data_len = 0;
4876 if(req_apn_get(buff, &data_len, &cme_err) || data_len <= 0 || cme_err != MBTK_INFO_ERR_CME_NON)
4877 {
4878 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4879 err = MBTK_INFO_ERR_CME + cme_err;
4880 } else {
4881 err = MBTK_INFO_ERR_UNKNOWN;
4882 }
4883 LOG("Get APN fail.");
4884 }
4885 else
4886 {
4887 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_APN_RSP, buff, data_len);
4888 }
4889 }
4890 else // Set
4891 {
4892 // <cid[1]><ip_type[1]><apn_len[2]><apn><user_len[2]><user><pass_len[2]><pass><auth_len[2]><auth>
4893 const uint8* ptr = pack->data;
4894 mbtk_apn_info_t apn;
4895 int len;
4896 memset(&apn, 0, sizeof(mbtk_apn_info_t));
4897 // cid
4898 apn.cid = *ptr++;
4899
4900 // ip_type
4901 apn.ip_type = (mbtk_ip_type_enum)(*ptr++);
4902
4903 // apn
4904 len = byte_2_uint16(ptr, false);
4905 ptr += sizeof(uint16);
4906 if(len > 0) {
4907 memcpy(apn.apn, ptr, len);
4908 ptr += len;
4909 }
4910
4911 // user
4912 len = byte_2_uint16(ptr, false);
4913 ptr += sizeof(uint16);
4914 if(len > 0) {
4915 memcpy(apn.user, ptr, len);
4916 ptr += len;
4917 }
4918
4919 // pass
4920 len = byte_2_uint16(ptr, false);
4921 ptr += sizeof(uint16);
4922 if(len > 0) {
4923 memcpy(apn.pass, ptr, len);
4924 ptr += len;
4925 }
4926
4927 // auth
4928 len = byte_2_uint16(ptr, false);
4929 ptr += sizeof(uint16);
4930 if(len > 0) {
4931 memcpy(apn.auth, ptr, len);
4932 ptr += len;
4933 }
4934
4935 LOGD("APN : %d, %d, %s, %s, %s, %s", apn.cid, apn.ip_type, str_empty(apn.apn) ? "NULL" : apn.apn,
4936 str_empty(apn.user) ? "NULL" : apn.user, str_empty(apn.pass) ? "NULL" : apn.pass, str_empty(apn.auth) ? "NULL" : apn.auth);
4937 if(req_apn_set(&apn, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
4938 {
4939 if(cme_err != MBTK_INFO_ERR_CME_NON) {
4940 err = MBTK_INFO_ERR_CME + cme_err;
4941 } else {
4942 err = MBTK_INFO_ERR_UNKNOWN;
4943 }
4944 LOG("Set APN fail.");
4945 }
4946 else
4947 {
4948 // Save apn.
wangyouqianged88c722023-11-22 16:33:43 +08004949#ifdef MBTK_AF_SUPPORT
4950 if(apn.cid == 1)
4951 {
4952 default_iptype = apn.ip_type;
4953 }
4954#endif
liubin281ac462023-07-19 14:22:54 +08004955 apn_prop_set(&apn);
4956
4957 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_APN_RSP, NULL, 0);
4958 }
4959 }
4960 break;
4961 }
4962 case MBTK_INFO_ID_NET_DATA_CALL_REQ:
4963 {
4964 if(pack->data_len == 0 || pack->data == NULL)
4965 {
4966 err = MBTK_INFO_ERR_UNSUPPORTED;
4967 }
4968 else
4969 {
4970 /* <call_type[1]><cid[1]><auto_conn_interval[1]><boot_conn[1]><timeout[1]>
4971 call_type : mbtk_data_call_type_enum
4972 cid : 2 - 7
4973 timeout : second
4974 */
4975 mbtk_data_call_type_enum call_type = (mbtk_data_call_type_enum)pack->data[0];
4976 int cid = pack->data[1];
4977 int reconn = 0;
4978
4979 if(cid < MBTK_APN_CID_MIN || cid > MBTK_APN_CID_MAX) {
4980 err = MBTK_INFO_ERR_CID;
4981 break;
4982 }
4983
4984 LOG("cid_active[%d] = %d", cid, cid_active[cid]);
4985 memset(&cgact_wait, 0, sizeof(info_cgact_wait_t));
4986 switch(call_type) {
4987 case MBTK_DATA_CALL_START: {
4988 //mbtk wyq for data_call_ex add start
4989 int auto_conn_interval = pack->data[2];
4990 int boot_conn = pack->data[3];
4991 int timeout = pack->data[4];
4992 data_call_bootconn_save(cid, boot_conn);
b.liufe320632024-01-17 20:38:08 +08004993
liubin281ac462023-07-19 14:22:54 +08004994 if(net_info.net_type != MBTK_RADIO_TECH_E_UTRAN)
4995 {
4996 err = MBTK_INFO_ERR_NET_NO_INIT;
4997 break;
4998 }
b.liufe320632024-01-17 20:38:08 +08004999
liubin281ac462023-07-19 14:22:54 +08005000 if(cid_active[cid] == 1)
5001 {
5002 err = MBTK_INFO_ERR_CID_EXIST;
5003 break;
5004 }
b.liufe320632024-01-17 20:38:08 +08005005
liubin281ac462023-07-19 14:22:54 +08005006 data_call_reconn:
5007 //mbtk wyq for data_call_ex add end
5008 cgact_wait.waitting = true;
5009 cgact_wait.cid = cid;
5010 cgact_wait.act = true;
5011 if(req_data_call_start(cid, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
5012 {
5013 //mbtk wyq for data_call_ex add start
5014 if(reconn < 5 && auto_conn_interval > 0)
5015 {
5016 sleep(auto_conn_interval);
5017 reconn++;
5018 cme_err = MBTK_INFO_ERR_CME_NON;
5019 LOG("data_call restart call.");
5020 goto data_call_reconn;
5021 }
5022 //mbtk wyq for data_call_ex add end
5023 if(cme_err != MBTK_INFO_ERR_CME_NON) {
5024 err = MBTK_INFO_ERR_CME + cme_err;
5025 } else {
5026 err = MBTK_INFO_ERR_UNKNOWN;
5027 }
5028 LOG("%d active fail.", cid);
5029 }
5030 else
5031 {
5032 // Wait for "CONNECT" or "+CGEV:"
5033 if(wait_cgact_complete(timeout)) { // Timeout
5034 err = MBTK_INFO_ERR_TIMEOUT;
5035 break;
5036 }
5037
5038 // Get IP information.
5039 mbtk_ipv4_info_t ipv4;
5040 mbtk_ipv6_info_t ipv6;
5041 memset(&ipv4, 0, sizeof(mbtk_ipv4_info_t));
5042 memset(&ipv6, 0, sizeof(mbtk_ipv6_info_t));
5043 if(req_data_call_state_get(cid, &ipv4, &ipv6, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
5044 {
5045 if(cme_err != MBTK_INFO_ERR_CME_NON) {
5046 err = MBTK_INFO_ERR_CME + cme_err;
5047 } else {
5048 err = MBTK_INFO_ERR_UNKNOWN;
5049 }
5050 LOG("Get %d state fail.", cid);
5051 }
5052 else
5053 {
5054 // Config IPv4 address.
wangyouqianged88c722023-11-22 16:33:43 +08005055#ifdef MBTK_AF_SUPPORT
5056 if(cid == 1)
5057 {
5058 //uint8 pdp_data = cid;
5059 //pack_rsp_send(cli_info->fd , MBTK_INFO_ID_IND_PDP_STATE_CHANGE, &pdp_data, sizeof(uint8));
5060 ipv4.valid = false;
5061 ipv6.valid = false;
5062 if(default_iptype == MBTK_IP_TYPE_IP)
5063 {
5064 ipv4.valid = true;
5065 }
5066 else if(default_iptype == MBTK_IP_TYPE_IPV6)
5067 {
5068 ipv6.valid = true;
5069 }
5070 else
5071 {
5072 ipv4.valid = true;
5073 ipv6.valid = true;
5074 }
5075 }
5076#endif
liubin281ac462023-07-19 14:22:54 +08005077#if 1
5078 if(ipv4.valid) {
5079 char dev[20] = {0};
5080 sprintf(dev, "ccinet%d", cid - 1);
5081
5082 char ip[20] = {0};
5083 char gateway[20] = {0};
5084 char *gateway_ptr = NULL;
5085 char netmask[20] = {0};
5086 char *netmask_ptr = NULL;
5087 if(inet_ntop(AF_INET, &(ipv4.IPAddr), ip, 20) == NULL) {
5088 err = MBTK_INFO_ERR_UNKNOWN;
5089 LOGE("inet_ntop ipv4 ip fail.");
5090 log_hex("IPv4", &(ipv4.IPAddr), 4);
5091 break;
5092 }
5093
5094 if(ipv4.GateWay) {
5095 if(inet_ntop(AF_INET, &(ipv4.GateWay), gateway, 20) == NULL) {
5096 err = MBTK_INFO_ERR_UNKNOWN;
5097 LOGE("inet_ntop ipv4 gateway fail.");
5098 log_hex("IPv4", &(ipv4.IPAddr), 4);
5099 break;
5100 } else {
5101 gateway_ptr = gateway;
5102 }
5103 }
5104
5105 if(ipv4.NetMask) {
5106 if(inet_ntop(AF_INET, &(ipv4.NetMask), netmask, 20) == NULL) {
5107 err = MBTK_INFO_ERR_UNKNOWN;
5108 LOGE("inet_ntop ipv4 netmask fail.");
5109 log_hex("IPv4", &(ipv4.IPAddr), 4);
5110 break;
5111 } else {
5112 netmask_ptr = netmask;
5113 }
5114 }
5115
5116 if(netmask_ptr == NULL) {
5117 netmask_ptr = netmask;
5118 memcpy(netmask_ptr, "255.255.255.0", strlen("255.255.255.0"));
5119 }
5120
5121 if(mbtk_ifc_configure2(dev, ip, 0, gateway_ptr, netmask_ptr)) {
5122 LOGD("Config %s IPv4 %s fail.", dev, ip);
5123 } else {
5124 LOGD("Config %s IPv4 %s success.", dev, ip);
5125 }
5126
5127 }
5128#endif
5129 // Config IPv6 address.
5130 if(ipv6.valid) {
5131 char ip[50] = {0};
5132 char dev[20] = {0};
5133 sprintf(dev, "ccinet%d", cid - 1);
5134
5135 if(inet_ntop(AF_INET6, &(ipv6.IPV6Addr), ip, 50) == NULL) {
5136 err = MBTK_INFO_ERR_UNKNOWN;
5137 LOGE("inet_ntop ipv6 ip fail.");
5138 log_hex("IPv6", &(ipv6.IPV6Addr), 16);
5139 break;
5140 }
5141
5142 if(mbtk_ipv6_config(dev, ip, 64)) {
5143 LOGD("Config %s IPv6 %s fail.", dev, ip);
5144 } else {
5145 LOGD("Config %s IPv6 %s success.", dev, ip);
5146 }
5147 }
5148
5149 cid_active[cid] = 1;
5150 if(cli_info->fd != DATA_CALL_BOOTCONN_FD)
5151 {
5152 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
5153 }
5154 else
5155 {
5156 free(pack->data);
5157 free(cli_info);
5158 LOG("data_call bootconn success.");
5159 }
5160 }
5161 }
5162 break;
5163 }
5164 case MBTK_DATA_CALL_STOP: {
5165 //mbtk wyq for data_call_ex add start
5166 if(cid_active[cid] == 0)
5167 {
5168 err = MBTK_INFO_ERR_CID_NO_EXIST;
5169 break;
5170 }
5171
5172 int timeout = pack->data[2];
5173 //mbtk wyq for data_call_ex add end
b.liuf37bd332024-03-18 13:51:24 +08005174#if (defined(MBTK_AF_SUPPORT) || defined(MBTK_ALL_CID_SUPPORT))
wangyouqianged88c722023-11-22 16:33:43 +08005175 if(cid == 1)
5176 {
5177 char dev[20] = {0};
5178 uint8 pdp_data = cid + 100;
5179 pack_rsp_send(cli_info->fd , MBTK_INFO_ID_IND_PDP_STATE_CHANGE, &pdp_data, sizeof(uint8));
b.liufe320632024-01-17 20:38:08 +08005180
wangyouqianged88c722023-11-22 16:33:43 +08005181 sprintf(dev, "ccinet%d", cid - 1);
5182
5183 // Config network.
5184 if(mbtk_ifc_configure2(dev, NULL, 0, NULL, NULL)) {
5185 LOGD("Config %s IPv4 0 fail.", dev);
5186 } else {
5187 LOGD("Config %s IPv4 0 success.", dev);
5188 }
5189 cid_active[cid] = 0;
5190 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
5191 break;
5192 }
5193#endif
liubin281ac462023-07-19 14:22:54 +08005194 cgact_wait.waitting = true;
5195 cgact_wait.cid = cid;
5196 cgact_wait.act = false;
5197 if(req_data_call_stop(cid, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
5198 {
5199 if(cme_err != MBTK_INFO_ERR_CME_NON) {
5200 err = MBTK_INFO_ERR_CME + cme_err;
5201 } else {
5202 err = MBTK_INFO_ERR_UNKNOWN;
5203 }
5204 LOG("%d deactive fail.", cid);
5205 }
5206 else
5207 {
5208 // Wait for "CONNECT" or "+CGEV:"
5209 if(wait_cgact_complete(timeout)) { // Timeout
5210 err = MBTK_INFO_ERR_TIMEOUT;
5211 break;
5212 }
5213 char dev[20] = {0};
5214 sprintf(dev, "ccinet%d", cid - 1);
5215
5216 // Config network.
5217 if(mbtk_ifc_configure2(dev, NULL, 0, NULL, NULL)) {
5218 LOGD("Config %s IPv4 0 fail.", dev);
5219 } else {
5220 LOGD("Config %s IPv4 0 success.", dev);
5221 }
5222
5223#if 0
5224 if(mbtk_ipv6_config(dev, NULL, 64)) {
5225 LOGD("Config %s IPv6 0 fail.", dev);
5226 } else {
5227 LOGD("Config %s IPv6 0 success.", dev);
5228 }
5229#endif
5230 cid_active[cid] = 0;
5231 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
5232 }
5233 break;
5234 }
5235 case MBTK_DATA_CALL_STATE: {
wangyouqianged88c722023-11-22 16:33:43 +08005236 if(cid_active[cid] == 0)
5237 {
5238 err = MBTK_INFO_ERR_CID_NO_EXIST;
5239 break;
5240 }
liubin281ac462023-07-19 14:22:54 +08005241 mbtk_ipv4_info_t ipv4;
5242 mbtk_ipv6_info_t ipv6;
5243 memset(&ipv4, 0, sizeof(mbtk_ipv4_info_t));
5244 memset(&ipv6, 0, sizeof(mbtk_ipv6_info_t));
5245 if(req_data_call_state_get(cid, &ipv4, &ipv6, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
5246 {
5247 if(cme_err != MBTK_INFO_ERR_CME_NON) {
5248 err = MBTK_INFO_ERR_CME + cme_err;
5249 } else {
5250 err = MBTK_INFO_ERR_UNKNOWN;
5251 }
5252 LOG("Get %d state fail.", cid);
5253 }
5254 else
5255 {
5256 uint8 buff[SOCK_MSG_LEN_MAX] = {0};
5257 int buff_len = 0;
wangyouqianged88c722023-11-22 16:33:43 +08005258#ifdef MBTK_AF_SUPPORT
5259 if(cid == 1)
5260 {
5261 ipv4.valid = false;
5262 ipv6.valid = false;
5263 if(default_iptype == MBTK_IP_TYPE_IP)
5264 {
5265 ipv4.valid = true;
5266 }
5267 else if(default_iptype == MBTK_IP_TYPE_IPV6)
5268 {
5269 ipv6.valid = true;
5270 }
5271 else
5272 {
5273 ipv4.valid = true;
5274 ipv6.valid = true;
5275 }
5276 }
5277#endif
liubin281ac462023-07-19 14:22:54 +08005278 if(ipv4.valid && ipv6.valid) {
5279 buff[0] = (uint8)2;
5280 buff_len++;
5281
5282 memcpy(buff + buff_len, &ipv4, sizeof(mbtk_ipv4_info_t));
5283 buff_len += sizeof(mbtk_ipv4_info_t);
5284 memcpy(buff + buff_len, &ipv6, sizeof(mbtk_ipv6_info_t));
5285 buff_len += sizeof(mbtk_ipv6_info_t);
5286 } else if(ipv4.valid) {
5287 buff[0] = (uint8)0;
5288 buff_len++;
5289
5290 memcpy(buff + buff_len, &ipv4, sizeof(mbtk_ipv4_info_t));
5291 buff_len += sizeof(mbtk_ipv4_info_t);
5292 } else if(ipv6.valid) {
5293 buff[0] = (uint8)1;
5294 buff_len++;
5295
5296 memcpy(buff + buff_len, &ipv6, sizeof(mbtk_ipv6_info_t));
5297 buff_len += sizeof(mbtk_ipv6_info_t);
5298 } else {
5299 LOGE("Get IPv4/IPv6 fail.");
5300 err = MBTK_INFO_ERR_UNKNOWN;
5301 break;
5302 }
5303 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, buff, buff_len);
5304 }
5305 break;
5306 }
5307 default: {
5308 err = MBTK_INFO_ERR_FORMAT;
5309 break;
5310 }
5311 }
5312 }
5313 break;
5314 }
r.xiao06db9a12024-04-14 18:51:15 -07005315 case MBTK_INFO_ID_NET_IMS_REQ:
5316 {
5317 if(pack->data_len == 0 || pack->data == NULL) //Get
5318 {
5319 int reg = -1;
5320 if(net_ims_get(&reg, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
5321 {
5322 if(cme_err != MBTK_INFO_ERR_CME_NON) {
5323 err = MBTK_INFO_ERR_CME + cme_err;
5324 } else {
5325 err = MBTK_INFO_ERR_UNKNOWN;
5326 }
5327 LOG("Get net ims fail.");
5328 }
5329 else
5330 {
5331 uint8 reg_type = (uint8)reg;
5332 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_IMS_RSP, &reg_type, sizeof(uint8));
5333 }
5334 }
5335 else
5336 {
5337 uint8 ims = *(pack->data);
5338
5339 if(net_ims_set(ims, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
5340 {
5341 if(cme_err != MBTK_INFO_ERR_CME_NON) {
5342 err = MBTK_INFO_ERR_CME + cme_err;
5343 } else {
5344 err = MBTK_INFO_ERR_UNKNOWN;
5345 }
5346 LOG("Set net ims fail.");
5347 }
5348 else
5349 {
5350 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_IMS_RSP, NULL, 0);
5351 }
5352 }
5353 break;
5354 }
r.xiaoec113d12024-01-12 02:13:28 -08005355 case MBTK_INFO_ID_WAKEUP_STA_REQ:
5356 {
5357 if(pack->data_len == 0 || pack->data == NULL)
5358 {
5359 err = MBTK_INFO_ERR_UNSUPPORTED;
5360 LOG("Get POWERIND state UNSUPPORTED.");
5361 }
5362 else // Set powerind state.
5363 {
5364 uint32 state = *(pack->data);
5365 if(req_powerind_set(state, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
5366 {
5367 if(cme_err != MBTK_INFO_ERR_CME_NON) {
5368 err = MBTK_INFO_ERR_CME + cme_err;
5369 } else {
5370 err = MBTK_INFO_ERR_UNKNOWN;
5371 }
5372 LOG("Set POWERIND state fail.");
5373 }
5374 else
5375 {
5376 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_WAKEUP_STA_RSP, NULL, 0);
5377 }
5378 }
5379 break;
5380 }
5381 case MBTK_INFO_ID_OOS_STA_REQ:
5382 {
5383 if(pack->data_len == 0 || pack->data == NULL)
5384 {
5385 mbtk_oos_info oos_t;
5386 if(req_oos_get(&oos_t, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
5387 {
5388 if(cme_err != MBTK_INFO_ERR_CME_NON) {
5389 err = MBTK_INFO_ERR_CME + cme_err;
5390 } else {
5391 err = MBTK_INFO_ERR_UNKNOWN;
5392 }
5393 LOG("Get SMS OOS fail.");
r.xiaoec113d12024-01-12 02:13:28 -08005394 }
5395 else
5396 {
r.xiaoec113d12024-01-12 02:13:28 -08005397 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_OOS_STA_RSP, &oos_t, sizeof(mbtk_oos_info));
5398 }
5399 }
b.liufe320632024-01-17 20:38:08 +08005400 else // Set OOS
r.xiaoec113d12024-01-12 02:13:28 -08005401 {
r.xiaocfd7c682024-01-22 03:59:46 -08005402 mbtk_oos_info *state = (mbtk_oos_info *)pack->data;
5403 if(pack->data_len != sizeof(mbtk_oos_info))
5404 {
5405 err = MBTK_INFO_ERR_REQ_PARAMETER;
5406 LOG("Set oos error.");
5407 break;
5408 }
5409
r.xiaoec113d12024-01-12 02:13:28 -08005410 if(req_oos_set(state, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
5411 {
5412 if(cme_err != MBTK_INFO_ERR_CME_NON) {
5413 err = MBTK_INFO_ERR_CME + cme_err;
5414 } else {
5415 err = MBTK_INFO_ERR_UNKNOWN;
5416 }
5417 LOG("Set OOS fail.");
5418 }
5419 else
5420 {
5421 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_OOS_STA_RSP, NULL, 0);
5422 }
5423 }
5424 break;
5425 }
wangyouqiang38e53362024-01-23 10:53:48 +08005426 case MBTK_INFO_ID_LED_REQ:
5427 {
5428 if(pack->data_len == 0 || pack->data == NULL)
5429 {
5430 err = MBTK_INFO_ERR_UNSUPPORTED;
5431 LOGE("led param is error.");
5432 }
5433 else
5434 {
5435 char type = pack->data[0];
5436 char status = pack->data[1];
5437 LOGE("[set_led] = [%d], [status_led] = [%d].", type, status);
r.xiaoec113d12024-01-12 02:13:28 -08005438
wangyouqiang38e53362024-01-23 10:53:48 +08005439 if(type == MBTK_LED_TYPE_NET)
5440 {
5441 if(status == MBTK_LED_STATUS_CLOSE)
5442 {
5443 mbtk_net_led_set(MBTK_NET_LED_CLOSE);
5444 }
5445 else
5446 {
5447 mbtk_net_led_set(MBTK_NET_LED_OPEN);
5448 }
5449 }
5450 else
5451 {
5452 if(status == MBTK_LED_STATUS_CLOSE)
5453 {
5454 status_led_set(MBTK_STATUS_LED_CLOSE);
5455 }
5456 else
5457 {
5458 status_led_set(MBTK_STATUS_LED_OPEN);
5459 }
5460 }
5461 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_LED_RSP, NULL, 0);
5462 }
5463 break;
5464 }
liubin281ac462023-07-19 14:22:54 +08005465 default:
5466 {
5467 err = MBTK_INFO_ERR_REQ_UNKNOWN;
5468 LOG("Unknown request : %s", id2str(pack->info_id));
5469 break;
5470 }
5471 }
5472
5473 return err;
5474 }
5475}
5476
5477// Process AT URC data
5478static int send_pack_to_queue(sock_client_info_t* cli_info, void* pack)
5479{
5480 if(info_queue.count >= PACK_PROCESS_QUEUE_MAX)
5481 {
5482 LOG("Packet process queue is full");
5483 return -1;
5484 }
5485
5486 info_queue_item_t *item = (info_queue_item_t*)malloc(sizeof(info_queue_item_t));
5487 if(!item)
5488 {
5489 LOG("malloc() fail[%d].", errno);
5490 return -1;
5491 }
5492 item->cli_info = cli_info;
5493 item->pack = pack;
5494 mbtk_queue_put(&info_queue, item);
5495
5496 // If thread is waitting,continue it.
5497 if(1/*!is_running*/)
5498 {
5499 pthread_mutex_lock(&info_mutex);
5500 pthread_cond_signal(&info_cond);
5501 pthread_mutex_unlock(&info_mutex);
5502 }
5503 else
5504 {
5505 LOG("Packet process thread is process...");
5506 }
5507
5508 return 0;
5509}
5510
5511static void radio_state_change(void *data, int data_len)
5512{
5513 uint8 *data_ptr = (uint8*)data;
5514 if(data_ptr[0]) {
5515 net_info.radio_state = MBTK_RADIO_STATE_ON;
5516 } else {
5517 net_info.radio_state = MBTK_RADIO_STATE_OFF;
5518 }
5519
5520 sock_client_info_t *cli = NULL;
5521 list_first(sock_client_list);
5522 while ((cli = (sock_client_info_t*) list_next(sock_client_list)))
5523 {
5524 if(cli->ind_num > 0) {
5525 int i;
5526 for(i = 0; i < IND_REGISTER_MAX; i++) {
5527 // Registe MBTK_INFO_ID_IND_RADIO_STATE_CHANGE
5528 if(cli->ind_register[i] == MBTK_INFO_ID_IND_RADIO_STATE_CHANGE) {
5529 pack_rsp_send(cli->fd , MBTK_INFO_ID_IND_RADIO_STATE_CHANGE, data, data_len);
5530 break;
5531 }
5532 }
5533 }
5534 }
5535}
5536
5537static void pdp_state_change(void *data, int data_len)
5538{
5539 sock_client_info_t *cli = NULL;
5540 list_first(sock_client_list);
5541 while ((cli = (sock_client_info_t*) list_next(sock_client_list)))
5542 {
5543 if(cli->ind_num > 0) {
5544 int i;
5545 for(i = 0; i < IND_REGISTER_MAX; i++) {
5546 if(cli->ind_register[i] == MBTK_INFO_ID_IND_PDP_STATE_CHANGE) {
5547 pack_rsp_send(cli->fd , MBTK_INFO_ID_IND_PDP_STATE_CHANGE, data, data_len);
5548 break;
5549 }
5550 }
5551 }
5552 }
5553}
5554
5555static void net_state_change(void *data, int data_len)
5556{
5557 sock_client_info_t *cli = NULL;
5558 list_first(sock_client_list);
5559 while ((cli = (sock_client_info_t*) list_next(sock_client_list)))
5560 {
5561 if(cli->ind_num > 0) {
5562 int i;
5563 for(i = 0; i < IND_REGISTER_MAX; i++) {
5564 // Registe MBTK_INFO_ID_IND_NET_STATE_CHANGE
5565 if(cli->ind_register[i] == MBTK_INFO_ID_IND_NET_STATE_CHANGE) {
5566 pack_rsp_send(cli->fd , MBTK_INFO_ID_IND_NET_STATE_CHANGE, data, data_len);
5567 break;
5568 }
5569 }
5570 }
5571 }
5572}
5573
5574static void call_state_change(void *data, int data_len)
5575{
5576 sock_client_info_t *cli = NULL;
5577 list_first(sock_client_list);
5578 while ((cli = (sock_client_info_t*) list_next(sock_client_list)))
5579 {
5580 if(cli->ind_num > 0) {
5581 int i;
5582 for(i = 0; i < IND_REGISTER_MAX; i++) {
5583 // Registed MBTK_INFO_ID_IND_RADIO_STATE_CHANGE
5584 if(cli->ind_register[i] == MBTK_INFO_ID_IND_CALL_STATE_CHANGE) {
5585 pack_rsp_send(cli->fd , MBTK_INFO_ID_IND_CALL_STATE_CHANGE, data, data_len);
5586 break;
5587 }
5588 }
5589 }
5590 }
5591}
5592
5593static void sim_state_change(void *data, int data_len)
5594{
5595 sock_client_info_t *cli = NULL;
5596 list_first(sock_client_list);
5597 while ((cli = (sock_client_info_t*) list_next(sock_client_list)))
5598 {
5599 if(cli->ind_num > 0) {
5600 int i;
5601 for(i = 0; i < IND_REGISTER_MAX; i++) {
5602 // Registed MBTK_INFO_ID_IND_RADIO_STATE_CHANGE
5603 if(cli->ind_register[i] == MBTK_INFO_ID_IND_SIM_STATE_CHANGE) {
5604 pack_rsp_send(cli->fd , MBTK_INFO_ID_IND_SIM_STATE_CHANGE, data, data_len);
5605 break;
5606 }
5607 }
5608 }
5609 }
5610}
5611
5612static void sms_state_change(void *data, int data_len)
5613{
5614 sock_client_info_t *cli = NULL;
5615 list_first(sock_client_list);
5616 while ((cli = (sock_client_info_t*) list_next(sock_client_list)))
5617 {
5618 if(cli->ind_num > 0) {
5619 int i;
5620 for(i = 0; i < IND_REGISTER_MAX; i++) {
5621 // Registed MBTK_INFO_ID_IND_SMS_STATE_CHANGE
5622 if(cli->ind_register[i] == MBTK_INFO_ID_IND_SMS_STATE_CHANGE) {
5623 pack_rsp_send(cli->fd , MBTK_INFO_ID_IND_SMS_STATE_CHANGE, data, data_len);
5624 break;
5625 }
5626 }
5627 }
5628 }
5629}
5630
5631int urc_msg_distribute(bool async_process, info_urc_msg_id_enum msg, void *data, int data_len)
5632{
5633#if 0
5634 if(urc_queue.count >= PACK_PROCESS_QUEUE_MAX)
5635 {
5636 LOG("Packet process queue is full");
5637 return -1;
5638 }
5639
5640 info_urc_msg_t *urc = (info_urc_msg_t*)malloc(sizeof(info_urc_msg_t));
5641 if(!urc)
5642 {
5643 LOG("malloc() fail[%d].", errno);
5644 return -1;
5645 }
5646 urc->msg = msg;
5647 urc->data = memdup(data, data_len);
5648 urc->data_len = data_len;
5649
5650 mbtk_queue_put(&urc_queue, urc);
5651
5652 // If thread is waitting,continue it.
5653 if(1/*!is_running*/)
5654 {
5655 pthread_mutex_lock(&urc_mutex);
5656 pthread_cond_signal(&urc_cond);
5657 pthread_mutex_unlock(&urc_mutex);
5658 }
5659 else
5660 {
5661 LOG("Packet process thread is process...");
5662 }
5663
5664 return 0;
5665#else
5666 if(async_process) {
5667 info_urc_msg_t *urc = (info_urc_msg_t*)malloc(sizeof(info_urc_msg_t));
5668 if(!urc)
5669 {
5670 LOG("malloc() fail[%d].", errno);
5671 return -1;
5672 }
5673 urc->msg = msg;
5674 if(data && data_len > 0) {
5675 urc->data = memdup(data, data_len);
5676 urc->data_len = data_len;
5677 } else {
5678 urc->data = NULL;
5679 urc->data_len = 0;
5680 }
5681 return send_pack_to_queue(NULL, urc);
5682 } else {
5683 switch(msg) {
5684 case INFO_URC_MSG_NET_CS_REG_STATE:
5685 {
5686 net_state_change(data, data_len);
5687 break;
5688 }
5689 case INFO_URC_MSG_CALL_STATE:
5690 {
5691 call_state_change(data, data_len);
5692 break;
5693 }
5694 case INFO_URC_MSG_SMS_STATE:
5695 {
5696 sms_state_change(data, data_len);
5697 break;
5698 }
5699 case INFO_URC_MSG_SIM_STATE:
5700 {
5701 sim_state_change(data, data_len);
5702 break;
5703 }
5704 case INFO_URC_MSG_PDP_STATE:
5705 {
5706 pdp_state_change(data, data_len);
5707 break;
5708 }
5709 default: {
5710 LOGE("Unknown msg : %d", msg);
5711 break;
5712 }
5713 }
5714
5715 return 0;
5716 }
5717#endif
5718}
5719
5720
5721static void ind_regisger(sock_client_info_t* cli_info, uint16 ind)
5722{
5723 uint32 i = 0;
5724 while(i < cli_info->ind_num)
5725 {
5726 if(cli_info->ind_register[i] == ind)
5727 break;
5728 i++;
5729 }
5730
5731 if(i == cli_info->ind_num) // No found IND
5732 {
5733 cli_info->ind_register[i] = ind;
5734 cli_info->ind_num++;
5735 LOG("Register IND : %s", id2str(ind));
5736 }
5737 else
5738 {
5739 LOG("IND had exist.");
5740 }
5741}
5742
5743static void pack_distribute(sock_client_info_t* cli_info, mbtk_info_pack_t* pack)
5744{
5745 // Register IND Message.
5746 if(mbtk_info_type_get(pack->info_id) == MBTK_INFO_TYPE_IND)
5747 {
5748 mbtk_info_err_enum err = MBTK_INFO_ERR_SUCCESS;
5749 if(cli_info->ind_num >= IND_REGISTER_MAX)
5750 {
5751 LOG("IND if full.");
5752 err = MBTK_INFO_ERR_IND_FULL;
5753 }
5754 else
5755 {
5756 ind_regisger(cli_info, pack->info_id);
5757 }
5758
5759 pack_error_send(cli_info->fd, pack->info_id, err);
5760
5761 mbtk_info_pack_free(&pack);
5762 }
5763 else // Request Information.
5764 {
5765 LOG("Start process REQ(%s), Length : %d", id2str(pack->info_id), pack->data_len);
5766 if(0 && pack->data_len > 0)
5767 {
5768 log_hex("DATA", pack->data, pack->data_len);
5769 }
5770
5771 // Send to REQ_process_thread process.
5772 send_pack_to_queue(cli_info, pack);
5773
5774 // For test.
5775 // pack_error_send(cli_info->fd, pack->info_id + 1, MBTK_INFO_ERR_SUCCESS);
5776 }
5777}
5778
5779static sock_client_info_t* cli_find(int fd)
5780{
5781 sock_client_info_t *result = NULL;
5782 list_first(sock_client_list);
5783 while ((result = (sock_client_info_t*) list_next(sock_client_list)))
5784 {
5785 if (result->fd == fd)
5786 return result;
5787 }
5788
5789 return NULL;
5790}
5791
5792//mbtk wyq for server_ready_status add start
5793void server_ready_set(void)
5794{
5795 server_ready_status = 1;
5796}
5797
5798char server_ready_get(void)
5799{
5800 return server_ready_status;
5801}
5802
5803static void server_state_send(void)
5804{
5805 sock_client_info_t *cli = NULL;
5806 list_first(sock_client_list);
5807 while ((cli = (sock_client_info_t*) list_next(sock_client_list)))
5808 {
5809 if(cli->ind_num > 0) {
5810 if(cli->ind_register[0] == MBTK_INFO_ID_IND_SERVER_STATE_CHANGE) {
5811 cli->ind_num = 0;
5812 cli->ind_register[0] = 0;
5813 pack_rsp_send(cli->fd , MBTK_INFO_ID_IND_SERVER_STATE_CHANGE, "1", 1);
5814 break;
5815 }
5816 }
5817 else
5818 {
5819 break;
5820 }
5821 }
5822 LOG("handshake message send ok.");
5823}
5824
5825//mbtk wyq for server_ready_status add end
5826
5827//mbtk wyq for data_call_ex add start
5828//Save the cid that "DATA_CALL" needs to be automatically connected after startup
5829void data_call_bootconn_save(int cid, int bootconn)
5830{
5831 if(cid_bootconn[cid] == bootconn + '0')
5832 {
5833 return;
5834 }
5835 cid_bootconn[cid] = bootconn + '0';
5836
5837 LOG("data_call_bootconn_set cid_bootconn = %s", cid_bootconn);
5838 property_set("persist.mbtk.datacall.bootconn", cid_bootconn);
5839}
5840
5841static void* data_call_bootconn_pthread(void *arg)
5842{
5843 UNUSED(arg);
5844 LOG("data_call_bootconn_pthread enter.");
5845 int i = 0;
5846 int send_sum = 0;
5847 int bootconn = 0;
b.liufe320632024-01-17 20:38:08 +08005848
liubin281ac462023-07-19 14:22:54 +08005849 while(1)
5850 {
5851 if(server_ready_get() && send_sum == 0)
5852 {
5853 server_state_send();
5854 send_sum = 1;
5855 }
b.liufe320632024-01-17 20:38:08 +08005856
liubin281ac462023-07-19 14:22:54 +08005857 if(net_info.sim_state == MBTK_SIM_READY && net_info.net_type == MBTK_RADIO_TECH_E_UTRAN && bootconn == 0)
5858 {
5859 //data_call_bootconn_exec();
5860 property_get("persist.mbtk.datacall.bootconn", cid_bootconn, "00000000");
5861 LOG("data_call_bootconn_exec cid_bootconn = %s", cid_bootconn);
b.liufe320632024-01-17 20:38:08 +08005862
liubin281ac462023-07-19 14:22:54 +08005863 for(i = MBTK_APN_CID_MIN; i < MBTK_APN_CID_MAX + 1; i++)
5864 {
5865 if(cid_bootconn[i] == '1')
5866 {
5867 sock_client_info_t *info = (sock_client_info_t*)malloc(sizeof(sock_client_info_t));
5868 if(info == NULL)
5869 {
5870 LOG("clinent_info malloc() fail.");
5871 continue;
5872 }
5873 memset(info, 0, sizeof(sock_client_info_t));
5874 info->fd = DATA_CALL_BOOTCONN_FD;
b.liufe320632024-01-17 20:38:08 +08005875
liubin281ac462023-07-19 14:22:54 +08005876 mbtk_info_pack_t* pack = mbtk_info_pack_creat(MBTK_INFO_ID_NET_DATA_CALL_REQ);
5877 if(pack == NULL)
5878 {
5879 free(info);
5880 LOG("Packet malloc() fail.");
5881 continue;
5882 }
5883
5884 // "info_err"
5885 //pack->info_err = byte_2_uint16(ptr, false)
5886
5887 // "data_len"
5888 pack->data_len = 5;
5889
5890 char *p = (char *)malloc(5);
5891 p[0] = MBTK_DATA_CALL_START;
5892 p[1] = i;
5893 p[2] = 0;
5894 p[3] = 1;
5895 p[4] = 10;
5896 pack->data = p;
5897 send_pack_to_queue(info, pack);
5898 }
5899 }
5900
5901 bootconn = 1;
5902 }
5903
5904 if(bootconn == 1 && send_sum == 1)
5905 {
5906 break;
5907 }
5908 else
5909 {
5910 sleep(1);
5911 }
5912 }
5913
5914 LOG("data_call_bootconn_pthread exit.");
5915 return NULL;
5916}
5917
5918//mbtk wyq for data_call_ex add end
5919
5920static void* info_main_pthread(void* arg)
5921{
5922 UNUSED(arg);
5923 epoll_fd = epoll_create(SOCK_CLIENT_MAX + 1);
5924 if(epoll_fd < 0)
5925 {
5926 LOG("epoll_create() fail[%d].", errno);
5927 return NULL;
5928 }
5929
5930 uint32 event = EPOLLIN | EPOLLET;
5931 struct epoll_event ev;
5932 ev.data.fd = sock_listen_fd;
5933 ev.events = event; //EPOLLIN | EPOLLERR | EPOLLET;
5934 epoll_ctl(epoll_fd,EPOLL_CTL_ADD,sock_listen_fd,&ev);
5935
5936 int nready = -1;
5937 struct epoll_event epoll_events[EPOLL_LISTEN_MAX];
5938 while(1)
5939 {
5940 nready = epoll_wait(epoll_fd, epoll_events, EPOLL_LISTEN_MAX, -1);
5941 if(nready > 0)
5942 {
5943 sock_client_info_t *cli_info = NULL;
5944 int i;
5945 for(i = 0; i < nready; i++)
5946 {
5947 LOG("fd[%d] event = %x",epoll_events[i].data.fd, epoll_events[i].events);
5948 if(epoll_events[i].events & EPOLLHUP) // Client Close.
5949 {
5950 if((cli_info = cli_find(epoll_events[i].data.fd)) != NULL)
5951 {
5952 cli_close(cli_info);
5953 }
5954 else
5955 {
5956 LOG("Unknown client[fd = %d].", epoll_events[i].data.fd);
5957 }
5958 }
5959 else if(epoll_events[i].events & EPOLLIN)
5960 {
5961 if(epoll_events[i].data.fd == sock_listen_fd) // New clients connected.
5962 {
5963 int client_fd = -1;
5964 while(1)
5965 {
5966 struct sockaddr_in cliaddr;
5967 socklen_t clilen = sizeof(cliaddr);
5968 client_fd = accept(epoll_events[i].data.fd, (struct sockaddr *) &cliaddr, &clilen);
5969 if(client_fd < 0)
5970 {
5971 if(errno == EAGAIN)
5972 {
5973 LOG("All client connect get.");
5974 }
5975 else
5976 {
5977 LOG("accept() error[%d].", errno);
5978 }
5979 break;
5980 }
5981 // Set O_NONBLOCK
5982 int flags = fcntl(client_fd, F_GETFL, 0);
5983 if (flags > 0)
5984 {
5985 flags |= O_NONBLOCK;
5986 if (fcntl(client_fd, F_SETFL, flags) < 0)
5987 {
5988 LOG("Set flags error:%d", errno);
5989 }
5990 }
5991
5992 memset(&ev,0,sizeof(struct epoll_event));
5993 ev.data.fd = client_fd;
5994 ev.events = event;//EPOLLIN | EPOLLERR | EPOLLET;
5995 epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_fd, &ev);
5996
5997 sock_client_info_t *info = (sock_client_info_t*)malloc(sizeof(sock_client_info_t));
5998 if(info)
5999 {
6000 memset(info, 0, sizeof(sock_client_info_t));
6001 info->fd = client_fd;
6002 if(server_ready_get() == 1)
6003 {
6004 info->ind_num = 0;
6005 pack_rsp_send(info->fd , MBTK_INFO_ID_IND_SERVER_STATE_CHANGE, "1", 1);
6006 LOG("server ready ok.");
6007 }
6008 else
6009 {
6010 info->ind_num = 1;
6011 info->ind_register[0] = MBTK_INFO_ID_IND_SERVER_STATE_CHANGE;
6012 LOG("server ready no.");
6013 }
6014 list_add(sock_client_list, info);
6015 LOG("Add New Client FD Into List.");
6016 }
6017 else
6018 {
6019 LOG("malloc() fail.");
6020 }
6021 }
6022 }
6023 else if((cli_info = cli_find(epoll_events[i].data.fd)) != NULL) // Client data arrive.
6024 {
6025 // Read and process every message.
6026 mbtk_info_err_enum err = MBTK_INFO_ERR_SUCCESS;
6027 mbtk_info_pack_t** pack = mbtk_info_pack_recv(cli_info->fd, true, &err);
6028
6029 // Parse packet error,send error response to client.
6030 if(pack == NULL)
6031 {
6032 if(err != MBTK_INFO_ERR_SUCCESS)
6033 {
6034 pack_error_send(cli_info->fd, MBTK_INFO_ID_REQ_UNKNOWN, err);
6035 }
6036 }
6037 else
6038 {
6039#if 0
6040 int i = 0;
6041 while(pack[i] != NULL)
6042 {
6043 pack_distribute(cli_info, pack[i]);
6044 // Not free,will free in pack_process() or packet process thread.
6045 //mbtk_info_pack_free(&(pack[i]));
6046 i++;
6047 }
6048 free(pack);
6049#else
6050 mbtk_info_pack_t** pack_ptr = pack;
6051 while(*pack_ptr)
6052 {
6053 pack_distribute(cli_info, *pack_ptr);
6054 // Not free,will free in pack_process() or packet process thread.
6055 //mbtk_info_pack_free(pack_ptr);
6056 pack_ptr++;
6057 }
6058
6059 free(pack);
6060#endif
6061 }
6062 }
6063 else
6064 {
6065 LOG("Unknown socket : %d", epoll_events[i].data.fd);
6066 }
6067 }
6068 else
6069 {
6070 LOG("Unknown event : %x", epoll_events[i].events);
6071 }
6072 }
6073 }
6074 else
6075 {
6076 LOG("epoll_wait() fail[%d].", errno);
6077 }
6078 }
6079
6080 return NULL;
6081}
6082
6083static void data_call_restart()
6084{
6085#if 0
6086 // Waitting for network ok.
6087 mbtk_net_info_t info;
6088 int cme_err;
6089 int i = 0;
6090 while(i < 15) { // 15s timeout
6091 cme_err = MBTK_INFO_ERR_CME_NON;
6092 memset(&info, 0, sizeof(mbtk_net_info_t));
6093 if(!req_net_sel_mode_get(&info, &cme_err) && cme_err == MBTK_INFO_ERR_CME_NON)
6094 {
6095 if(info.net_type >= 2) {
6096 break;
6097 }
6098 }
6099
6100 sleep(1);
6101 i++;
6102 }
6103#endif
6104 // +CGACT
6105 int cid;
6106 LOGD("Start active APN.");
6107 for(cid = MBTK_APN_CID_MIN; cid <= MBTK_APN_CID_MAX && cid_active[cid]; cid++) {
6108 LOG("Active cid : %d", cid);
6109 req_data_call_start(cid, NULL);
6110 }
6111}
6112
6113/*
6114void mbtk_radio_ready_cb()
6115{
6116 pthread_t radio_pid;
6117 pthread_attr_t thread_attr;
6118 pthread_attr_init(&thread_attr);
6119 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
6120 {
6121 LOG("pthread_attr_setdetachstate() fail.");
6122 return;
6123 }
6124
6125 if(pthread_create(&radio_pid, &thread_attr, radio_ready_thread, NULL))
6126 {
6127 LOG("pthread_create() fail.");
6128 }
6129
6130 pthread_attr_destroy(&thread_attr);
6131}
6132*/
6133
6134static void net_ifc_state_change(bool act, int cid)
6135{
6136 if(cid < MBTK_APN_CID_MIN || cid > MBTK_APN_CID_MAX) { // No nothing for cid 1 and 8
6137 return;
6138 }
6139
wangyouqiang65884152023-10-25 19:54:15 +08006140 if(act)
6141 {
6142 cid_active[cid] = 1;
6143 }
6144 else
6145 {
6146 cid_active[cid] = 0;
6147 }
liubin281ac462023-07-19 14:22:54 +08006148 char dev[20] = {0};
6149 sprintf(dev, "ccinet%d", cid - 1);
6150 if(act) { // Config IP.
6151 // Get IP information.
6152 mbtk_ipv4_info_t ipv4;
6153 mbtk_ipv6_info_t ipv6;
6154 memset(&ipv4, 0, sizeof(mbtk_ipv4_info_t));
6155 memset(&ipv6, 0, sizeof(mbtk_ipv6_info_t));
6156 int cme_err = MBTK_INFO_ERR_CME_NON;
6157 if(!req_data_call_state_get(cid, &ipv4, &ipv6, &cme_err) && cme_err == MBTK_INFO_ERR_CME_NON)
6158 {
wangyouqianged88c722023-11-22 16:33:43 +08006159#ifdef MBTK_AF_SUPPORT
6160 if(cid == 1)
6161 {
6162 ipv4.valid = false;
6163 ipv6.valid = false;
6164 if(default_iptype == MBTK_IP_TYPE_IP)
6165 {
6166 ipv4.valid = true;
6167 }
6168 else if(default_iptype == MBTK_IP_TYPE_IPV6)
6169 {
6170 ipv6.valid = true;
6171 }
6172 else
6173 {
6174 ipv4.valid = true;
6175 ipv6.valid = true;
6176 }
6177 }
6178#endif
liubin281ac462023-07-19 14:22:54 +08006179 // Config IPv4 address.
6180 if(ipv4.valid) {
6181 char ip[20] = {0};
6182 if(inet_ntop(AF_INET, &(ipv4.IPAddr), ip, 20) == NULL) {
6183 LOGE("inet_ntop ipv4 ip fail.");
6184 return;
6185 }
6186
6187 if(mbtk_ifc_configure2(dev, ip, 0, NULL, "255.255.255.0")) {
6188 LOGD("Config %s IPv4 %s fail.", dev, ip);
6189 } else {
6190 LOGD("Config %s IPv4 %s success.", dev, ip);
6191 }
6192 }
6193
6194 // Config IPv6 address.
6195 if(ipv6.valid) {
6196 char ip[50] = {0};
6197
6198 if(inet_ntop(AF_INET6, &(ipv6.IPV6Addr), ip, 50) == NULL) {
6199 LOGE("inet_ntop ipv6 ip fail.");
6200 return;
6201 }
6202
6203 if(mbtk_ipv6_config(dev, ip, 64)) {
6204 LOGD("Config %s IPv6 %s fail.", dev, ip);
6205 } else {
6206 LOGD("Config %s IPv6 %s success.", dev, ip);
6207 }
6208 }
6209 }
6210 } else { // Del IP
6211 if(mbtk_ifc_configure2(dev, NULL, 0, NULL, NULL)) {
6212 LOGD("Config %s IPv4 0 fail.", dev);
6213 } else {
6214 LOGD("Config %s IPv4 0 success.", dev);
6215 }
6216 }
6217}
6218
6219static void urc_msg_process(info_urc_msg_t *msg)
6220{
6221 uint8 *data = NULL;
6222 if(msg->data) {
6223 data = (uint8*)msg->data;
6224 }
6225 switch(msg->msg) {
6226 case INFO_URC_MSG_RADIO_STATE:
6227 {
6228 radio_state_change(msg->data, msg->data_len);
6229 // Reconfig APN while radio on.
6230 if(data[0]) {
6231 apn_prop_get();
6232 }
6233 break;
6234 }
6235 case INFO_URC_MSG_CGEV:
6236 {
6237 bool act = data[0];
6238 int cid = data[1];
6239 if(cid > 0) {
6240 net_ifc_state_change(act, cid);
6241 }
6242 break;
6243 }
6244 case INFO_URC_MSG_NET_PS_REG_STATE:
6245 {
b.liufe320632024-01-17 20:38:08 +08006246 uint8 net_data[4];
liubin281ac462023-07-19 14:22:54 +08006247 net_data[0] = (uint8)MBTK_NET_PS_STATE;
b.liufe320632024-01-17 20:38:08 +08006248 net_data[1] = data[0]; // act
6249 net_data[3] = data[1]; // 0 - GSM/WCDMA; 1 - LTE
liubin281ac462023-07-19 14:22:54 +08006250 mbtk_net_reg_state_enum state = (mbtk_net_reg_state_enum)data[0];
6251 if(state == MBTK_NET_REG_STATE_HOME
6252 || state == MBTK_NET_REG_STATE_ROAMING) { // Registered, home network or roaming.
6253 mbtk_net_info_t info;
6254 int cme_err = MBTK_INFO_ERR_CME_NON;
6255 memset(&info, 0, sizeof(mbtk_net_info_t));
6256 if(!req_net_sel_mode_get(&info, &cme_err) && cme_err == MBTK_INFO_ERR_CME_NON)
6257 {
6258 net_data[2] = info.net_type;
6259 net_state_change(net_data, sizeof(net_data));
6260
6261 if(info.net_type >= MBTK_RADIO_TECH_UTRAN) {
6262 data_call_restart();
6263 }
6264 } else {
6265 net_data[2] = (uint8)0xFF;
6266 net_state_change(net_data, sizeof(net_data));
6267 }
6268 } else {
6269 net_data[2] = (uint8)0xFF;
6270 net_state_change(net_data, sizeof(net_data));
6271 }
6272 break;
6273 }
b.liuf37bd332024-03-18 13:51:24 +08006274 case INFO_URC_MSG_SET_BAND:
6275 {
6276 mbtk_band_info_t band;
6277 int cme_err = MBTK_INFO_ERR_CME_NON;
6278
6279 band.net_pref = MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF; // 15
6280 band.gsm_band = band_set_info.band_gsm;
6281 band.umts_band = band_set_info.band_wcdma;
6282 band.tdlte_band = band_set_info.band_tdlte;
6283 band.fddlte_band = band_set_info.band_fddlte;
6284 if(req_band_set(&band, &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
6285 {
6286 LOG("Set band fail.");
6287 }
6288 else // Set band success.
6289 {
6290 band_set_info.band_set_success = TRUE;
6291 if(band_set_info.band_area == MBTK_MODEM_BAND_AREA_CN) {
6292 property_set("persist.mbtk.band_config", "CN");
6293 } else if(band_set_info.band_area == MBTK_MODEM_BAND_AREA_EU) {
6294 property_set("persist.mbtk.band_config", "EU");
6295 } else {
6296 property_set("persist.mbtk.band_config", "ALL");
6297 }
6298 LOG("Set band success.");
6299 }
6300 break;
6301 }
wangyouqiangce45a102024-04-18 18:08:29 +08006302 case INFO_URC_MSG_GET_SIM_STATE:
6303 {
6304 net_info.sim_state = getSIMStatus();
6305 if(net_info.sim_state == MBTK_SIM_READY)
6306 {
6307 LOG("SIM READY!");
6308 }
6309 else
6310 {
6311 LOG("SIM NOT READY!");
6312 }
6313 break;
6314 }
liubin281ac462023-07-19 14:22:54 +08006315 case INFO_URC_MSG_NET_STATE_LOG:
6316 {
6317 // Get network state and signal.
6318 char buff[256] = {0};
6319 mbtk_signal_info_t signal;
6320 memset(&signal, 0xFF, sizeof(mbtk_signal_info_t));
6321 if(!req_net_signal_get(&signal, NULL)) {
6322 char tmp[50] = {0};
6323 struct timeval log_time;
6324 gettimeofday(&log_time, NULL);
6325 struct tm* tm_t = localtime(&(log_time.tv_sec));
6326 strftime(tmp, 50, "%F %T", tm_t);
6327 snprintf(buff, sizeof(buff), "%s:%d,%d,%d,%d,%d,%d,%d,%d", tmp, signal.type, signal.rssi, signal.rxlev, signal.ber, signal.rscp, signal.ecno,
6328 signal.rsrq, signal.rsrp);
6329 mbtk_signal_log(buff);
6330 }
6331 //
6332 break;
6333 }
6334 default:
6335 {
6336 LOGE("Unknown URC : %d", msg->msg);
6337 break;
6338 }
6339 }
6340}
6341
6342static void* pack_process_thread(void* arg)
6343{
6344 UNUSED(arg);
6345 info_queue_item_t* item = NULL;
6346 mbtk_queue_init(&info_queue);
6347 pthread_mutex_init(&info_mutex, NULL);
6348 pthread_cond_init(&info_cond, NULL);
6349
6350 memset(&band_support, 0xFF, sizeof(mbtk_band_info_t));
6351
6352 pthread_mutex_lock(&info_mutex);
6353 while(TRUE)
6354 {
6355 if(mbtk_queue_empty(&info_queue))
6356 {
6357 LOG("Packet process wait...");
6358 pthread_cond_wait(&info_cond, &info_mutex);
6359 LOG("Packet process continue...");
6360 }
6361 else
6362 {
6363 LOG("Packet process queue not empty,continue...");
6364 }
6365
6366 // Process all information request.
6367 mbtk_info_err_enum err;
6368 while((item = (info_queue_item_t*)mbtk_queue_get(&info_queue)) != NULL)
6369 {
6370 if(item->cli_info) { // REQ form client.
6371 mbtk_info_pack_t *pack = (mbtk_info_pack_t*)item->pack;
6372 LOG("Process REQ %s.", id2str(pack->info_id));
6373 at_process = true;
6374 err = pack_req_process(item->cli_info, pack);
6375 if(err != MBTK_INFO_ERR_SUCCESS)
6376 {
6377 if(item->cli_info->fd != DATA_CALL_BOOTCONN_FD)
6378 {
6379 pack_error_send(item->cli_info->fd, pack->info_id + 1, err);
6380 }
6381 else
6382 {
6383 free(pack->data);
6384 free(item->cli_info);
6385 }
6386 }
6387 at_process = false;
6388 mbtk_info_pack_free(&pack);
6389 free(item);
6390 } else { // REQ from myself.
6391 info_urc_msg_t *urc = (info_urc_msg_t*)item->pack;
6392 LOG("Process URC %d.", urc->msg);
6393 urc_msg_process(urc);
6394 if(!urc->data)
6395 free(urc->data);
6396 free(urc);
6397 }
6398 }
6399 }
6400 pthread_mutex_unlock(&info_mutex);
6401 return NULL;
6402}
6403
6404void apn_prop_get()
6405{
6406 char prop_name[20];
6407 char prop_data[300];
6408 // cid : 2 - 7
6409 int cid = MBTK_APN_CID_MIN;
6410 mbtk_apn_info_t apn;
6411 for(; cid <= MBTK_APN_CID_MAX; cid++) {
6412 memset(prop_name, 0, 20);
6413 memset(prop_data, 0, 300);
6414 memset(&apn, 0, sizeof(mbtk_apn_info_t));
6415 sprintf(prop_name, "%s_%d",MBTK_APN_PROP,cid);
6416 if(property_get(prop_name, prop_data, "") > 0 && !str_empty(prop_data)) {
6417 apn.cid = cid;
6418 char *ptr_1 = prop_data;
6419 apn.ip_type = (mbtk_ip_type_enum)atoi(ptr_1);
6420 ptr_1 = strstr(ptr_1, ",");
6421 if(!ptr_1) {
6422 continue;
6423 }
6424 ptr_1++; // Jump ',' to apn
6425
6426 char *ptr_2 = strstr(ptr_1, ",");
6427 if(!ptr_2) {
6428 continue;
6429 }
6430 memcpy(apn.apn, ptr_1, ptr_2 - ptr_1); // apn
6431
6432 ptr_2++; // Jump ',' to user
6433 ptr_1 = strstr(ptr_2, ",");
6434 if(!ptr_1) {
6435 continue;
6436 }
6437 if(memcmp(ptr_2, "NULL", 4)) { // Not "NULL"
6438 memcpy(apn.user, ptr_2, ptr_1 - ptr_2); // user
6439 }
6440
6441 ptr_1++; // Jump ',' to pass
6442 ptr_2 = strstr(ptr_1, ",");
6443 if(!ptr_2) {
6444 continue;
6445 }
6446 if(memcmp(ptr_1, "NULL", 4)) { // Not "NULL"
6447 memcpy(apn.pass, ptr_1, ptr_2 - ptr_1); // pass
6448 }
6449
6450 ptr_2++; // Jump ',' to auth (Is last item)
6451 if(memcmp(ptr_2, "NULL", 4)) { // Not "NULL"
6452 memcpy(apn.auth, ptr_2, strlen(ptr_2)); // auth
6453 }
6454
6455 req_apn_set(&apn, NULL);
6456 }
6457 }
6458}
6459
6460/*
b.liue0ab2442024-02-06 18:53:28 +08006461root@OpenWrt:/usrdata# cat /proc/mtd
6462dev: size erasesize name
6463mtd0: 00040000 00020000 "bootloader"
6464mtd1: 00020000 00020000 "cp_reliabledata"
6465mtd2: 00020000 00020000 "ap_reliabledata"
6466mtd3: 00020000 00020000 "cp_reliabledata_backup"
6467mtd4: 00020000 00020000 "ap_reliabledata_backup"
6468mtd5: 00020000 00020000 "mep-ota"
6469mtd6: 00020000 00020000 "mep-ota_backup"
6470mtd7: 00040000 00020000 "dtim"
6471mtd8: 00f40000 00020000 "cpimage"
6472mtd9: 000c0000 00020000 "u-boot"
6473mtd10: 00500000 00020000 "kernel"
6474mtd11: 00100000 00020000 "asr_flag"
6475mtd12: 01400000 00020000 "rootfs"
6476mtd13: 01400000 00020000 "oem_data"
6477mtd14: 01e00000 00020000 "OTA"
6478mtd15: 01400000 00020000 "rootfs_data"
6479mtd16: 081a0000 00020000 "user_data"
6480mtd17: 00d20000 00020000 "MRVL_BBM"
6481*/
6482static int partition_name_2_dev(const char *name, char *dev) {
6483 if(name == NULL || dev == NULL) {
6484 LOGE("ARG error.");
6485 return -1;
6486 }
6487
6488 int fp = fopen("/proc/mtd", "r");
6489 if (fp == NULL) {
6490 LOGE("Open MTD failed!");
6491 return -1;
6492 }
6493
6494 char buf[1024];
6495 while (fgets(buf, 1024, fp) != NULL) {
6496 if(strstr(buf, name)) {
6497 int index = atoi(buf + 3);
6498 sprintf(dev, "/dev/mtdblock%d", index);
6499 LOGD("%s -> %s", name, dev);
6500 return 0;
6501 }
6502 }
6503
6504 return -1;
6505}
6506
6507static int custom_partition_read(const char *name, mbtk_cust_info_t *cust_info)
6508{
6509 int fd = 0, ret = 0;
6510 unsigned int step = 0, offset = 0, flaglen = 0;
6511 flaglen = sizeof(mbtk_cust_info_t);
6512
6513 char mtd_path[50] = {0};
6514 if(partition_name_2_dev(name, mtd_path)) {
6515 LOGE("partition_name_2_dev() failed!");
6516 return -1;
6517 }
6518
6519 fd = open(mtd_path, O_RDONLY);
6520 if (fd < 0) {
6521 LOGE("Fatal error: can't open cust info %s\n", mtd_path);
6522 return -1;
6523 }
6524
6525 if (read(fd, cust_info, flaglen) < 0)
6526 goto error;
6527 if (cust_info->header != CUST_INFO_HEADER) {
6528 LOGE("Cust info partition error.");
6529 goto error;
6530 } else {
6531 if(cust_info->band_type == 1) { // CN
6532 LOGD("Band : CN");
6533 } else if(cust_info->band_type == 2) { // EU
6534 LOGD("Band : EU");
6535 } else {
6536 LOGE("Unknown band type:%d", cust_info->band_type);
6537 goto error;
6538 }
6539 }
6540 close(fd);
6541 return 0;
6542error:
6543 close(fd);
6544 return -1;
6545}
6546
6547/*
liubin281ac462023-07-19 14:22:54 +08006548AT*BAND=15,78,147,482,134742231
6549
6550OK
6551*/
b.liubb5e7682024-02-28 20:13:04 +08006552static void* band_config_thread()
liubin281ac462023-07-19 14:22:54 +08006553{
b.liubb5e7682024-02-28 20:13:04 +08006554 mbtk_device_info_modem_t info_modem;
b.liuf37bd332024-03-18 13:51:24 +08006555 memset(&band_set_info, 0, sizeof(band_set_info_t));
b.liubb5e7682024-02-28 20:13:04 +08006556 memset(&info_modem, 0, sizeof(mbtk_device_info_modem_t));
b.liuf37bd332024-03-18 13:51:24 +08006557 band_set_info.band_set_success = FALSE;
6558 if(mbtk_dev_info_read(MBTK_DEVICE_INFO_ITEM_MODEM, &(info_modem), sizeof(mbtk_device_info_modem_t))) {
b.liubb5e7682024-02-28 20:13:04 +08006559 LOGD("mbtk_dev_info_read(MODEM) fail, use default band.");
b.liuf37bd332024-03-18 13:51:24 +08006560 band_set_info.band_area = MBTK_MODEM_BAND_AREA_ALL;
6561 band_set_info.band_gsm = MBTK_BAND_ALL_GSM_DEFAULT;
6562 band_set_info.band_wcdma = MBTK_BAND_ALL_WCDMA_DEFAULT;
6563 band_set_info.band_tdlte = MBTK_BAND_ALL_TDLTE_DEFAULT;
6564 band_set_info.band_fddlte = MBTK_BAND_ALL_FDDLTE_DEFAULT;
b.liubb5e7682024-02-28 20:13:04 +08006565 } else {
b.liuf37bd332024-03-18 13:51:24 +08006566 band_set_info.band_area = info_modem.band_area;
6567 band_set_info.band_gsm = info_modem.band_gsm;
6568 band_set_info.band_wcdma = info_modem.band_wcdma;
6569 band_set_info.band_tdlte = info_modem.band_tdlte;
6570 band_set_info.band_fddlte = info_modem.band_fddlte;
6571 }
b.liubb5e7682024-02-28 20:13:04 +08006572
b.liuf37bd332024-03-18 13:51:24 +08006573 bool is_first = TRUE;
6574 while(!band_set_info.band_set_success) {
6575 info_urc_msg_t *urc = (info_urc_msg_t*)malloc(sizeof(info_urc_msg_t));
6576 if(!urc)
6577 {
6578 LOG("malloc() fail[%d].", errno);
6579 break;
b.liubb5e7682024-02-28 20:13:04 +08006580 } else {
b.liuf37bd332024-03-18 13:51:24 +08006581 urc->msg = INFO_URC_MSG_SET_BAND;
6582 urc->data = NULL;
6583 urc->data_len = 0;
6584 send_pack_to_queue(NULL, urc);
6585
6586 if(is_first) {
6587 is_first = FALSE;
6588 } else {
6589 LOGE("*BAND exec error, will retry in 3s.");
6590 }
6591 sleep(3);
b.liubb5e7682024-02-28 20:13:04 +08006592 }
6593 }
6594
b.liuf37bd332024-03-18 13:51:24 +08006595 LOGD("Set Band thread exit.");
b.liubb5e7682024-02-28 20:13:04 +08006596 return NULL;
liubin281ac462023-07-19 14:22:54 +08006597}
6598
6599static void* net_monitor_thread(void* arg)
6600{
6601 UNUSED(arg);
6602 // Start network monitor
6603 int cid;
6604 while(1) {
6605#if 0
6606 // Config IP
6607 list_node_t* apn_list = NULL;
6608 if(!apn_state_get(&apn_list) && apn_list != NULL) {
6609 info_apn_ip_t *apn = NULL;
6610 for(cid = MBTK_APN_CID_MIN; cid <= MBTK_APN_CID_MAX && cid_active[cid]; cid++) {
6611 bool ip_found = false;
6612 list_first(apn_list);
6613 while ((apn = (info_apn_ip_t*) list_next(apn_list))) {
6614 if(cid == apn->cid) {
6615 ip_found = true;
6616 break;
6617 }
6618 }
6619
6620 char dev[20] = {0};
6621 sprintf(dev, "ccinet%d", cid - 1);
6622 if(ip_found) { // Ip ok,set IP.
6623 if(apn->ipv4_valid) {
6624 if(mbtk_ifc_configure2(dev, (char*)apn->ipv4, 0, NULL, "255.255.255.0")) {
6625 LOGD("Config %s IPv4 %s fail.", dev, apn->ipv4);
6626 } else {
6627 LOGD("Config %s IPv4 %s success.", dev, apn->ipv4);
6628 }
6629 }
6630
6631 if(apn->ipv6_valid) {
6632 if(mbtk_ipv6_config(dev, (char*)apn->ipv6, 64)) {
6633 LOGD("Config %s IPv6 %s fail.", dev, apn->ipv6);
6634 } else {
6635 LOGD("Config %s IPv6 %s success.", dev, apn->ipv6);
6636 }
6637 }
6638 } else { // No ip
6639 if(mbtk_ifc_configure2(dev, NULL, 0, NULL, NULL)) {
6640 LOGD("Config %s IPv4 0 fail.", dev);
6641 } else {
6642 LOGD("Config %s IPv4 0 success.", dev);
6643 }
6644 }
6645 }
6646
6647 list_free(apn_list);
6648 }
6649#endif
6650
6651 if(net_info.radio_state == MBTK_RADIO_STATE_ON && net_info.sim_state == MBTK_SIM_READY) {
6652#if 0
6653 urc_msg_distribute(true, INFO_URC_MSG_NET_CS_REG_STATE, NULL, 0);
6654#else
6655 info_urc_msg_t *urc = (info_urc_msg_t*)malloc(sizeof(info_urc_msg_t));
6656 if(!urc)
6657 {
6658 LOG("malloc() fail[%d].", errno);
6659 } else {
6660 urc->msg = INFO_URC_MSG_NET_STATE_LOG;
6661 urc->data = NULL;
6662 urc->data_len = 0;
6663 send_pack_to_queue(NULL, urc);
6664 }
6665#endif
wangyouqiangce45a102024-04-18 18:08:29 +08006666 sleep(15);
liubin281ac462023-07-19 14:22:54 +08006667 }
wangyouqiangce45a102024-04-18 18:08:29 +08006668 else
6669 {
6670 info_urc_msg_t *urc = (info_urc_msg_t*)malloc(sizeof(info_urc_msg_t));
6671 if(!urc)
6672 {
6673 LOG("malloc() fail[%d].", errno);
6674 }
6675 else
6676 {
6677 urc->msg = INFO_URC_MSG_GET_SIM_STATE;
6678 urc->data = NULL;
6679 urc->data_len = 0;
6680 send_pack_to_queue(NULL, urc);
6681 }
6682 sleep(2);
6683 }
liubin281ac462023-07-19 14:22:54 +08006684 }
6685
6686 LOGD("monitor_thread exit.");
6687 return NULL;
6688}
6689
6690static void* urc_process_thread(void* arg)
6691{
6692 UNUSED(arg);
6693 info_urc_msg_t* item = NULL;
6694 mbtk_queue_init(&urc_queue);
6695 pthread_mutex_init(&urc_mutex, NULL);
6696 pthread_cond_init(&urc_cond, NULL);
6697
6698 pthread_mutex_lock(&urc_mutex);
6699 while(TRUE)
6700 {
6701 if(mbtk_queue_empty(&urc_queue))
6702 {
6703 LOG("URC process wait...");
6704 pthread_cond_wait(&urc_cond, &urc_mutex);
6705 LOG("URC process continue...");
6706 }
6707 else
6708 {
6709 LOG("URC process queue not empty,continue...");
6710 }
6711
6712 // Process all information request.
6713 while((item = (info_urc_msg_t*)mbtk_queue_get(&urc_queue)) != NULL)
6714 {
6715 LOG("Process URC %d.", item->msg);
6716 uint8 *data = (uint8*)item->data;
6717 switch(item->msg) {
6718 case INFO_URC_MSG_RADIO_STATE:
6719 {
6720 radio_state_change(item->data, item->data_len);
6721 break;
6722 }
6723 case INFO_URC_MSG_CGEV:
6724 {
6725 bool act = data[0];
6726 int cid = data[1];
6727 if(cid > 0) {
6728 net_ifc_state_change(act, cid);
6729 }
6730 break;
6731 }
6732 default:
6733 {
6734 LOGE("Unknown URC : %d", item->msg);
6735 break;
6736 }
6737 }
6738 if(!item->data)
6739 free(item->data);
6740 free(item);
6741 }
6742 }
6743 pthread_mutex_unlock(&urc_mutex);
6744
6745 return NULL;
6746}
6747
6748static void ril_at_ready_process()
6749{
6750 net_info.radio_state = (isRadioOn() == 1) ? MBTK_RADIO_STATE_ON : MBTK_RADIO_STATE_OFF;
6751#if 1
6752 if (net_info.radio_state != MBTK_RADIO_STATE_ON)
6753 {
6754 setRadioPower(1);
6755 } else { // Radio has ON
6756 apn_prop_get();
6757 }
6758
6759 if(net_info.radio_state == MBTK_RADIO_STATE_ON)
6760 {
6761 at_send_command("AT+CEREG=2", NULL);
6762 }
6763
6764 int count = 0;
6765#endif
6766 net_info.sim_state = getSIMStatus();
6767#if 0
6768 while (net_info.sim_state != MBTK_SIM_READY && count < 30)
6769 {
6770 if(net_info.radio_state != MBTK_RADIO_STATE_ON)
6771 {
6772 setRadioPower(1);
6773 }
6774 LOGD("Waitting for SIM READY...");
6775 sleep(1);
6776 net_info.sim_state = getSIMStatus();
6777 count++;
6778 }
6779#endif
6780 if(net_info.sim_state == MBTK_SIM_READY)
6781 {
6782 LOGD("SIM READY!");
6783 }
6784 else
6785 {
6786 LOGE("SIM NOT READY!");
6787 }
liubin281ac462023-07-19 14:22:54 +08006788}
6789
6790int mbtk_info_server_start()
6791{
6792 signal(SIGPIPE, SIG_IGN);
6793
wangyouqiangce45a102024-04-18 18:08:29 +08006794 //check cfun and sim card status
6795 ril_at_ready_process();
6796
6797 //any AT instruction that is not sent through pack_process_thread needs to precede the thread
6798 //thread create
liubin281ac462023-07-19 14:22:54 +08006799 if(sock_listen_fd > 0)
6800 {
6801 LOG("Information Server Has Started.");
6802 return -1;
6803 }
6804
6805 struct sockaddr_un server_addr;
6806 sock_listen_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
6807 if(sock_listen_fd < 0)
6808 {
6809 LOG("socket() fail[%d].", errno);
6810 return -1;
6811 }
6812
6813 // Set O_NONBLOCK
6814 int flags = fcntl(sock_listen_fd, F_GETFL, 0);
6815 if (flags < 0)
6816 {
6817 LOG("Get flags error:%d", errno);
6818 goto error;
6819 }
6820 flags |= O_NONBLOCK;
6821 if (fcntl(sock_listen_fd, F_SETFL, flags) < 0)
6822 {
6823 LOG("Set flags error:%d", errno);
6824 goto error;
6825 }
6826
6827 unlink(SOCK_INFO_PATH);
6828 memset(&server_addr, 0, sizeof(struct sockaddr_un));
6829 server_addr.sun_family = AF_LOCAL;
6830 strcpy(server_addr.sun_path, SOCK_INFO_PATH);
6831 if(bind(sock_listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)))
6832 {
6833 LOG("bind() fail[%d].", errno);
6834 goto error;
6835 }
6836
6837 if(listen(sock_listen_fd, SOCK_CLIENT_MAX))
6838 {
6839 LOG("listen() fail[%d].", errno);
6840 goto error;
6841 }
6842
6843 sock_client_list = list_create(sock_cli_free_func);
6844 if(sock_client_list == NULL)
6845 {
6846 LOG("list_create() fail.");
6847 goto error;
6848 }
6849
6850 pthread_t info_pid, pack_pid, monitor_pid, urc_pid, bootconn_pid;
6851 pthread_attr_t thread_attr;
6852 pthread_attr_init(&thread_attr);
6853 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
6854 {
6855 LOG("pthread_attr_setdetachstate() fail.");
6856 goto error;
6857 }
6858
6859 if(pthread_create(&info_pid, &thread_attr, info_main_pthread, NULL))
6860 {
6861 LOG("pthread_create() fail.");
6862 goto error;
6863 }
6864
6865 if(pthread_create(&pack_pid, &thread_attr, pack_process_thread, NULL))
6866 {
6867 LOG("pthread_create() fail.");
6868 goto error;
6869 }
6870
6871#if 0
6872 if(pthread_create(&urc_pid, &thread_attr, urc_process_thread, NULL))
6873 {
6874 LOG("pthread_create() fail.");
6875 goto error;
6876 }
6877#endif
6878
b.liubb5e7682024-02-28 20:13:04 +08006879 // Set Band
6880 // AT*BAND=15,78,147,482,134742231
6881 char buff[10];
6882 memset(buff, 0, 10);
6883 property_get("persist.mbtk.band_config", buff, "");
6884 if(strlen(buff) == 0) {
6885 pthread_t band_pid;
6886 if(pthread_create(&band_pid, &thread_attr, band_config_thread, NULL))
6887 {
6888 LOG("pthread_create() fail.");
6889 }
6890 }
6891
liubin281ac462023-07-19 14:22:54 +08006892 if(pthread_create(&monitor_pid, &thread_attr, net_monitor_thread, NULL))
6893 {
6894 LOG("pthread_create() fail.");
6895 }
6896
6897 //mbtk wyq for data_call_ex add start
6898 if(pthread_create(&bootconn_pid, &thread_attr, data_call_bootconn_pthread, NULL))
6899 {
6900 LOG("pthread_create() fail.");
6901 }
6902 //mbtk wyq for data_call_ex add end
6903
6904 pthread_attr_destroy(&thread_attr);
6905
6906 LOG("MBTK Information Server Start...");
6907
6908 return 0;
6909
6910error:
6911 close(sock_listen_fd);
6912 sock_listen_fd = -1;
6913 return -1;
6914}
6915
6916#if 0
6917int main(int argc, char *argv[])
6918{
6919 if(mbtk_info_server_start())
6920 {
6921 return -1;
6922 }
6923
6924 while(1)
6925 {
6926 sleep(24 * 60 * 60);
6927 }
6928
6929 return 0;
6930}
6931#endif
6932
6933