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