blob: 89090bebe7e396c7ecad1ac272fa9bc349457dda [file] [log] [blame]
b.liu87afc4c2024-08-14 17:33:45 +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#include <arpa/inet.h>
14
15#include "mbtk_type.h"
16#include "mbtk_ril.h"
17#include "atchannel.h"
18#include "at_tok.h"
19#include "mbtk_utils.h"
20#include "ril_info.h"
21#include "mbtk_str.h"
22
b.liub4772072024-08-15 14:47:03 +080023mbtk_cell_pack_info_t cell_info;
24
b.liu87afc4c2024-08-14 17:33:45 +080025extern ril_band_info_t band_info;
b.liub171c9a2024-11-12 19:23:29 +080026void ril_rsp_pack_send(ATPortType_enum port, int fd, int ril_id, int msg_index, const void* data, int data_len);
b.liu87afc4c2024-08-14 17:33:45 +080027
28/*
29AT+COPS=?
30
31+COPS: (2, "CHN-CT", "CT", "46011", 7),(3, "CHN-UNICOM", "UNICOM", "46001", 7),(3, "CHINA MOBILE", "CMCC", "46000", 0),(3, "CHINA MOBILE", "CMCC", "46000", 7),(3, "China Broadnet", "CBN", "46015", 7),,(0,1,2,3,4),(0,1,2)
32
33OK
34*/
b.liub171c9a2024-11-12 19:23:29 +080035static int req_available_net_get(ATPortType_enum port, mbtk_net_info_array_t* nets, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +080036{
37 ATResponse *response = NULL;
b.liub171c9a2024-11-12 19:23:29 +080038 int err = at_send_command_singleline(port, "AT+COPS=?", "+COPS:", &response);
b.liu87afc4c2024-08-14 17:33:45 +080039
40 if (err < 0 || response->success == 0 || !response->p_intermediates){
41 if(cme_err) {
42 *cme_err = at_get_cme_error(response);
43 }
44 goto exit;
45 }
46 char *line_ptr = response->p_intermediates->line;
47 if(line_ptr == NULL) {
48 LOG("line is NULL");
49 err = -1;
50 goto exit;
51 }
52 //LOG("Line:%s",line_ptr);
53 line_ptr = strstr(line_ptr, "(");
54 while(line_ptr) {
55 line_ptr++;
56 // Only for available/current net.
57 if(*line_ptr == '1' || *line_ptr == '2' || *line_ptr == '3') {
58 nets->net_info[nets->num].net_state = (uint8)atoi(line_ptr); // net_state
59
60 line_ptr = strstr(line_ptr, ",");
61 if(line_ptr == NULL) {
62 err = -1;
63 goto exit;
64 }
65 line_ptr++;
66
67 line_ptr = strstr(line_ptr, ",");
68 if(line_ptr == NULL) {
69 err = -1;
70 goto exit;
71 }
72 line_ptr++;
73
74 line_ptr = strstr(line_ptr, ",");
75 if(line_ptr == NULL) {
76 err = -1;
77 goto exit;
78 }
79
80 while(*line_ptr != '\0' && (*line_ptr == ',' || *line_ptr == ' ' || *line_ptr == '"'))
81 line_ptr++;
82
83 // set sel_mode to 0
84 nets->net_info[nets->num].net_sel_mode = (uint8)0;
85 // Point to "46000"
86 //LOG("PLMN:%s",line_ptr);
87 //sleep(1);
88 //uint32_2_byte((uint32)atoi(line_ptr), buff_ptr + 3, false); // plmn
89 nets->net_info[nets->num].plmn = (uint32)atoi(line_ptr);
90
91 line_ptr = strstr(line_ptr, ",");
92 if(line_ptr == NULL) {
93 err = -1;
94 goto exit;
95 }
96
97 while(*line_ptr != '\0' && (*line_ptr == ',' || *line_ptr == ' '))
98 line_ptr++;
99
100 // Point to "7"
101 if(*line_ptr == '\0') {
102 err = -1;
103 goto exit;
104 }
105 //LOG("Type:%s",line_ptr);
106 //sleep(1);
107 nets->net_info[nets->num].net_type = (uint8)atoi(line_ptr); // net_type
108
109 nets->num++;
110 }
111
112 line_ptr = strstr(line_ptr, "(");
113 }
114exit:
115 at_response_free(response);
116 return err;
117}
118
119/*
120AT+COPS?
121+COPS: 1
122
123OK
124
125or
126
127AT+COPS?
128+COPS: 0,2,"46001",7
129
130OK
131
132*/
b.liub171c9a2024-11-12 19:23:29 +0800133static int req_net_sel_mode_get(ATPortType_enum port, mbtk_net_info_t *net, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800134{
135 //LOG("req_net_sel_mode_get() 0");
136 //sleep(1);
137 ATResponse *response = NULL;
138 int tmp_int;
139 char *tmp_ptr = NULL;
b.liub171c9a2024-11-12 19:23:29 +0800140 int err = at_send_command_singleline(port, "AT+COPS?", "+COPS:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800141 //LOG("req_net_sel_mode_get() 00");
142 //sleep(1);
143 if (err < 0 || response->success == 0 || !response->p_intermediates){
144 if(cme_err != NULL)
145 *cme_err = at_get_cme_error(response);
146 err = -1;
147 goto exit;
148 }
149 //LOG("req_net_sel_mode_get() 1");
150 //sleep(1);
151 char *line = response->p_intermediates->line;
152 if(line == NULL) {
153 LOG("line is NULL");
154 goto exit;
155 }
156 //LOG("req_net_sel_mode_get() 2");
157 //sleep(1);
158 err = at_tok_start(&line);
159 if (err < 0)
160 {
161 goto exit;
162 }
163 //LOG("req_net_sel_mode_get() 3");
164 //sleep(1);
165 err = at_tok_nextint(&line, &tmp_int);
166 if (err < 0)
167 {
168 goto exit;
169 }
170 net->net_sel_mode = (uint8)tmp_int;
171 //LOG("req_net_sel_mode_get() 4");
172 //sleep(1);
173 // +COPS: 1
174 if(!at_tok_hasmore(&line)) {
175 goto exit;
176 }
177 //LOG("req_net_sel_mode_get() 5");
178 //sleep(1);
179 err = at_tok_nextint(&line, &tmp_int);
180 if (err < 0)
181 {
182 goto exit;
183 }
184 //LOG("req_net_sel_mode_get() 6");
185 //sleep(1);
186 err = at_tok_nextstr(&line, &tmp_ptr);
187 if (err < 0)
188 {
189 goto exit;
190 }
191 // memcpy(net->plmn, tmp_ptr, strlen(tmp_ptr));
192 net->plmn = (uint32)atoi(tmp_ptr);
193 //LOG("req_net_sel_mode_get() 7");
194 //sleep(1);
195 err = at_tok_nextint(&line, &tmp_int);
196 if (err < 0)
197 {
198 goto exit;
199 }
200 net->net_type = (uint8)tmp_int;
201
202 net->net_state = (uint8)MBTK_NET_AVIL_STATE_CURRENT;
203
204exit:
205 //LOG("req_net_sel_mode_get() 8");
206 //sleep(1);
207 at_response_free(response);
208 return err;
209}
210
211/*
212AT+COPS=0
213or
214AT+COPS=1,2,"46000",7
215
216OK
217
218*/
b.liub171c9a2024-11-12 19:23:29 +0800219static int req_net_sel_mode_set(ATPortType_enum port, mbtk_net_info_t* net, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800220{
221 ATResponse *response = NULL;
222 char cmd[50] = {0};
223 char* cmp_ptr = cmd;
224 if(net == NULL) {
225 cmp_ptr += sprintf(cmp_ptr, "AT+COPS=0");
226 } else {
227 if(net->net_sel_mode == 0) {
228 cmp_ptr += sprintf(cmp_ptr, "AT+COPS=0");
229 } else if(net->net_type == 0xFF) {
230 cmp_ptr += sprintf(cmp_ptr, "AT+COPS=1,2,\"%d\"",net->plmn);
231 } else {
232 cmp_ptr += sprintf(cmp_ptr, "AT+COPS=1,2,\"%d\",%d",net->plmn, net->net_type);
233 }
234 }
235
b.liub171c9a2024-11-12 19:23:29 +0800236 int err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800237
238 if (err < 0 || response->success == 0) {
239 if(cme_err) {
240 *cme_err = at_get_cme_error(response);
241 }
242 goto exit;
243 }
244
245exit:
246 at_response_free(response);
247 return err;
248}
249
250/*
251AT*BAND=15
252OK
253
254*/
b.liu472cfaf2024-12-19 19:08:19 +0800255int req_band_set(ATPortType_enum port, mbtk_band_info_t* band, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800256{
257 ATResponse *response = NULL;
258 char cmd[100] = {0};
259 int err = -1;
260
261 if(band->gsm_band == 0 && band->umts_band == 0
b.liu61ad9172025-01-09 14:33:55 +0800262 && band->tdlte_band == 0 && band->fddlte_band == 0 && band->lte_ext_band == 0
263 && band->nr_3_band == 0 && band->nr_2_band == 0
b.liubea31eb2025-01-09 15:17:12 +0800264 && band->nr_1_band == 0 && band->nr_0_band == 0
b.liubea31eb2025-01-09 15:17:12 +0800265 ) {
b.liu87afc4c2024-08-14 17:33:45 +0800266 sprintf(cmd, "AT*BAND=%d", band->net_pref);
267 } else {
268 log_hex("BAND_SUPPORT", &band_info.band_support, sizeof(mbtk_band_info_t));
269 log_hex("BAND", band, sizeof(mbtk_band_info_t));
270
b.liude989912025-02-12 14:40:42 +0800271 if(band->gsm_band == 0 && (band_info.net_support & MBTK_NET_SUPPORT_2G)) {
b.liu87afc4c2024-08-14 17:33:45 +0800272 band->gsm_band = band_info.band_support.gsm_band;
273 }
b.liude989912025-02-12 14:40:42 +0800274 if(band->umts_band == 0 && (band_info.net_support & MBTK_NET_SUPPORT_3G)) {
b.liu87afc4c2024-08-14 17:33:45 +0800275 band->umts_band = band_info.band_support.umts_band;
276 }
b.liude989912025-02-12 14:40:42 +0800277
278 if(band_info.net_support & MBTK_NET_SUPPORT_4G) {
279 if(band->tdlte_band == 0) {
280 band->tdlte_band = band_info.band_support.tdlte_band;
281 }
282 if(band->fddlte_band == 0) {
283 band->fddlte_band = band_info.band_support.fddlte_band;
284 }
285 if(band->lte_ext_band == 0) {
286 band->lte_ext_band = band_info.band_support.lte_ext_band;
287 }
b.liu87afc4c2024-08-14 17:33:45 +0800288 }
b.liude989912025-02-12 14:40:42 +0800289
290 if(band_info.net_support & MBTK_NET_SUPPORT_5G) {
291 if(band->nr_3_band == 0) {
292 band->nr_3_band = band_info.band_support.nr_3_band;
293 }
294 if(band->nr_2_band == 0) {
295 band->nr_2_band = band_info.band_support.nr_2_band;
296 }
297 if(band->nr_1_band == 0) {
298 band->nr_1_band = band_info.band_support.nr_1_band;
299 }
300 if(band->nr_0_band == 0) {
301 band->nr_0_band = band_info.band_support.nr_0_band;
302 }
b.liu87afc4c2024-08-14 17:33:45 +0800303 }
b.liude989912025-02-12 14:40:42 +0800304
b.liu87afc4c2024-08-14 17:33:45 +0800305 if((band->gsm_band & band_info.band_support.gsm_band) != band->gsm_band) {
306 LOG("GSM band error.");
307 goto exit;
308 }
309
310 if((band->umts_band & band_info.band_support.umts_band) != band->umts_band) {
311 LOG("UMTS band error.");
312 goto exit;
313 }
314
315 if((band->tdlte_band & band_info.band_support.tdlte_band) != band->tdlte_band) {
316 LOG("TDLTE band error.");
317 goto exit;
318 }
319
320 if((band->fddlte_band & band_info.band_support.fddlte_band) != band->fddlte_band) {
321 LOG("FDDLTE band error.");
322 goto exit;
323 }
324
325 if((band->lte_ext_band & band_info.band_support.lte_ext_band) != band->lte_ext_band) {
326 LOG("EXT_LTE band error.");
327 goto exit;
328 }
b.liu61ad9172025-01-09 14:33:55 +0800329 if((band->nr_3_band & band_info.band_support.nr_3_band) != band->nr_3_band) {
330 LOG("nr_3_band band error.");
331 goto exit;
332 }
333
334 if((band->nr_2_band & band_info.band_support.nr_2_band) != band->nr_2_band) {
335 LOG("nr_2_band band error.");
336 goto exit;
337 }
338
339 if((band->nr_1_band & band_info.band_support.nr_1_band) != band->nr_1_band) {
340 LOG("nr_1_band band error.");
341 goto exit;
342 }
343
344 if((band->nr_0_band & band_info.band_support.nr_0_band) != band->nr_0_band) {
345 LOG("nr_0_band band error.");
346 goto exit;
347 }
b.liu87afc4c2024-08-14 17:33:45 +0800348 if(band->net_pref == 0xFF) { // No change net_pref.
349 int tmp_int;
b.liub171c9a2024-11-12 19:23:29 +0800350 err = at_send_command_singleline(port, "AT*BAND?", "*BAND:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800351 if (err < 0 || response->success == 0 || !response->p_intermediates){
352 if(cme_err) {
353 *cme_err = at_get_cme_error(response);
354 }
355 goto exit;
356 }
357
358 char *line = response->p_intermediates->line;
359 err = at_tok_start(&line);
360 if (err < 0)
361 {
362 goto exit;
363 }
364
365 err = at_tok_nextint(&line, &tmp_int);
366 if (err < 0)
367 {
368 goto exit;
369 }
370 band->net_pref = (uint8)tmp_int; // Set to current net_pref.
371
372 at_response_free(response);
373 }
b.liu61ad9172025-01-09 14:33:55 +0800374 // Only support 4G/5G
375 if(band_info.net_support & MBTK_NET_SUPPORT_5G) {
376 // AT*band=19,0,0,482,134742231,0,24576,256,134217877,0
377 if(band->lte_ext_band > 0) {
378 sprintf(cmd, "AT*BAND=%d,%d,%d,%d,%d,%d,%d,%d,%d,0,,,,%d", band->net_pref, band->gsm_band, band->umts_band, band->tdlte_band, band->fddlte_band,
379 band->nr_3_band, band->nr_2_band, band->nr_1_band, band->nr_0_band, band->lte_ext_band);
380 } else {
381 sprintf(cmd, "AT*BAND=%d,%d,%d,%d,%d,%d,%d,%d,%d,0", band->net_pref, band->gsm_band, band->umts_band, band->tdlte_band, band->fddlte_band,
382 band->nr_3_band, band->nr_2_band, band->nr_1_band, band->nr_0_band);
383 }
b.liu87afc4c2024-08-14 17:33:45 +0800384 } else {
b.liu61ad9172025-01-09 14:33:55 +0800385 if(band->lte_ext_band > 0) {
386 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);
387 } else {
388 sprintf(cmd, "AT*BAND=%d,%d,%d,%d,%d", band->net_pref, band->gsm_band, band->umts_band, band->tdlte_band, band->fddlte_band);
389 }
b.liu87afc4c2024-08-14 17:33:45 +0800390 }
391 }
b.liub171c9a2024-11-12 19:23:29 +0800392 err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800393
394 if (err < 0 || response->success == 0){
395 if(cme_err) {
396 *cme_err = at_get_cme_error(response);
397 }
398 goto exit;
399 }
400
401 err = 0;
402exit:
403 at_response_free(response);
404 return err;
405}
406
407/*
408// ???????
409AT*BAND=?
410*BAND:(0-18),79,147,482,524503
411
412OK
413
414// ???????????
415AT*BAND?
416*BAND: 15, 78, 147, 482, 524503, 0, 2, 2, 0, 0
417
418OK
419
b.liu61ad9172025-01-09 14:33:55 +08004205G :
421*BAND: 19, 0, 0, 482, 149,0, 24576, 256, 134217877, 0, 0, 2, 2, 0
422
423
b.liu87afc4c2024-08-14 17:33:45 +0800424// ?????????
425AT*BAND=5,79,147,128,1
426OK
427
428net_prefferred??
429 0 : GSM only
430 1 : UMTS only
431 2 : GSM/UMTS(auto)
432 3 : GSM/UMTS(GSM preferred)
433 4 : GSM/UMTS(UMTS preferred)
434 5 : LTE only
435 6 : GSM/LTE(auto)
436 7 : GSM/LTE(GSM preferred)
437 8 : GSM/LTE(LTE preferred)
438 9 : UMTS/LTE(auto)
439 10 : UMTS/LTE(UMTS preferred)
440 11 : UMTS/LTE(LTE preferred)
441 12 : GSM/UMTS/LTE(auto)
442 13 : GSM/UMTS/LTE(GSM preferred)
443 14 : GSM/UMTS/LTE(UMTS preferred)
444 15 : GSM/UMTS/LTE(LTE preferred)
445GSM band??
446 1 ?C PGSM 900 (standard or primary)
447 2 ?C DCS GSM 1800
448 4 ?C PCS GSM 1900
449 8 ?C EGSM 900 (extended)
450 16 ?C GSM 450
451 32 ?C GSM 480
452 64 ?C GSM 850
453 512 - BAND_LOCK_BIT // used for GSM band setting
454UMTS band??
455 1 ?C UMTS_BAND_1
456 2 ?C UMTS_BAND_2
457 4 ?C UMTS_BAND_3
458 8 ?C UMTS_BAND_4
459 16 ?C UMTS_BAND_5
460 32 ?C UMTS_BAND_6
461 64 ?C UMTS_BAND_7
462 128 ?C UMTS_BAND_8
463 256 ?C UMTS_BAND_9
464LTEbandH(TDD-LTE band)
465 32 ?C TDLTE_BAND_38
466 64 ?C TDLTE_BAND_39
467 128 ?C TDLTE_BAND_40
468 256 ?C TDLTE_BAND_41
469LTEbandL(FDD-LTE band)
470 1 ?C FDDLTE_BAND_1
471 4 ?C FDDLTE _BAND_3
472 8 ?C FDDLTE _BAND_4
473 64 ?C FDDLTE _BAND_7
474 65536 ?C FDDLTE _BAND_17
475 524288 ?C FDDLTE _BAND_20
476*/
b.liub171c9a2024-11-12 19:23:29 +0800477static int req_band_get(ATPortType_enum port, mbtk_band_info_t *band, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800478{
479 ATResponse *response = NULL;
480 int tmp_int;
481
482 log_hex("BAND_SUPPORT", &band_info.band_support, sizeof(mbtk_band_info_t));
b.liub171c9a2024-11-12 19:23:29 +0800483 int err = at_send_command_singleline(port, "AT*BAND?", "*BAND:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800484 if (err < 0 || response->success == 0 || !response->p_intermediates){
485 if(cme_err) {
486 *cme_err = at_get_cme_error(response);
487 }
488 goto exit;
489 }
490
491 char *line = response->p_intermediates->line;
492 err = at_tok_start(&line);
493 if (err < 0)
494 {
495 goto exit;
496 }
497
498 err = at_tok_nextint(&line, &tmp_int);
499 if (err < 0)
500 {
501 goto exit;
502 }
503 band->net_pref = (uint8)tmp_int;
504
505 err = at_tok_nextint(&line, &tmp_int);
506 if (err < 0)
507 {
508 goto exit;
509 }
510 band->gsm_band = (uint16)tmp_int;
511
512 err = at_tok_nextint(&line, &tmp_int);
513 if (err < 0)
514 {
515 goto exit;
516 }
517 band->umts_band = (uint16)tmp_int;
518
519 err = at_tok_nextint(&line, &tmp_int);
520 if (err < 0)
521 {
522 goto exit;
523 }
524 band->tdlte_band = (uint32)tmp_int;
525
526 err = at_tok_nextint(&line, &tmp_int);
527 if (err < 0)
528 {
529 goto exit;
530 }
531 band->fddlte_band = (uint32)tmp_int;
532
b.liuf2ea8bf2025-01-09 15:07:34 +0800533 if(band_info.net_support & MBTK_NET_SUPPORT_5G)
534 {
b.liu61ad9172025-01-09 14:33:55 +0800535 err = at_tok_nextint(&line, &tmp_int);
536 if (err < 0)
537 {
538 goto exit;
539 }
540 band->nr_3_band = (uint32)tmp_int;
541
542 err = at_tok_nextint(&line, &tmp_int);
543 if (err < 0)
544 {
545 goto exit;
546 }
547 band->nr_2_band = (uint32)tmp_int;
548
549 err = at_tok_nextint(&line, &tmp_int);
550 if (err < 0)
551 {
552 goto exit;
553 }
554 band->nr_1_band = (uint32)tmp_int;
555
556 err = at_tok_nextint(&line, &tmp_int);
557 if (err < 0)
558 {
559 goto exit;
560 }
561 band->nr_0_band = (uint32)tmp_int;
562 }
563
b.liu87afc4c2024-08-14 17:33:45 +0800564 // roamingConfig
565 err = at_tok_nextint(&line, &tmp_int);
566 if (err < 0)
567 {
568 goto exit;
569 }
570
571 // srvDomain
572 err = at_tok_nextint(&line, &tmp_int);
573 if (err < 0)
574 {
575 goto exit;
576 }
577
578 // bandPriorityFlag
579 err = at_tok_nextint(&line, &tmp_int);
580 if (err < 0)
581 {
582 goto exit;
583 }
584
585 //
586 err = at_tok_nextint(&line, &tmp_int);
587 if (err < 0)
588 {
589 goto exit;
590 }
591
592 // ltebandExt
593 err = at_tok_nextint(&line, &tmp_int);
594 if (err < 0)
595 {
596 goto exit;
597 }
598 band->lte_ext_band = (uint32)tmp_int;
599
600 log_hex("BAND", band, sizeof(mbtk_band_info_t));
601
602exit:
603 at_response_free(response);
604 return err;
605}
606
607/*
608AT+CSQ
609+CSQ: 31,99
610
611OK
612
613AT+CESQ
614+CESQ: 60,99,255,255,20,61
615
616OK
617
618AT+COPS?
619+COPS: 0,2,"46001",7
620
621OK
622
623*/
b.liub171c9a2024-11-12 19:23:29 +0800624static int req_net_signal_get(ATPortType_enum port, mbtk_signal_info_t *signal, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800625{
626 ATResponse *response = NULL;
627 int tmp_int;
628 char *tmp_ptr = NULL;
629 // AT+EEMOPT=1 in the first.
b.liub171c9a2024-11-12 19:23:29 +0800630 int err = at_send_command_singleline(port, "AT+CSQ", "+CSQ:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800631 if (err < 0 || response->success == 0 || !response->p_intermediates){
632 if(cme_err != NULL)
633 *cme_err = at_get_cme_error(response);
634 err = -1;
635 goto exit;
636 }
637
638 char *line = response->p_intermediates->line;
639 err = at_tok_start(&line);
640 if (err < 0)
641 {
642 goto exit;
643 }
644 err = at_tok_nextint(&line, &tmp_int);
645 if (err < 0)
646 {
647 goto exit;
648 }
649 signal->rssi = (uint8)tmp_int;
650 at_response_free(response);
651
b.liub171c9a2024-11-12 19:23:29 +0800652 err = at_send_command_singleline(port, "AT+CESQ", "+CESQ:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800653 if (err < 0 || response->success == 0 || !response->p_intermediates){
654 if(cme_err != NULL)
655 *cme_err = at_get_cme_error(response);
656 err = -1;
657 goto exit;
658 }
659
660 line = response->p_intermediates->line;
661 err = at_tok_start(&line);
662 if (err < 0)
663 {
664 goto exit;
665 }
666 err = at_tok_nextint(&line, &tmp_int);
667 if (err < 0)
668 {
669 goto exit;
670 }
671 signal->rxlev = (uint8)tmp_int;
672
673 err = at_tok_nextint(&line, &tmp_int);
674 if (err < 0)
675 {
676 goto exit;
677 }
678 signal->ber = (uint8)tmp_int;
679
680 err = at_tok_nextint(&line, &tmp_int);
681 if (err < 0)
682 {
683 goto exit;
684 }
685 signal->rscp = (uint8)tmp_int;
686
687 err = at_tok_nextint(&line, &tmp_int);
688 if (err < 0)
689 {
690 goto exit;
691 }
692 signal->ecno = (uint8)tmp_int;
693
694 err = at_tok_nextint(&line, &tmp_int);
695 if (err < 0)
696 {
697 goto exit;
698 }
699 signal->rsrq = (uint8)tmp_int;
700
701 err = at_tok_nextint(&line, &tmp_int);
702 if (err < 0)
703 {
704 goto exit;
705 }
706 signal->rsrp = (uint8)tmp_int;
707
b.liude989912025-02-12 14:40:42 +0800708 if(at_tok_hasmore(&line)) {
709 err = at_tok_nextint(&line, &tmp_int);
710 if (err < 0)
711 {
712 goto exit;
713 }
714 signal->ss_rsrq = (uint8)tmp_int;
715 }
716 if(at_tok_hasmore(&line)) {
717 err = at_tok_nextint(&line, &tmp_int);
718 if (err < 0)
719 {
720 goto exit;
721 }
722 signal->ss_rsrp = (uint8)tmp_int;
723 }
724 if(at_tok_hasmore(&line)) {
725 err = at_tok_nextint(&line, &tmp_int);
726 if (err < 0)
727 {
728 goto exit;
729 }
730 signal->ss_sinr = (uint8)tmp_int;
731 }
732
b.liu87afc4c2024-08-14 17:33:45 +0800733 at_response_free(response);
b.liub171c9a2024-11-12 19:23:29 +0800734 err = at_send_command_singleline(port, "AT+COPS?", "+COPS:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800735 if (err < 0 || response->success == 0 || !response->p_intermediates){
736 if(cme_err != NULL)
737 *cme_err = at_get_cme_error(response);
738 err = -1;
739 goto exit;
740 }
741 line = response->p_intermediates->line;
742 err = at_tok_start(&line);
743 if (err < 0)
744 {
745 goto exit;
746 }
747 err = at_tok_nextint(&line, &tmp_int);
748 if (err < 0)
749 {
750 goto exit;
751 }
752 if(!at_tok_hasmore(&line)) {
753 goto exit;
754 }
755 err = at_tok_nextint(&line, &tmp_int);
756 if (err < 0)
757 {
758 goto exit;
759 }
760 err = at_tok_nextstr(&line, &tmp_ptr);
761 if (err < 0)
762 {
763 goto exit;
764 }
765 err = at_tok_nextint(&line, &tmp_int);
766 if (err < 0)
767 {
768 goto exit;
769 }
770 signal->type = (uint8)tmp_int;
771
772exit:
773 at_response_free(response);
774 return err;
775}
776
777/*
778AT+CREG=3
779OK
780
781AT+CREG?
782+CREG: 3,1,"8330","06447340",7
783
784OK
785
786AT+CREG?
787+CREG: 3,0
788
789OK
790
791AT+CEREG?
792+CEREG: 3,1,"8330","06447340",7
793
794OK
795
796
797AT+CIREG?
798+CIREG: 2,1,15
799
800OK
801
802AT+CIREG?
803+CIREG: 0
804
805OK
806
807
808*/
b.liub171c9a2024-11-12 19:23:29 +0800809static int req_net_reg_get(ATPortType_enum port, mbtk_net_reg_info_t *reg, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800810{
811 ATResponse *response = NULL;
812 int tmp_int;
813 char *tmp_str = NULL;
b.liub171c9a2024-11-12 19:23:29 +0800814 int err = at_send_command(port, "AT+CREG=3", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800815 if (err < 0 || response->success == 0){
816 if(cme_err) {
817 *cme_err = at_get_cme_error(response);
818 }
819 goto exit;
820 }
821 at_response_free(response);
822
b.liub171c9a2024-11-12 19:23:29 +0800823 err = at_send_command_multiline(port, "AT+CREG?", "+CREG:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800824 if (err < 0 || response->success == 0 || !response->p_intermediates){
825 if(cme_err) {
826 *cme_err = at_get_cme_error(response);
827 }
828 goto exit;
829 }
830
831 char *line = response->p_intermediates->line;
832 err = at_tok_start(&line);
833 if (err < 0)
834 {
835 goto exit;
836 }
837 err = at_tok_nextint(&line, &tmp_int); // n
838 if (err < 0)
839 {
840 goto exit;
841 }
842 err = at_tok_nextint(&line, &tmp_int);// stat
843 if (err < 0)
844 {
845 goto exit;
846 }
847 reg->call_state = (uint8)tmp_int;
848
849 if(at_tok_hasmore(&line)) {
850 err = at_tok_nextstr(&line, &tmp_str); // lac
851 if (err < 0)
852 {
853 goto exit;
854 }
855 reg->lac = strtol(tmp_str, NULL, 16);
856
857 err = at_tok_nextstr(&line, &tmp_str); // ci
858 if (err < 0)
859 {
860 goto exit;
861 }
862 reg->ci = strtol(tmp_str, NULL, 16);
863
864 err = at_tok_nextint(&line, &tmp_int);// AcT
865 if (err < 0)
866 {
867 goto exit;
868 }
869 reg->type = (uint8)tmp_int;
870 }
871 at_response_free(response);
872
b.liub171c9a2024-11-12 19:23:29 +0800873 err = at_send_command_multiline(port, "AT+CEREG?", "+CEREG:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800874 if (err < 0 || response->success == 0 || !response->p_intermediates){
875 if(cme_err) {
876 *cme_err = at_get_cme_error(response);
877 }
878 goto exit;
879 }
880
881 line = response->p_intermediates->line;
882 err = at_tok_start(&line);
883 if (err < 0)
884 {
885 goto exit;
886 }
887 err = at_tok_nextint(&line, &tmp_int); // n
888 if (err < 0)
889 {
890 goto exit;
891 }
892 err = at_tok_nextint(&line, &tmp_int);// stat
893 if (err < 0)
894 {
895 goto exit;
896 }
897 reg->data_state = (uint8)tmp_int;
898
899 if(reg->lac == 0 && at_tok_hasmore(&line)) {
900 err = at_tok_nextstr(&line, &tmp_str); // lac
901 if (err < 0)
902 {
903 goto exit;
904 }
905 reg->lac = strtol(tmp_str, NULL, 16);
906
907 err = at_tok_nextstr(&line, &tmp_str); // ci
908 if (err < 0)
909 {
910 goto exit;
911 }
912 reg->ci = strtol(tmp_str, NULL, 16);
913
914 err = at_tok_nextint(&line, &tmp_int);// AcT
915 if (err < 0)
916 {
917 goto exit;
918 }
919 reg->type = (uint8)tmp_int;
b.liude989912025-02-12 14:40:42 +0800920 } else if(reg->data_state == 0 && (band_info.net_support & MBTK_NET_SUPPORT_5G)) {
921 at_response_free(response);
922 err = at_send_command_multiline(port, "AT+C5GREG?", "+C5GREG:", &response);
923 if (err < 0 || response->success == 0 || !response->p_intermediates){
924 if(cme_err) {
925 *cme_err = at_get_cme_error(response);
926 }
927 goto exit;
928 }
929
930 line = response->p_intermediates->line;
931 err = at_tok_start(&line);
932 if (err < 0)
933 {
934 goto exit;
935 }
936 err = at_tok_nextint(&line, &tmp_int); // n
937 if (err < 0)
938 {
939 goto exit;
940 }
941 err = at_tok_nextint(&line, &tmp_int);// stat
942 if (err < 0)
943 {
944 goto exit;
945 }
946 reg->data_state = (uint8)tmp_int;
947
948 if(/*reg->lac == 0 && */at_tok_hasmore(&line)) {
949 err = at_tok_nextstr(&line, &tmp_str); // lac
950 if (err < 0)
951 {
952 goto exit;
953 }
954 reg->lac = strtol(tmp_str, NULL, 16);
955
956 err = at_tok_nextstr(&line, &tmp_str); // ci
957 if (err < 0)
958 {
959 goto exit;
960 }
961 reg->ci = strtol(tmp_str, NULL, 16);
962
963 err = at_tok_nextint(&line, &tmp_int);// AcT
964 if (err < 0)
965 {
966 goto exit;
967 }
968 reg->type = (uint8)tmp_int;
969 }
b.liu87afc4c2024-08-14 17:33:45 +0800970 }
971 at_response_free(response);
972
b.liub171c9a2024-11-12 19:23:29 +0800973 err = at_send_command_multiline(port, "AT+CIREG?", "+CIREG:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800974 if (err < 0 || response->success == 0 || !response->p_intermediates){
975 reg->ims_state = (uint8)0;
976 err = 0;
977 goto exit;
978 }
979 line = response->p_intermediates->line;
980 err = at_tok_start(&line);
981 if (err < 0)
982 {
983 goto exit;
984 }
985 err = at_tok_nextint(&line, &tmp_int); // n/stat
986 if (err < 0)
987 {
988 goto exit;
989 }
990 if(at_tok_hasmore(&line)) {
991 err = at_tok_nextint(&line, &tmp_int);// stat
992 if (err < 0)
993 {
994 goto exit;
995 }
996 reg->ims_state = (uint8)tmp_int;
997 } else {
998 reg->ims_state = (uint8)tmp_int;
999 }
1000
1001exit:
1002 at_response_free(response);
1003 return err;
1004}
1005
1006/*
b.liub4772072024-08-15 14:47:03 +08001007AT+EEMOPT=1
1008OK
1009
1010// LTE
1011AT+EEMGINFO?
1012// <mcc>, <length of mnc>, <mnc>, <tac>, <PCI>, <dlEuarfcn>, < ulEuarfcn >, <band>, <dlBandwidth>,
1013// <rsrp>,<rsrq>, <sinr>,
1014// errcModeState,emmState,serviceState,IsSingleEmmRejectCause,EMMRejectCause,mmeGroupId,mmeCode,mTmsi,
1015// cellId,subFrameAssignType,specialSubframePatterns,transMode
1016// mainRsrp,diversityRsrp,mainRsrq,diversityRsrq,rssi,cqi,pathLoss,tb0DlTpt,tb1DlTpt,tb0DlPeakTpt,tb1DlPeakTpt,tb0UlPeakTpt,
1017// tb1UlPeakTpt,dlThroughPut,dlPeakThroughPut,averDlPRB,averCQITb0,averCQITb1,rankIndex,grantTotal,ulThroughPut,ulPeakThroughPut,currPuschTxPower,averUlPRB,
1018// dlBer, ulBer,
1019// diversitySinr, diversityRssi
1020+EEMLTESVC: 1120, 2, 0, 33584, 430, 40936, 40936, 41, 20,
10210, 0, 0,
10221, 10, 0, 1, 0, 1059, 78, 3959566565,
1023105149248, 2, 7, 7,
10240, 0, 0, 0, 0, 0, 0, 1190919, 0, 0, 0, 16779777,
10250, 5112867, 3959566565, 2, 0, 0, 0, 0, 0, 0, 0, 0,
10260, 0,
10277, 44
1028
1029// index,phyCellId,euArfcn,rsrp,rsrq
1030+EEMLTEINTER: 0, 65535, 38950, 0, 0
1031
1032+EEMLTEINTER: 1, 0, 0, 0, 0
1033
1034+EEMLTEINTER: 2, 0, 4294967295, 255, 255
1035
1036+EEMLTEINTER: 3, 65535, 1300, 0, 0
1037
1038+EEMLTEINTER: 4, 0, 0, 0, 0
1039
1040+EEMLTEINTER: 5, 0, 4294967295, 247, 0
1041
1042+EEMLTEINTER: 6, 197, 41332, 24, 9
1043
1044+EEMLTEINTER: 7, 0, 0, 0, 0
1045
1046+EEMLTEINTER: 8, 0, 0, 0, 0
1047
1048+EEMLTEINTRA: 0, 429, 40936, 56, 12
1049
1050+EEMLTEINTERRAT: 0,0
1051
1052+EEMLTEINTERRAT: 1,0
1053
1054+EEMGINFO: 3, 2 // <state>:
1055 // 0: ME in Idle mode
1056 // 1: ME in Dedicated mode
1057 // 2: ME in PS PTM mode
1058 // 3: invalid state
1059 // <nw_type>:
1060 // 0: GSM 1: UMTS 2: LTE
1061
1062OK
1063
1064// WCDMA
1065AT+EEMGINFO?
1066// Mode, sCMeasPresent, sCParamPresent, ueOpStatusPresent,
1067
1068// if sCMeasPresent == 1
1069// cpichRSCP, utraRssi, cpichEcN0, sQual, sRxLev, txPower,
1070// endif
1071
1072// if sCParamPresent == 1
1073// rac, nom, mcc, mnc_len, mnc, lac, ci,
1074// uraId, psc, arfcn, t3212, t3312, hcsUsed, attDetAllowed,
1075// csDrxCycleLen, psDrxCycleLen, utranDrxCycleLen, HSDPASupport, HSUPASupport,
1076// endif
1077
1078// if ueOpStatusPresent == 1
1079// rrcState, numLinks, srncId, sRnti,
1080// algPresent, cipherAlg, cipherOn, algPresent, cipherAlg, cipherOn,
1081// HSDPAActive, HSUPAActive, MccLastRegisteredNetwork, MncLastRegisteredNetwork, TMSI, PTMSI, IsSingleMmRejectCause, IsSingleGmmRejectCause,
1082// MMRejectCause, GMMRejectCause, mmState, gmmState, gprsReadyState, readyTimerValueInSecs, NumActivePDPContext, ULThroughput, DLThroughput,
1083// serviceStatus, pmmState, LAU_status, LAU_count, RAU_status, RAU_count
1084// endif
1085//
1086+EEMUMTSSVC: 3, 1, 1, 1,
1087-80, 27, -6, -18, -115, -32768,
10881, 1, 1120, 2, 1, 61697, 168432821,
108915, 24, 10763, 0, 0, 0, 0,
1090128, 128, 65535, 0, 0,
10912, 255, 65535, 4294967295,
10920, 0, 0, 0, 0, 0,
10930, 0, 0, 0, 0, 0, 1, 1,
109428672, 28672, 0, 0, 0, 0, 0, 0, 0,
10950, 0, 0, 0, 0, 0
1096
1097// index, cpichRSCP, utraRssi, cpichEcN0, sQual, sRxLev ,mcc, mnc, lac, ci, arfcn, psc
1098+EEMUMTSINTRA: 0, -32768, -1, -32768, -18, -115, 0, 0, 65534, 1, 10763, 32
1099
1100+EEMUMTSINTRA: 1, -1, -32768, -18, -115, 0, 0, 65534, 2, 10763, 40, 32768
1101
1102+EEMUMTSINTRA: 2, -32768, -18, -115, 0, 0, 65534, 3, 10763, 278, 32768, 65535
1103
1104+EEMUMTSINTRA: 3, -18, -115, 0, 0, -2, 4, 10763, 28, 32768, 65535, 32768
1105
1106+EEMUMTSINTRA: 4, -115, 0, 0, -2, 5, 10763, 270, 32768, 65535, 32768, 65518
1107
1108+EEMUMTSINTRA: 5, 0, 0, -2, 6, 10763, 286, 32768, 65535, 32768, 65518, 65421
1109
1110+EEMUMTSINTRA: 6, 0, -2, 7, 10763, 80, 32768, 65535, 32768, 65518, 65421, 0
1111
1112+EEMUMTSINTRA: 7, -2, 8, 10763, 206, -32768, 65535, 32768, 65518, 65421, 0, 0
1113
1114+EEMUMTSINTRA: 8, 9, 10763, 11, -32768, -1, 32768, 65518, 65421, 0, 0, 65534
1115
1116+EEMUMTSINTRA: 9, 10763, 19, -32768, -1, -32768, 65518, 65421, 0, 0, 65534, 11
1117
1118+EEMUMTSINTRA: 10, 232, -32768, -1, -32768, -18, 65421, 0, 0, 65534, 12, 10763
1119
1120+EEMUMTSINTRA: 11, -32768, -1, -32768, -18, -115, 0, 0, 65534, 13, 10763, 66
1121
1122+EEMUMTSINTRA: 12, -1, -32768, -18, -115, 0, 0, 65534, 14, 10763, 216, 32768
1123
1124+EEMUMTSINTRA: 13, -32768, -18, -115, 0, 0, 65534, 15, 10763, 183, 32768, 65535
1125
1126+EEMUMTSINTRA: 14, -18, -115, 0, 0, -2, 16, 10763, 165, 32768, 65535, 32768
1127
1128+EEMUMTSINTRA: 15, -115, 0, 0, -2, 17, 10763, 151, 32768, 65535, 32768, 65518
1129
1130+EEMUMTSINTRA: 16, 0, 0, -2, 18, 10763, 43, 32768, 65535, 32768, 65518, 65421
1131
1132+EEMUMTSINTRA: 17, 0, -2, 19, 10763, 72, 32768, 65535, 32768, 65518, 65421, 0
1133
1134+EEMUMTSINTRA: 18, -2, 20, 10763, 157, -32768, 65535, 32768, 65518, 65421, 0, 0
1135
1136+EEMUMTSINTRA: 19, 21, 10763, 165, -32768, -1, 32768, 65518, 65421, 0, 0, 65534
1137
1138+EEMUMTSINTRA: 20, 10763, 301, -32768, -1, -32768, 65518, 65421, 0, 0, 65534, 23
1139
1140+EEMUMTSINTRA: 21, 23, -32768, -1, -32768, -18, 65421, 0, 0, 65534, 24, 10763
1141
1142+EEMUMTSINTRA: 22, -32768, -1, -32768, -18, -115, 0, 0, 65534, 25, 10763, 0
1143
1144+EEMUMTSINTRA: 23, -1, -32768, -18, -115, 0, 0, 65534, 26, 10763, 167, 32768
1145
1146+EEMUMTSINTRA: 24, -32768, -18, -115, 0, 0, 65534, 27, 10763, 34, 32768, 65535
1147
1148+EEMUMTSINTRA: 25, -18, -115, 0, 0, -2, 28, 10763, 313, 32768, 65535, 32768
1149
1150+EEMUMTSINTRA: 26, -115, 0, 0, -2, 29, 10763, 152, 32768, 65535, 32768, 65518
1151
1152+EEMUMTSINTRA: 27, 0, 0, -2, 30, 10763, 239, 0, 0, 0, 0, 0
1153
1154+EEMUMTSINTRA: 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1155
1156+EEMUMTSINTRA: 29, 0, 0, 0, 0, -115, 0, 0, 65534, 30, 10763, 239
1157
1158// index,gsmRssi,rxLev,C1,C2,mcc,mnc,lac,ci,arfcn,bsic
1159+EEMUMTSINTERRAT: 0, -32768, -107, -1, -1, 0, 0, 65534, 0, 117, 36
1160
1161+EEMUMTSINTERRAT: 1, -107, -1, -1, 0, 0, 65534, 1, 72, 49, 0
1162
1163+EEMUMTSINTERRAT: 2, -1, -1, 0, 0, 65534, 2, 119, 15, 32768, 149
1164
1165+EEMUMTSINTERRAT: 3, -1, 0, 0, -2, 3, 121, 23, 0, 0, 0
1166
1167+EEMGINFO: 3, 1
1168
1169OK
1170
1171
1172// GSM
1173AT+EEMGINFO?
1174+EEMGINFOBASIC: 2
1175
1176// mcc, mnc_len, mnc, lac, ci, nom, nco,
1177// bsic, C1, C2, TA, TxPwr,
1178// RxSig, RxSigFull, RxSigSub, RxQualFull, RxQualSub,
1179// ARFCB_tch, hopping_chnl, chnl_type, TS, PacketIdle, rac, arfcn,
1180// bs_pa_mfrms, C31, C32, t3212, t3312, pbcch_support, EDGE_support,
1181// ncc_permitted, rl_timeout, ho_count, ho_succ, chnl_access_count, chnl_access_succ_count,
1182// gsmBand,channelMode
1183+EEMGINFOSVC: 1120, 2, 0, 32784, 24741, 2, 0,
118463, 36, 146, 1, 7,
118546, 42, 42, 7, 0,
118653, 0, 8, 0, 1, 6, 53,
11872, 0, 146, 42, 54, 0, 1,
11881, 32, 0, 0, 0, 0,
11890, 0
1190
1191// PS_attached, attach_type, service_type, tx_power, c_value,
1192// ul_ts, dl_ts, ul_cs, dl_cs, ul_modulation, dl_modulation,
1193// gmsk_cv_bep, 8psk_cv_bep, gmsk_mean_bep, 8psk_mean_bep, EDGE_bep_period, single_gmm_rej_cause
1194// pdp_active_num, mac_mode, network_control, network_mode, EDGE_slq_measurement_mode, edge_status
1195+EEMGINFOPS: 1, 255, 0, 0, 0,
11960, 0, 268435501, 1, 0, 0,
11974, 0, 96, 0, 0, 0,
11980, 0, 0, 65535, 0, 13350
1199
1200+EEMGINFO: 0, 0
1201
1202OK
1203
1204*/
b.liub171c9a2024-11-12 19:23:29 +08001205static int req_cell_info_get(ATPortType_enum port, int *cme_err)
b.liub4772072024-08-15 14:47:03 +08001206{
1207 ATResponse *response = NULL;
1208 int tmp_int;
1209 int buff_size = 0;
1210 // AT+EEMOPT=1 in the first.
b.liub171c9a2024-11-12 19:23:29 +08001211 int err = at_send_command(port, "AT+EEMOPT=1", &response);
b.liub4772072024-08-15 14:47:03 +08001212 if (err < 0 || response->success == 0){
1213 *cme_err = at_get_cme_error(response);
1214 goto exit;
1215 }
1216
1217 // Reset buffer in the first.
1218 memset(&cell_info, 0xFF, sizeof(mbtK_cell_pack_info_t));
1219 cell_info.running = true;
1220 cell_info.cell_list.num = 0;
1221
b.liub171c9a2024-11-12 19:23:29 +08001222 err = at_send_command_singleline(port, "AT+EEMGINFO?", "+EEMGINFO:", &response);
b.liub4772072024-08-15 14:47:03 +08001223 if (err < 0 || response->success == 0 || !response->p_intermediates){
1224 *cme_err = at_get_cme_error(response);
1225 goto exit;
1226 }
1227
1228 // Now, cell infomation has get from URC message.
1229
1230 char *line = response->p_intermediates->line;
1231 err = at_tok_start(&line);
1232 if (err < 0)
1233 {
1234 goto exit;
1235 }
1236 err = at_tok_nextint(&line, &tmp_int);
1237 if (err < 0)
1238 {
1239 goto exit;
1240 }
1241 err = at_tok_nextint(&line, &tmp_int);
1242 if (err < 0)
1243 {
1244 goto exit;
1245 }
1246
1247 cell_info.cell_list.type = (uint8)tmp_int;
1248 cell_info.running = false;
1249
1250#if 0
1251 while(lines_ptr)
1252 {
1253 // LTE
1254 if(strStartsWith(line, "+EEMLTESVC:")) // LTE Server Cell
1255 {
1256
1257 }
1258 else if(strStartsWith(line, "+EEMLTEINTER:")) // LTE
1259 {
1260
1261 }
1262 else if(strStartsWith(line, "+EEMLTEINTRA:")) // LTE
1263 {
1264
1265 }
1266 else if(strStartsWith(line, "+EEMLTEINTERRAT:")) // LTE
1267 {
1268
1269 }
1270 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
1271 // <nw_type>: 0: GSM 1: UMTS 2: LTE
1272 {
1273
1274 }
1275 // WCDMA
1276 else if(strStartsWith(line, "+EEMUMTSSVC:")) // WCDMA Server Cell
1277 {
1278
1279 }
1280 else if(strStartsWith(line, "+EEMUMTSINTRA:")) // WCDMA
1281 {
1282
1283 }
1284 else if(strStartsWith(line, "+EEMUMTSINTERRAT:")) // WCDMA
1285 {
1286
1287 }
1288 // GSM
1289 else if(strStartsWith(line, "+EEMGINFOBASIC:")) // Basic information in GSM
1290 // 0: ME in Idle mode 1: ME in Dedicated mode 2: ME in PS PTM mode
1291 {
1292
1293 }
1294 else if(strStartsWith(line, "+EEMGINFOSVC:")) // GSM Server Cell
1295 {
1296
1297 }
1298 else if(strStartsWith(line, "+EEMGINFOPS:")) // PS
1299 {
1300
1301 }
1302
1303
1304 lines_ptr = lines_ptr->p_next;
1305 }
1306#endif
1307
1308exit:
1309 at_response_free(response);
1310 return buff_size;
1311}
1312
b.liub171c9a2024-11-12 19:23:29 +08001313static int req_cell_info_set(ATPortType_enum port, const char *cmgl, char *reg, int len, int *cme_err)
b.liub4772072024-08-15 14:47:03 +08001314{
1315 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +08001316 char cmd[500] = {0};
b.liub4772072024-08-15 14:47:03 +08001317 char data[218] = {0};
1318 int err = 0;
1319
1320 memcpy(data, cmgl, len);
1321
1322 sprintf(cmd, "AT*CELL=%s", data);
1323
1324 if(strlen(cmd) > 0)
1325 {
b.liub171c9a2024-11-12 19:23:29 +08001326 err = at_send_command_multiline(port, cmd, "", &response);
b.liub4772072024-08-15 14:47:03 +08001327 if (err < 0 || response->success == 0 || !response->p_intermediates){
1328 *cme_err = at_get_cme_error(response);
1329 goto exit;
1330 }
1331
1332 ATLine* lines_ptr = response->p_intermediates;
1333 char *line = NULL;
b.liu62240ee2024-11-07 17:52:45 +08001334// int reg_len = 0;
1335// bool flag = false;
b.liub4772072024-08-15 14:47:03 +08001336 while(lines_ptr)
1337 {
1338 line = lines_ptr->line;
1339 if(line ==NULL)
1340 {
1341 LOGD("line is null----------------------");
1342 }
1343 lines_ptr = lines_ptr->p_next;
1344 }
1345 }
1346 err = 0;
1347 memcpy(reg, "req_cell_info_set succss", strlen("req_cell_info_set succss"));
1348exit:
1349 at_response_free(response);
1350 return err;
1351}
1352
b.liu557c81d2024-11-19 16:52:45 +08001353/*
1354AT+OOSPP=1
1355or
1356AT+OOSPP=0
1357or
1358AT+OOSPP=1,20,30,40 //AtOospp()
1359 param1£ºmode
1360 param2£ºoosPhasePeriod[0] //5 times, 5s by default;
1361 param3£ºoosPhasePeriod[1] //5 times, 10s by default;
1362 param4£ºoosPhasePeriod[2] //unlimited, 20s by default;
1363
1364
1365BTW
13661, Èç¹ûÖ»ÊäÈëmode=1£¬ÆäÓà²ÎÊý²»ÉèÖã¬Ï൱ÓÚÕâ¸ö¹¦ÄÜ´ò¿ª£¬Ê±¼ä¼ä¸ôÊÇÕâ¸ö¹¦ÄܵÄĬÈÏÖµ¡£
13672, Èç¹ûµ±mode=1¼ÓÉÏÆäÓàÉèÖòÎÊýºó£¬¹¦ÄÜ´ò¿ª£¬Ê±¼ä¼ä¸ôÊDZ¾´ÎÉèÖõÄÖµ£»
13683£¬Èç¹ûÔÙÉèÖÃmode=0£¬Ï൱ÓÚÕâ¸ö¹¦Äܹرգ¬ÊÇ×߯½Ì¨×Ô¼ºÁíÒ»Ì×µÄËÑÍøÉèÖá£
1369ƽ̨±¾ÉíÊÇÓÐÒ»Ì×¼ä¸ôËÑÍø£¬Ò²ÓÐÀúʷƵµãÓÅÏÈ´¦ÀíµÄÂß¼­£¨²»ÐèÒªÎÒÃǽøÐд¦Àí£©£¬
1370Ìṩ¸øÎÒÃǵÄAT+OOSPPÖ¸ÁîÊÇÈÃÎÒÃÇ¿ÉÒÔ×Ô¶¨ÒåËÑÍø¼ä¸ô
1371*/
1372static int req_oos_set(ATPortType_enum port, const mbtk_ril_oos_info_t* oos_info, int *cme_err)
1373{
1374 ATResponse *response = NULL;
1375 char cmd[100] = {0};
1376 int err = 0;
1377
1378 if ((oos_info->state == 1 && oos_info->oosPhase[0] == 0 && oos_info->oosPhase[1] == 0 && oos_info->oosPhase[2] == 0) \
1379 || oos_info->state == 0)
1380 {
1381 sprintf(cmd, "AT+OOSPP=%d", oos_info->state);//Ö»ÓÐÒ»¸öÖµ0/1
1382 }
1383 else
1384 {
1385 if ((oos_info->oosPhase[0] != 0) && (oos_info->oosPhase[1] != 0) && (oos_info->oosPhase[2] != 0))
1386 {
1387 sprintf(cmd, "AT+OOSPP=%d,%d,%d,%d", oos_info->state, oos_info->oosPhase[0], oos_info->oosPhase[1], oos_info->oosPhase[2]);
1388 }
1389 else if ((oos_info->oosPhase[0] != 0) && (oos_info->oosPhase[1] != 0) && (oos_info->oosPhase[2] == 0))
1390 {
1391 sprintf(cmd, "AT+OOSPP=%d,%d,%d", oos_info->state, oos_info->oosPhase[0], oos_info->oosPhase[1]);
1392 }
1393 else if ((oos_info->oosPhase[0] != 0) && (oos_info->oosPhase[1] == 0) && (oos_info->oosPhase[2] == 0))
1394 {
1395 sprintf(cmd, "AT+OOSPP=%d,%d", oos_info->state, oos_info->oosPhase[0]);
1396 }
1397 else
1398 {
1399 LOGE("AT+OOSPP SET ERR");
1400 goto exit;
1401 }
1402 }
1403
1404 LOGI("Set the oos command is = [%s]\n", cmd);
1405 err = at_send_command(port, cmd, &response);
1406 if (err < 0 || response->success == 0){
1407 *cme_err = at_get_cme_error(response);
1408 goto exit;
1409 }
1410
1411exit:
1412 at_response_free(response);
1413 return err;
1414}
1415
1416/*
1417AT+OOSPP?
1418¿ª(ĬÈÏÖµ)£º
1419+OOSPP:5,10,20
1420¹Ø£º
1421+OOSPP:0
1422*/
1423static int req_oos_get(ATPortType_enum port, mbtk_ril_oos_info_t *oos_info, int *cme_err)
1424{
1425 ATResponse *response = NULL;
1426
1427 int err = at_send_command_singleline(port, "AT+OOSPP?", "+OOSPP:", &response);
1428
1429 if (err < 0 || response->success == 0 || !response->p_intermediates){
1430 *cme_err = at_get_cme_error(response);
1431 goto exit;
1432 }
1433
1434 char *line = response->p_intermediates->line;
1435
1436 char *tmp_str = NULL;
1437 err = at_tok_start(&line);//+OOSPP:10,15,20,¹ýÂË+OOSPP:
1438 if (err < 0)
1439 {
1440 goto exit;
1441 }
1442
1443 //LOG("req_oos_get =[%s]",line);
1444
1445 err = at_tok_nextstr(&line, &tmp_str);
1446 if (err < 0)
1447 {
1448 goto exit;
1449 }
1450
1451 int mode = atoi(tmp_str);
1452 if (mode == 0)//¹Ø±Õ״̬
1453 {
1454 oos_info->state = mode;
1455 }
1456 else//¿ª×´Ì¬
1457 {
1458 oos_info->state = 1;
1459 //LOG("tmp_str =[%s]",tmp_str);
1460 oos_info->oosPhase[0] = atoi(tmp_str);
1461
1462 err = at_tok_nextstr(&line, &tmp_str);
1463 if (err < 0)
1464 {
1465 goto exit;
1466 }
1467 //LOG("tmp_str =[%s]",tmp_str);
1468 oos_info->oosPhase[1] = atoi(tmp_str);
1469
1470 err = at_tok_nextstr(&line, &tmp_str);
1471 if (err < 0)
1472 {
1473 goto exit;
1474 }
1475 //LOG("tmp_str =[%s]",tmp_str);
1476 oos_info->oosPhase[2] = atoi(tmp_str);
1477 }
1478
1479exit:
1480 at_response_free(response);
1481 return err;
1482}
1483
b.liu87afc4c2024-08-14 17:33:45 +08001484//void net_list_free(void *data);
1485// Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
1486// Otherwise, do not call pack_error_send().
1487mbtk_ril_err_enum net_pack_req_process(sock_cli_info_t* cli_info, ril_msg_pack_info_t* pack)
1488{
1489 mbtk_ril_err_enum err = MBTK_RIL_ERR_SUCCESS;
1490 int cme_err = MBTK_RIL_ERR_CME_NON;
1491 switch(pack->msg_id)
1492 {
1493 case RIL_MSG_ID_NET_AVAILABLE:
1494 {
1495 if(pack->data_len == 0 || pack->data == NULL)
1496 {
1497 mbtk_net_info_array_t net_array;
1498 memset(&net_array, 0, sizeof(mbtk_net_info_array_t));
b.liub171c9a2024-11-12 19:23:29 +08001499 if(req_available_net_get(cli_info->port, &net_array, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001500 {
1501 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1502 err = MBTK_RIL_ERR_CME + cme_err;
1503 } else {
1504 err = MBTK_RIL_ERR_UNKNOWN;
1505 }
1506 LOGD("Get Available Net fail.");
1507 }
1508 else
1509 {
b.liub171c9a2024-11-12 19:23:29 +08001510 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &net_array, sizeof(mbtk_net_info_array_t));
b.liu87afc4c2024-08-14 17:33:45 +08001511 }
1512 }
1513 else // Set
1514 {
1515 err = MBTK_RIL_ERR_UNSUPPORTED;
1516 LOGW("Unsupport set available net.");
1517 }
1518 break;
1519 }
1520 case RIL_MSG_ID_NET_SEL_MODE:
1521 {
1522 if(pack->data_len == 0 || pack->data == NULL)
1523 {
1524 mbtk_net_info_t info;
1525 memset(&info, 0, sizeof(mbtk_net_info_t));
b.liub171c9a2024-11-12 19:23:29 +08001526 if(req_net_sel_mode_get(cli_info->port, &info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001527 {
1528 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1529 err = MBTK_RIL_ERR_CME + cme_err;
1530 } else {
1531 err = MBTK_RIL_ERR_UNKNOWN;
1532 }
1533 LOGD("Get Net sel mode fail.");
1534 }
1535 else
1536 {
b.liub171c9a2024-11-12 19:23:29 +08001537 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &info, sizeof(mbtk_net_info_t));
b.liu87afc4c2024-08-14 17:33:45 +08001538 }
1539 }
1540 else // Set
1541 {
1542 mbtk_net_info_t *info = (mbtk_net_info_t*)pack->data;
b.liub171c9a2024-11-12 19:23:29 +08001543 if(req_net_sel_mode_set(cli_info->port, info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001544 {
1545 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1546 err = MBTK_RIL_ERR_CME + cme_err;
1547 } else {
1548 err = MBTK_RIL_ERR_UNKNOWN;
1549 }
1550 LOGD("Set Net sel mode fail.");
1551 }
1552 else
1553 {
b.liub171c9a2024-11-12 19:23:29 +08001554 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +08001555 }
1556 }
1557 break;
1558 }
1559 case RIL_MSG_ID_NET_BAND:
1560 {
1561 if(pack->data_len == 0 || pack->data == NULL)
1562 {
1563 err = MBTK_RIL_ERR_REQ_PARAMETER;
1564 LOG("No data found.");
1565 }
1566 else // Set
1567 {
1568 if(pack->data_len == sizeof(uint8)) {
1569 if(*(pack->data)) { // Get current bands.
1570 mbtk_band_info_t band;
1571 memset(&band, 0x0, sizeof(mbtk_band_info_t));
b.liub171c9a2024-11-12 19:23:29 +08001572 if(req_band_get(cli_info->port, &band, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001573 {
1574 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1575 err = MBTK_RIL_ERR_CME + cme_err;
1576 } else {
1577 err = MBTK_RIL_ERR_UNKNOWN;
1578 }
1579 LOG("Get net band fail.");
1580 }
1581 else
1582 {
b.liub171c9a2024-11-12 19:23:29 +08001583 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &band, sizeof(mbtk_band_info_t));
b.liu87afc4c2024-08-14 17:33:45 +08001584 }
1585 } else { // Get support bands.
b.liude989912025-02-12 14:40:42 +08001586 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &band_info.band_support, sizeof(mbtk_band_info_t));
b.liu87afc4c2024-08-14 17:33:45 +08001587 }
1588 } else { // Set current bands.
1589 mbtk_band_info_t* band = (mbtk_band_info_t*)pack->data;
1590 if(pack->data_len != sizeof(mbtk_band_info_t))
1591 {
1592 err = MBTK_RIL_ERR_REQ_PARAMETER;
1593 LOG("Set net band error.");
1594 break;
1595 }
1596
b.liub171c9a2024-11-12 19:23:29 +08001597 if(req_band_set(cli_info->port, band, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001598 {
1599 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1600 err = MBTK_RIL_ERR_CME + cme_err;
1601 } else {
1602 err = MBTK_RIL_ERR_UNKNOWN;
1603 }
1604 LOG("Set net band fail.");
1605 }
1606 else
1607 {
b.liub171c9a2024-11-12 19:23:29 +08001608 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +08001609 }
1610 }
1611 }
1612 break;
1613 }
1614 case RIL_MSG_ID_NET_SIGNAL:
1615 {
1616 if(pack->data_len == 0 || pack->data == NULL)
1617 {
1618 mbtk_signal_info_t signal;
1619 memset(&signal, 0, sizeof(mbtk_signal_info_t));
b.liub171c9a2024-11-12 19:23:29 +08001620 if(req_net_signal_get(cli_info->port, &signal, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001621 {
1622 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1623 err = MBTK_RIL_ERR_CME + cme_err;
1624 } else {
1625 err = MBTK_RIL_ERR_UNKNOWN;
1626 }
1627 LOGD("Get net signal fail.");
1628 }
1629 else
1630 {
b.liub171c9a2024-11-12 19:23:29 +08001631 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &signal, sizeof(mbtk_signal_info_t));
b.liu87afc4c2024-08-14 17:33:45 +08001632 }
1633 }
1634 else // Set
1635 {
1636 err = MBTK_RIL_ERR_UNSUPPORTED;
1637 LOGW("Unsupport set net signal.");
1638 }
1639 break;
1640 }
1641 case RIL_MSG_ID_NET_REG:
1642 {
1643 if(pack->data_len == 0 || pack->data == NULL)
1644 {
1645 mbtk_net_reg_info_t net_reg;
1646 memset(&net_reg, 0, sizeof(mbtk_net_reg_info_t));
b.liub171c9a2024-11-12 19:23:29 +08001647 if(req_net_reg_get(cli_info->port, &net_reg, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001648 {
1649 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1650 err = MBTK_RIL_ERR_CME + cme_err;
1651 } else {
1652 err = MBTK_RIL_ERR_UNKNOWN;
1653 }
1654 LOGD("Get Net reg info fail.");
1655 }
1656 else
1657 {
b.liub171c9a2024-11-12 19:23:29 +08001658 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &net_reg, sizeof(mbtk_net_reg_info_t));
b.liu87afc4c2024-08-14 17:33:45 +08001659 }
1660 }
1661 else // Set
1662 {
1663 err = MBTK_RIL_ERR_UNSUPPORTED;
1664 LOGW("Unsupport set net reg info.");
1665 }
1666 break;
1667 }
1668 case RIL_MSG_ID_NET_CELL:
1669 {
b.liub4772072024-08-15 14:47:03 +08001670 if(pack->data_len == 0 || pack->data == NULL) // Get net cell.
b.liu87afc4c2024-08-14 17:33:45 +08001671 {
b.liub171c9a2024-11-12 19:23:29 +08001672 if(req_cell_info_get(cli_info->port, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +08001673 {
1674 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1675 err = MBTK_RIL_ERR_CME + cme_err;
1676 } else {
1677 err = MBTK_RIL_ERR_UNKNOWN;
1678 }
b.liub4772072024-08-15 14:47:03 +08001679 LOG("Get net cell fail.");
b.liu87afc4c2024-08-14 17:33:45 +08001680 }
1681 else
1682 {
b.liub4772072024-08-15 14:47:03 +08001683 LOG("req_cell_info_get() success,cell number: %d", cell_info.cell_list.num);
b.liude989912025-02-12 14:40:42 +08001684 LOGD("data_len = %d", sizeof(mbtk_cell_info_array_t));
b.liub171c9a2024-11-12 19:23:29 +08001685 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &cell_info.cell_list, sizeof(mbtk_cell_info_array_t));
b.liu87afc4c2024-08-14 17:33:45 +08001686 }
1687 }
b.liub4772072024-08-15 14:47:03 +08001688 else // Lock cell
b.liu87afc4c2024-08-14 17:33:45 +08001689 {
b.liub4772072024-08-15 14:47:03 +08001690 char *mem = (char*)(pack->data);
1691 int len = pack->data_len;
1692 char reg[100] = {0};
b.liub171c9a2024-11-12 19:23:29 +08001693 if(req_cell_info_set(cli_info->port, mem, reg, len, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liub4772072024-08-15 14:47:03 +08001694 {
1695 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1696 err = MBTK_RIL_ERR_CME + cme_err;
1697 } else {
1698 err = MBTK_RIL_ERR_UNKNOWN;
1699 }
1700 }
1701 else
1702 {
b.liub171c9a2024-11-12 19:23:29 +08001703 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, reg, strlen(reg));
b.liub4772072024-08-15 14:47:03 +08001704 }
b.liu87afc4c2024-08-14 17:33:45 +08001705 }
1706 break;
1707 }
b.liu557c81d2024-11-19 16:52:45 +08001708 case RIL_MSG_ID_NET_OOS:
1709 {
1710 if(pack->data_len == 0 || pack->data == NULL) // Get net oos.
1711 {
1712 mbtk_ril_oos_info_t oos_info;
1713 memset(&oos_info, 0, sizeof(mbtk_ril_oos_info_t));
1714 if(req_oos_get(cli_info->port, &oos_info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
1715 {
1716 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1717 err = MBTK_RIL_ERR_CME + cme_err;
1718 } else {
1719 err = MBTK_RIL_ERR_UNKNOWN;
1720 }
1721 LOG("Get net oos fail.");
1722 }
1723 else
1724 {
1725 LOG("req_oos_get() success,cell number: %d", oos_info.state);
1726 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &oos_info, sizeof(mbtk_ril_oos_info_t));
1727 }
1728 }
1729 else // Set net oos.
1730 {
1731 mbtk_ril_oos_info_t *oos_info = (mbtk_ril_oos_info_t*)(pack->data);
1732 if(req_oos_set(cli_info->port, oos_info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
1733 {
1734 if(cme_err != MBTK_RIL_ERR_CME_NON) {
1735 err = MBTK_RIL_ERR_CME + cme_err;
1736 } else {
1737 err = MBTK_RIL_ERR_UNKNOWN;
1738 }
1739 }
1740 else
1741 {
1742 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
1743 }
1744 }
1745 break;
1746 }
b.liu87afc4c2024-08-14 17:33:45 +08001747 default:
1748 {
1749 err = MBTK_RIL_ERR_REQ_UNKNOWN;
1750 LOG("Unknown request : %s", id2str(pack->msg_id));
1751 break;
1752 }
1753 }
1754
1755 return err;
1756}
1757