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