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