blob: 1992befba2238515fe336242159911bbe4f6c065 [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 <string.h>
11#include <fcntl.h>
12#include <signal.h>
b.liu62240ee2024-11-07 17:52:45 +080013#include <arpa/inet.h>
b.liu87afc4c2024-08-14 17:33:45 +080014
15#include "mbtk_ril_api.h"
b.liu62240ee2024-11-07 17:52:45 +080016#include "mbtk_str.h"
b.liu87afc4c2024-08-14 17:33:45 +080017
18#define CLI_THREAD_MAX 3
19
b.liu62240ee2024-11-07 17:52:45 +080020#define RIL_DEBUG_THREAD 0
21
22#if RIL_DEBUG_THREAD
b.liu87afc4c2024-08-14 17:33:45 +080023typedef struct {
24 pthread_t pid;
25 bool is_running;
26 char name[20];
27} ril_cli_thread_info_t;
28
29static ril_cli_thread_info_t cli_threads[CLI_THREAD_MAX];
30static int cli_pid_index = 1;
b.liu62240ee2024-11-07 17:52:45 +080031#endif
b.liu87afc4c2024-08-14 17:33:45 +080032
33static void help()
34{
35 printf("version: Get version.\n");
36 printf("imei: Get IMEI.\n");
37 printf("sn: Get SN.\n");
38 printf("meid: Get MEID.\n");
39 printf("volte: Get VoLTE state.\n");
40 printf("volte 0: Close VoLTE.\n");
41 printf("volte 1: Open VoLTE.\n");
42 printf("radio: Get radio state.\n");
43 printf("radio 0 [0/1]: Close radio.\n");
44 printf("radio 1 [0/1]: Open radio.\n");
45 printf("temp <0,1>: Get SOC/RF temperature.\n");
46 printf("cell_time: Get cell time.\n");
47 printf("sim_state: Get sim state.\n");
48 printf("sim_type: Get sim type.\n");
49 printf("imsi: Get IMSI.\n");
50 printf("iccid: Get ICCID.\n");
51 printf("pn: Get Phone Number.\n");
52 printf("pin_state:Get Sim lock state.\n");
53 printf("pin_times:Get PIN/PUK last times.\n");
54 printf("pin_open <PIN>:Enable sim lock.\n");
55 printf("pin_close <PIN>:Disable sim lock.\n");
56 printf("pin_change <old_pin> <new_pin>:Change sim PIN.\n");
57 printf("pin_verify <PIN>:Verify PIN.\n");
58 printf("puk_verify <PUK> <PIN>:Verify PUK.\n");
59 printf("plmn:Get PLMN List.\n");
60 printf("avail_net: Get available network.\n");
61 printf("sel_mode: Get network select mode.\n");
62 printf("sel_mode <sel_mode> <net_type> <plmn>: Set network select mode.\n");
63 printf("band: Get current bands.\n");
64 printf("band support: Get support bands.\n");
65 printf("band <net_pref> <gsm_band> <umts_band> <tdlte_band> <fddlte_band>: Set current bands.\n");
66 printf("signal: Get network signal.\n");
67 printf("reg: Get network registe information.\n");
68 printf("cell: Get current cell information.\n");
69 printf("shutdown <0,1,2>: reboot/poweroff/halt system.\n");
70 printf("power_sim <0,1>: Power off/on sim.\n");
71 printf("time <0,1,2> YYYY-MM-DD HH:MM:SS : Set system time as CELL/NTP/User.\n");
72 printf("apn : Get current apns.\n");
b.liubcf86c92024-08-19 19:48:28 +080073 printf("apn <cid> <ip_type:1/2/3/4> <save:0/1> <auto_call:0/1> <def_route:0/1> <as_dns:0/1> <apn/null> : Set apn.\n");
b.liu87afc4c2024-08-14 17:33:45 +080074 printf("apn_del <cid> <save:0/1> : Delete APN.\n");
b.liubcf86c92024-08-19 19:48:28 +080075 printf("data_call <0/1/2> <cid> <auto_boot_call> <def_route> <as_dns>: Stop/Start/State data call.\n");
b.liu87afc4c2024-08-14 17:33:45 +080076 printf("call: Call the phone number.\n");
77 printf("answer: Answer the phone call.\n");
78 printf("hangup: Hang up all phone call. No id.\n");
79 printf("hangup 0: Hang up waiting or background phone call.\n");
80 printf("hangup 1: Hang up a phone call.\n");
81 printf("hangup 2: Hang up a phone call.\n");
82 printf("hangup 3: Hangup foreground resume background call.\n");
83 printf("waitin: Returns the list of current calls.\n");
84 printf("mute: Get mute state.\n");
85 printf("mute 0: Close mute.\n");
86 printf("mute 1: Open mute.\n");
87 printf("dtmf : Set dtmf character[0, 1, 2, ..., A, B, C, D, *, #], duration [300-600].\n Such as: dtmf 0 300\n");
88 printf("ims_en 0/1 : Close/Open IMS(Restart takes effect).\n");
89 printf("ims_state : Get IMS open or not?\n");
90 printf("ims_reg: Get IMS register state.\n");
91}
92
b.liu62240ee2024-11-07 17:52:45 +080093#if RIL_DEBUG_THREAD
b.liu87afc4c2024-08-14 17:33:45 +080094static void thread_exit_with_wait()
95{
96 int i = 0;
97 while(i < CLI_THREAD_MAX) {
98 cli_threads[i].is_running = FALSE;
99 i++;
100 }
101
102 i = 0;
103 while(i < CLI_THREAD_MAX) {
104 if(cli_threads[i].pid) {
105 pthread_join(cli_threads[i].pid, NULL);
106 printf("Thread (%s) exit.\n", cli_threads[i].name);
107 }
108 i++;
109 }
110}
b.liu62240ee2024-11-07 17:52:45 +0800111#endif
b.liu87afc4c2024-08-14 17:33:45 +0800112
b.liu15f456b2024-10-31 20:16:06 +0800113static void ril_ser_state_change_cb(const void* data, int data_len)
114{
115 if(data) {
b.liu62240ee2024-11-07 17:52:45 +0800116 const uint8 *ptr = (const uint8*)data;
b.liu15f456b2024-10-31 20:16:06 +0800117 mbtk_ril_ser_state_enum state = (mbtk_ril_ser_state_enum)ptr[0];
118 printf("ril server state : %d.\n", state);
119 }
120}
121
122static void net_reg_state_change_cb(const void* data, int data_len)
123{
124 if(data) {
125 mbtk_ril_net_reg_state_info_t *state = (mbtk_ril_net_reg_state_info_t*)data;
126 printf("net reg state change : type - %d, tech - %d, reg_state - %d\n", state->type,
127 state->tech, state->reg_state);
128 }
129}
130
131static void call_state_change_cb(const void* data, int data_len)
132{
133 if(data) {
134 mbtk_ril_call_state_info_t *state = (mbtk_ril_call_state_info_t*)data;
135 printf("call state change : call_id-%d, dir-%d, state-%d, num_type-%d,number-%s\n", state->call_id,
136 state->dir, state->state, state->num_type, state->call_number);
137 }
138}
139
140static void sms_state_change_cb(const void* data, int data_len)
141{
142
143}
144
145static void radio_state_change_cb(const void* data, int data_len)
146{
147 if(data) {
148 mbtk_ril_radio_state_info_t *state = (mbtk_ril_radio_state_info_t*)data;
149 printf("radio state change : %d\n", state->radio_state);
150 }
151}
152
153static void sim_state_change_cb(const void* data, int data_len)
154{
155 if(data) {
156 mbtk_ril_sim_state_info_t *state = (mbtk_ril_sim_state_info_t*)data;
157 printf("sim state change : type - %d, state - %d\n", state->sim_type, state->sim_state);
158 }
159}
160
161static void pdp_state_change_cb(const void* data, int data_len)
162{
163 if(data) {
164 mbtk_ril_pdp_state_info_t *state = (mbtk_ril_pdp_state_info_t*)data;
165 printf("pdp state change : cid - %d, action - %d, reason-%d, auto_change - %d\n",
166 state->cid, state->action, state->reason, state->auto_change);
167 }
168}
169
170static void signal_state_change_cb(const void* data, int data_len)
171{
172
173}
174
175static void ecall_state_change_cb(const void* data, int data_len)
176{
177 if(data)
178 {
179 mbtk_ril_ecall_state_info_t *ecall_data = (mbtk_ril_ecall_state_info_t*)data;
180 printf("ecall state change : urc_id - %d, urc_data - %s\n", ecall_data->urc_id, ecall_data->urc_data);
181 }
182}
183
184
b.liu87afc4c2024-08-14 17:33:45 +0800185static void sig_process(int sig)
186{
187 LOGI("I got signal %d\n", sig);
188 switch(sig)
189 {
190 case SIGINT: // Ctrl + C
191 {
192 LOGI("Exit by SIGINT.\n");
b.liu62240ee2024-11-07 17:52:45 +0800193#if RIL_DEBUG_THREAD
b.liu87afc4c2024-08-14 17:33:45 +0800194 thread_exit_with_wait();
b.liu62240ee2024-11-07 17:52:45 +0800195#endif
b.liu87afc4c2024-08-14 17:33:45 +0800196 mbtk_ril_deinit();
197 exit(0);
198 }
199 case SIGQUIT: // Ctrl + \ (类似 SIGINT ,但要产生core文件)
200 {
201 LOGI("Exit by SIGQUIT.\n");
b.liu62240ee2024-11-07 17:52:45 +0800202#if RIL_DEBUG_THREAD
b.liu87afc4c2024-08-14 17:33:45 +0800203 thread_exit_with_wait();
b.liu62240ee2024-11-07 17:52:45 +0800204#endif
b.liu87afc4c2024-08-14 17:33:45 +0800205 mbtk_ril_deinit();
206 exit(0);
207 }
208 case SIGTERM:// 默认kill (同 SIGKILL ,但 SIGKILL 不可捕获)
209 {
210 LOGI("Exit by SIGTERM.\n");
b.liu62240ee2024-11-07 17:52:45 +0800211#if RIL_DEBUG_THREAD
b.liu87afc4c2024-08-14 17:33:45 +0800212 thread_exit_with_wait();
b.liu62240ee2024-11-07 17:52:45 +0800213#endif
b.liu87afc4c2024-08-14 17:33:45 +0800214 mbtk_ril_deinit();
215 exit(0);
216 }
217 case SIGTSTP:// Ctrl + Z (同 SIGSTOP ,但 SIGSTOP 不可捕获)
218 {
219 LOGI("Exit by SIGTSTP.\n");
220 exit(0);
221 }
222 case SIGSEGV: // 如空指针
223 {
224 LOGI("Exit by SIGSEGV.\n");
225 exit(0);
226 }
227 default:
228 {
229 LOGI("Unknown sig:%d\n",sig);
230 break;
231 }
232 }
233}
234
b.liu62240ee2024-11-07 17:52:45 +0800235#if RIL_DEBUG_THREAD
b.liu87afc4c2024-08-14 17:33:45 +0800236static char* thread_id2name(pthread_t pid)
237{
238 int i = 0;
239 while(i < CLI_THREAD_MAX) {
240 if(pid == cli_threads[i].pid) {
241 return cli_threads[i].name;
242 }
243 i++;
244 }
245
246 return "UNKNOWN";
247}
248
249static void* sub_thread_run(void *arg)
250{
251 ril_cli_thread_info_t *cli = (ril_cli_thread_info_t*)arg;
252 cli->pid = pthread_self();
253 cli->is_running = TRUE;
254 sprintf(cli->name, "PID-%d", cli_pid_index++);
255
256 printf("[%s] enter.\n", thread_id2name(cli->pid));
257 while(cli->is_running) {
258 srand((int)(time(0) + cli->pid));
259 int time_sec = 1 + (int)(10.0 * rand() / ( RAND_MAX + 1.0));
260 char version[50] = {0};
261 mbtk_ril_err_enum err = mbtk_version_get(version);
262 if(err != MBTK_RIL_ERR_SUCCESS) {
263 printf("[%s : %ds]Error : %d\n", thread_id2name(cli->pid), time_sec, err);
264 } else {
265 printf("[%s : %ds]Version : %s\n", thread_id2name(cli->pid), time_sec, version);
266 }
267
268 sleep(time_sec);
269 }
270 printf("[%s] exit.\n", thread_id2name(cli->pid));
271 return NULL;
272}
b.liu62240ee2024-11-07 17:52:45 +0800273#endif
b.liu87afc4c2024-08-14 17:33:45 +0800274
275int main(int argc, char *argv[])
276{
277 signal(SIGINT, sig_process);
278 signal(SIGQUIT, sig_process);
279 signal(SIGTERM, sig_process);
280 //signal(SIGTSTP, sig_process);
281 //signal(SIGSEGV, sig_process);
282
283 mbtk_log_init("radio","RIL_CLI");
284
285#ifdef MBTK_DUMP_SUPPORT
286 mbtk_debug_open(NULL, TRUE);
287#endif
288
289 //test2(0, "192.168.1.198");
290 //test2(1, "2409:8162:140:cd3c:1:2:1494:72ba");
291 //test2(1, "254.128.0.0.0.0.0.0.0.1.0.2.144.5.212.239");
292 //test2(1, "2400:3200::1");
293
294 if(mbtk_ril_init() != MBTK_RIL_ERR_SUCCESS)
295 {
296 return -1;
297 }
298
b.liu15f456b2024-10-31 20:16:06 +0800299 mbtk_ril_ser_state_change_cb_reg(ril_ser_state_change_cb);
300
301 mbtk_net_reg_state_change_cb_reg(net_reg_state_change_cb);
302
303 mbtk_call_state_change_cb_reg(call_state_change_cb);
304
305 mbtk_sms_state_change_cb_reg(sms_state_change_cb);
306
307 mbtk_radio_state_change_cb_reg(radio_state_change_cb);
308
309 mbtk_sim_state_change_cb_reg(sim_state_change_cb);
310
311 mbtk_pdp_state_change_cb_reg(pdp_state_change_cb);
312
313 mbtk_signal_state_change_cb_reg(signal_state_change_cb);
314
315 mbtk_ecall_state_change_cb_reg(ecall_state_change_cb);
316
b.liu62240ee2024-11-07 17:52:45 +0800317#if RIL_DEBUG_THREAD
b.liu87afc4c2024-08-14 17:33:45 +0800318 memset(cli_threads, 0, sizeof(ril_cli_thread_info_t) * CLI_THREAD_MAX);
319
320 pthread_t pid1, pid2, pid3;
321 if(pthread_create(&pid1, NULL, sub_thread_run, &cli_threads[0]))
322 {
323 printf("pthread_create() fail.");
324 goto exit;
325 }
326
327 if(pthread_create(&pid2, NULL, sub_thread_run, &cli_threads[1]))
328 {
329 printf("pthread_create() fail.");
330 goto exit;
331 }
332
333 if(pthread_create(&pid3, NULL, sub_thread_run, &cli_threads[2]))
334 {
335 printf("pthread_create() fail.");
336 goto exit;
337 }
338#endif
339 printf(">>>>>>>>>>>>>>>>>>>>>>>>Enter cmd:\n");
340 char cmd[100];
341 while(1)
342 {
343 memset(cmd, 0, 100);
344 mbtk_ril_err_enum err;
345 if(fgets(cmd, 100, stdin))
346 {
347 char *ptr = cmd + strlen(cmd) - 1;
348 while(ptr >= cmd && (*ptr == '\r' || *ptr == '\n'))
349 {
350 *ptr-- = '\0';
351 }
352 if(!strncasecmp(cmd, "version", 7))
353 {
354 char version[50] = {0};
355 err = mbtk_version_get(version);
356 if(err != MBTK_RIL_ERR_SUCCESS) {
357 printf("Error : %d\n", err);
358 } else {
359 printf("Version : %s\n", version);
360 }
361 }
362 else if(!strncasecmp(cmd, "imei", 4)){
363 char imei[50] = {0};
364 err = mbtk_imei_get(imei);
365 if(err != MBTK_RIL_ERR_SUCCESS) {
366 printf("Error : %d\n", err);
367 } else {
368 printf("IMEI : %s\n", imei);
369 }
370 } else if(!strncasecmp(cmd, "sn", 2)){
371 char sn[50] = {0};
372 err = mbtk_sn_get(sn);
373 if(err != MBTK_RIL_ERR_SUCCESS) {
374 printf("Error : %d\n", err);
375 } else {
376 printf("SN : %s\n", sn);
377 }
378 } else if(!strncasecmp(cmd, "meid", 4)){
379 char meid[50] = {0};
380 err = mbtk_meid_get(meid);
381 if(err != MBTK_RIL_ERR_SUCCESS) {
382 printf("Error : %d\n", err);
383 } else {
384 printf("MEID : %s\n", meid);
385 }
386 } else if(!strncasecmp(cmd, "volte", 5)){ // "volte" or "volte 0" or "volte 1"
387 int volte;
388 if(!strcasecmp(cmd, "volte")) { // Get
389 err = mbtk_volte_state_get(&volte);
390 if(err != MBTK_RIL_ERR_SUCCESS) {
391 printf("Error : %d\n", err);
392 } else {
393 printf("VoLTE : %d\n", volte);
394 }
395 } else { // Set
396 if(!strcasecmp(cmd, "volte 1")) { // Open VoLTE
397 volte = 1;
398 } else { // Close VoLTE
399 volte = 0;
400 }
401 err = mbtk_volte_state_set(volte);
402 if(err != MBTK_RIL_ERR_SUCCESS) {
403 printf("Error : %d\n", err);
404 } else {
405 printf("VoLTE set success\n");
406 }
407 }
408 } else if(!strncasecmp(cmd, "radio", 5)){ // "radio" or "radio 0" or "radio 1"
409 mbtk_radio_state_enum radio;
410 if(!strcasecmp(cmd, "radio")) { // Get
411 err = mbtk_radio_state_get(&radio);
412 if(err != MBTK_RIL_ERR_SUCCESS) {
413 printf("Error : %d\n", err);
414 } else {
415 printf("Radio : %d\n", radio);
416 }
417 } else { // Set
418 int reset;
419 int count = sscanf(cmd, "radio %d %d", &radio, &reset);
420 if(count > 0) {
421 if(count == 1) {
422 reset = 0;
423 }
424
425 err = mbtk_radio_state_set(radio, reset);
426 if(err != MBTK_RIL_ERR_SUCCESS) {
427 printf("Error : %d\n", err);
428 } else {
429 printf("Radio set success\n");
430 }
431 }
432 }
433 } else if(!strncasecmp(cmd, "temp", 4)){
434 int temp;
435 if(!strcasecmp(cmd, "temp 0")) {
436 err = mbtk_temp_get(MBTK_TEMP_TYPE_SOC, &temp);
437 if(err != MBTK_RIL_ERR_SUCCESS) {
438 printf("Error : %d\n", err);
439 } else {
440 printf("SOC : %d\n", temp);
441 }
442 } else if(!strcasecmp(cmd, "temp 1")) {
443 err = mbtk_temp_get(MBTK_TEMP_TYPE_RF, &temp);
444 if(err != MBTK_RIL_ERR_SUCCESS) {
445 printf("Error : %d\n", err);
446 } else {
447 printf("RF : %d\n", temp);
448 }
449 }
450 } else if(!strncasecmp(cmd, "cell_time", 9)){
451 char time[128] = {0};
452 err = mbtk_cell_time_get(time);
453 if(err != MBTK_RIL_ERR_SUCCESS) {
454 printf("Error : %d\n", err);
455 } else {
456 printf("Cell Time : %s\n", time);
457 }
458 } else if(!strncasecmp(cmd, "sim_state", 9)){
459 mbtk_sim_state_enum sim;
460 err = mbtk_sim_state_get(&sim);
461 if(err != MBTK_RIL_ERR_SUCCESS) {
462 printf("Error : %d\n", err);
463 } else {
464 printf("Sim State : %d\n", sim);
465 }
466 } else if(!strncasecmp(cmd, "sim_type", 8)){
467 mbtk_sim_card_type_enum type;
468 err = mbtk_sim_type_get(&type);
469 if(err != MBTK_RIL_ERR_SUCCESS) {
470 printf("Error : %d\n", err);
471 } else {
472 printf("Sim Type : %d\n", type);
473 }
474 } else if(!strncasecmp(cmd, "imsi", 4)){
475 char imsi[50] = {0};
476 err = mbtk_imsi_get(imsi);
477 if(err != MBTK_RIL_ERR_SUCCESS) {
478 printf("Error : %d\n", err);
479 } else {
480 printf("IMSI : %s\n", imsi);
481 }
482 } else if(!strncasecmp(cmd, "iccid", 5)){
483 char iccid[50] = {0};
484 err = mbtk_iccid_get(iccid);
485 if(err != MBTK_RIL_ERR_SUCCESS) {
486 printf("Error : %d\n", err);
487 } else {
488 printf("ICCID : %s\n", iccid);
489 }
490 } else if(!strncasecmp(cmd, "pn", 2)){
491 char phone_number[50] = {0};
492 err = mbtk_phone_number_get(phone_number);
493 if(err != MBTK_RIL_ERR_SUCCESS) {
494 printf("Error : %d\n", err);
495 } else {
496 printf("Phone Number : %s\n", phone_number);
497 }
498 }
499 /*
500 printf("pin_state:Get Sim lock state.\n");
501 printf("pin_times:Get PIN/PUK last times.\n");
502 printf("pin_open <PIN>:Enable sim lock.\n");
503 printf("pin_close <PIN>:Disable sim lock.\n");
504 printf("pin_change <old_pin> <new_pin>:Change sim PIN.\n");
505 printf("pin_verify <PIN>:Verify PIN.\n");
506 printf("puk_verify <PUK> <PIN>:Verify PUK.\n");
507 */
508 else if(!strncasecmp(cmd, "pin_state", 9)){
509 int lock_state;
510 err = mbtk_sim_lock_get(&lock_state);
511 if(err != MBTK_RIL_ERR_SUCCESS) {
512 printf("Error : %d\n", err);
513 } else {
514 printf("PIN state : %d\n", lock_state);
515 }
516 } else if(!strncasecmp(cmd, "pin_times", 9)){
517 mbtk_pin_puk_last_times_t times;
518 err = mbtk_sim_lock_retry_times_get(&times);
519 if(err != MBTK_RIL_ERR_SUCCESS) {
520 printf("Error : %d\n", err);
521 } else {
522 printf("PIN/PUK retry times:%d,%d,%d,%d\n", times.p1_retry, times.p2_retry, times.puk1_retry, times.puk2_retry);
523 }
524 } else if(!strncasecmp(cmd, "pin_open", 8)){
525 mbtk_sim_lock_info_t info;
526 info.type = MBTK_SIM_LOCK_TYPE_ENABLE;
527 int count = sscanf(cmd, "pin_open %s", info.pin1);
528 if(count == 1) {
529 err = mbtk_sim_lock_set(&info);
530 if(err != MBTK_RIL_ERR_SUCCESS) {
531 printf("Error : %d\n", err);
532 } else {
533 printf("Enable sim lock success.\n");
534 }
535 }
536 } else if(!strncasecmp(cmd, "pin_close", 9)){
537 mbtk_sim_lock_info_t info;
538 info.type = MBTK_SIM_LOCK_TYPE_DISABLE;
539 int count = sscanf(cmd, "pin_close %s", info.pin1);
540 if(count == 1) {
541 err = mbtk_sim_lock_set(&info);
542 if(err != MBTK_RIL_ERR_SUCCESS) {
543 printf("Error : %d\n", err);
544 } else {
545 printf("Disable sim lock success.\n");
546 }
547 }
548 } else if(!strncasecmp(cmd, "pin_change", 10)){
549 mbtk_sim_lock_info_t info;
550 info.type = MBTK_SIM_LOCK_TYPE_CHANGE;
551 int count = sscanf(cmd, "pin_change %s %s", info.pin1, info.pin2);
552 if(count == 2) {
553 err = mbtk_sim_lock_set(&info);
554 if(err != MBTK_RIL_ERR_SUCCESS) {
555 printf("Error : %d\n", err);
556 } else {
557 printf("PIN change success.\n");
558 }
559 }
560 } else if(!strncasecmp(cmd, "pin_verify", 10)){
561 mbtk_sim_lock_info_t info;
562 info.type = MBTK_SIM_LOCK_TYPE_VERIFY_PIN;
563 int count = sscanf(cmd, "pin_verify %s", info.pin1);
564 if(count == 1) {
565 err = mbtk_sim_lock_set(&info);
566 if(err != MBTK_RIL_ERR_SUCCESS) {
567 printf("Error : %d\n", err);
568 } else {
569 printf("PIN verify success.\n");
570 }
571 }
572 } else if(!strncasecmp(cmd, "puk_verify", 10)){
573 mbtk_sim_lock_info_t info;
574 info.type = MBTK_SIM_LOCK_TYPE_VERIFY_PUK;
575 int count = sscanf(cmd, "puk_verify %s %s", info.puk, info.pin1);
576 if(count == 2) {
577 err = mbtk_sim_lock_set(&info);
578 if(err != MBTK_RIL_ERR_SUCCESS) {
579 printf("Error : %d\n", err);
580 } else {
581 printf("PUK verify success.\n");
582 }
583 }
584 } else if(!strncasecmp(cmd, "plmn", 4)){
585 mbtk_plmn_info info;
586 err = mbtk_plmn_list_get(&info);
587 if(err != MBTK_RIL_ERR_SUCCESS) {
588 printf("Error : %d\n", err);
589 } else {
590 printf("PLMN number:%d\n", info.count);
591 int i = 0;
592 while(i < info.count) {
593 printf("%d,%d,%s\n", i+1, info.plmn[i].format, info.plmn[i].name);
594 i++;
595 }
596 }
597 }
598 else if(!strncasecmp(cmd, "avail_net", 9)){
599 mbtk_net_info_array_t net_list;
600 err = mbtk_available_net_get(&net_list);
601 if(err != MBTK_RIL_ERR_SUCCESS) {
602 printf("Error : %d\n", err);
603 } else {
604 printf("Available net number:%d\n", net_list.num);
605 int i = 0;
606 while(i < net_list.num) {
607 printf("NET : %d,%d,%d,%d\n", net_list.net_info[i].net_sel_mode,
608 net_list.net_info[i].net_type, net_list.net_info[i].net_state,
609 net_list.net_info[i].plmn);
610 i++;
611 }
612 }
613 } else if(!strncasecmp(cmd, "sel_mode", 8)){ // "sel_mode" or "sel_mode 1 7 46000"
614 mbtk_net_info_t net;
615 memset(&net, 0, sizeof(mbtk_net_info_t));
616 if(!strcasecmp(cmd, "sel_mode")) { // Get
617 err = mbtk_net_sel_mode_get(&net);
618 if(err != MBTK_RIL_ERR_SUCCESS) {
619 printf("Error : %d\n", err);
620 } else {
621 printf("Net : %d, %d, %d, %d\n", net.net_sel_mode, net.net_type, net.net_state, net.plmn);
622 }
623 } else { // Set
624 char *ptr = strstr(cmd, " ");
625 if(ptr == NULL)
626 continue;
627 while(*ptr != '\0' && *ptr == ' ')
628 ptr++;
629 net.net_sel_mode = (uint8)atoi(ptr);
630
631 ptr = strstr(ptr, " ");
632 if(ptr == NULL)
633 continue;
634 while(*ptr != '\0' && *ptr == ' ')
635 ptr++;
636 net.net_type = (uint8)atoi(ptr);
637
638 ptr = strstr(ptr, " ");
639 if(ptr == NULL)
640 continue;
641 while(*ptr != '\0' && *ptr == ' ')
642 ptr++;
643 net.plmn = (uint32)atoi(ptr);
644
645 err = mbtk_net_sel_mode_set(&net);
646 if(err != MBTK_RIL_ERR_SUCCESS) {
647 printf("Error : %d\n", err);
648 } else {
649 printf("Net select mode set success\n");
650 }
651 }
652 } else if(!strncasecmp(cmd, "band", 4)){ // "band" or "band support" or "band 0 79 147 482 524503"
653 mbtk_band_info_t band;
654 memset(&band, 0x0, sizeof(mbtk_band_info_t));
655 if(!strcasecmp(cmd, "band")) { // Get
656 err = mbtk_current_band_get(&band);
657 if(err != MBTK_RIL_ERR_SUCCESS) {
658 printf("Error : %d\n", err);
659 } else {
660 printf("Band : %d, %d, %d, %d, %d, %d\n", band.net_pref, band.gsm_band, band.umts_band, band.tdlte_band, band.fddlte_band, band.lte_ext_band);
661 }
662 } else if(!strcasecmp(cmd, "band support")) { // Get
663 err = mbtk_support_band_get(&band);
664 if(err != MBTK_RIL_ERR_SUCCESS) {
665 printf("Error : %d\n", err);
666 } else {
667 printf("Band : %d, %d, %d, %d, %d, %d\n", band.net_pref, band.gsm_band, band.umts_band, band.tdlte_band, band.fddlte_band, band.lte_ext_band);
668 }
669 } else { // "band 0 79 147 482 524503"
670 char *ptr = strstr(cmd, " ");
671 if(ptr == NULL)
672 continue;
673 while(*ptr != '\0' && *ptr == ' ')
674 ptr++;
675 band.net_pref = (uint8)atoi(ptr);
676
677 ptr = strstr(ptr, " ");
678 if(ptr == NULL)
679 continue;
680 while(*ptr != '\0' && *ptr == ' ')
681 ptr++;
682 band.gsm_band = (uint16)atoi(ptr);
683
684 ptr = strstr(ptr, " ");
685 if(ptr == NULL)
686 continue;
687 while(*ptr != '\0' && *ptr == ' ')
688 ptr++;
689 band.umts_band = (uint16)atoi(ptr);
690
691 ptr = strstr(ptr, " ");
692 if(ptr == NULL)
693 continue;
694 while(*ptr != '\0' && *ptr == ' ')
695 ptr++;
696 band.tdlte_band = (uint32)atoi(ptr);
697
698 ptr = strstr(ptr, " ");
699 if(ptr == NULL)
700 continue;
701 while(*ptr != '\0' && *ptr == ' ')
702 ptr++;
703 band.fddlte_band = (uint32)atoi(ptr);
704
705 err = mbtk_current_band_set(&band);
706 if(err != MBTK_RIL_ERR_SUCCESS) {
707 printf("Error : %d\n", err);
708 } else {
709 printf("Band set success\n");
710 }
711 }
712 } else if(!strncasecmp(cmd, "signal", 6)){
713 mbtk_signal_info_t signal;
714 err = mbtk_net_signal_get(&signal);
715 if(err != MBTK_RIL_ERR_SUCCESS) {
716 printf("Error : %d\n", err);
717 } else {
718 printf("Signal : %d, %d, %d, %d, %d, %d, %d, %d\n", signal.type, signal.rssi, signal.rxlev, signal.ber,
719 signal.rscp, signal.ecno, signal.rsrq, signal.rsrp);
720 }
721 } else if(!strncasecmp(cmd, "reg", 3)){
722 mbtk_net_reg_info_t reg;
723 err = mbtk_net_reg_get(&reg);
724 if(err != MBTK_RIL_ERR_SUCCESS) {
725 printf("Error : %d\n", err);
726 } else {
727 printf("REG : call_state=%d, data_state=%d, ims_state=%d, net_type=%d, %04x, %08x\n", reg.call_state, reg.data_state, reg.ims_state, reg.type, reg.lac, reg.ci);
728 }
729 } else if(!strncasecmp(cmd, "apn_del", 7)) {
730 mbtk_apn_info_t apn;
731 memset(&apn, 0, sizeof(mbtk_apn_info_t));
732 int cid, auto_save;
733 int count = sscanf(cmd, "apn_del %d %d", &cid, &auto_save);
734 if(count == 2) {
735 apn.cid = (mbtk_ril_cid_enum)cid;
736 apn.auto_save = (uint8)auto_save;
737 }
738 err = mbtk_apn_set(&apn);
739 if(err != MBTK_RIL_ERR_SUCCESS) {
740 printf("Error : %d\n", err);
741 } else {
742 printf("APN delete success\n");
743 }
744
745 } else if(!strncasecmp(cmd, "apn", 3)){
746 if(!strcasecmp(cmd, "apn")) { // Get apn
747 mbtk_apn_info_array_t apns;
748 err = mbtk_apn_get(&apns);
749 if(err != MBTK_RIL_ERR_SUCCESS) {
750 printf("Error : %d\n", err);
751 } else {
752 printf("APN Num:%d\n", apns.num);
753 int i = 0;
754 while(i < apns.num) {
b.liu10a34102024-08-20 20:36:24 +0800755 // printf("APN : %d, %s, %s\n", apns.apns[i].cid, apn2str(apns.apns[i].ip_type), apns.apns[i].apn);
756 printf("APN : %d, %s, auth-%d, auto_save-%d, auto_boot_call-%d, %s, %s, %s, %s\n", apns.apns[i].cid, apn2str(apns.apns[i].ip_type),
757 apns.apns[i].auth, apns.apns[i].auto_save, apns.apns[i].auto_boot_call,
b.liu62240ee2024-11-07 17:52:45 +0800758 str_empty(apns.apns[i].apn) ? "NULL" : (char*)apns.apns[i].apn,
759 str_empty(apns.apns[i].user) ? "NULL" : (char*)apns.apns[i].user,
760 str_empty(apns.apns[i].pass) ? "NULL" : (char*)apns.apns[i].pass,
761 str_empty(apns.apns[i].type) ? "NULL" : (char*)apns.apns[i].type);
b.liu87afc4c2024-08-14 17:33:45 +0800762 i++;
763 }
b.liu10a34102024-08-20 20:36:24 +0800764 printf("Def route : %d, def dns : %d\n", apns.cid_for_def_route, apns.cid_for_def_dns);
b.liu87afc4c2024-08-14 17:33:45 +0800765 }
766 } else { // apn <cid> <0/1/2/3> <0/1> <0/1> <apn>
767 mbtk_apn_info_t apn;
768 memset(&apn, 0, sizeof(mbtk_apn_info_t));
769#if 1
b.liubcf86c92024-08-19 19:48:28 +0800770 int cid, ip_type, auto_save, auto_boot_call, def_route, as_dns;
771 int count = sscanf(cmd, "apn %d %d %d %d %d %d %s",
772 &cid, &ip_type, &auto_save, &auto_boot_call,
773 &def_route, &as_dns, apn.apn);
b.liu87afc4c2024-08-14 17:33:45 +0800774
775 // Delete APN
b.liu62240ee2024-11-07 17:52:45 +0800776 if(strcmp((char*)apn.apn,"null") == 0 || strcmp((char*)apn.apn,"NULL") == 0) {
b.liu87afc4c2024-08-14 17:33:45 +0800777 memset(apn.apn, 0, sizeof(apn.apn));
778 }
b.liubcf86c92024-08-19 19:48:28 +0800779 if(count == 7) {
b.liu87afc4c2024-08-14 17:33:45 +0800780 apn.cid = (mbtk_ril_cid_enum)cid;
781 apn.ip_type = (mbtk_ip_type_enum)ip_type;
782 apn.auto_save = (uint8)auto_save;
783 apn.auto_boot_call = (uint8)auto_boot_call;
b.liubcf86c92024-08-19 19:48:28 +0800784 apn.def_route = (uint8)def_route;
785 apn.as_dns = (uint8)as_dns;
b.liu87afc4c2024-08-14 17:33:45 +0800786 }
787#else
788 char *ptr = strstr(cmd, " ");
789 if(ptr == NULL)
790 continue;
791 while(*ptr != '\0' && *ptr == ' ')
792 ptr++;
793 apn.cid = (mbtk_ril_cid_enum)atoi(ptr);
794
795 ptr = strstr(ptr, " ");
796 if(ptr == NULL)
797 continue;
798 while(*ptr != '\0' && *ptr == ' ')
799 ptr++;
800 apn.ip_type = (mbtk_ip_type_enum)atoi(ptr);
801
802 ptr = strstr(ptr, " ");
803 if(ptr == NULL)
804 continue;
805 while(*ptr != '\0' && *ptr == ' ')
806 ptr++;
807 memcpy(apn.apn, ptr, strlen(ptr));
808#endif
809 err = mbtk_apn_set(&apn);
810 if(err != MBTK_RIL_ERR_SUCCESS) {
811 printf("Error : %d\n", err);
812 } else {
813 printf("APN set success\n");
814 }
815 }
816 }
b.liubcf86c92024-08-19 19:48:28 +0800817 else if(!strncasecmp(cmd, "data_call", 9)){ // data_call <0/1/2> <cid> <timeout>
818 // mbtk_ril_cid_enum cid, bool auto_boot_call, bool def_route, int retry_interval, int timeout, mbtk_ip_info_t *rsp_info
819 // data_call <0/1/2> <cid> <timeout>
820 int type, cid, auto_boot_call, def_route, as_dns;
821 int count = sscanf(cmd, "data_call %d %d %d %d %d", &type, &cid, &auto_boot_call, &def_route, &as_dns);
822 if(count != 5) {
823 count = sscanf(cmd, "data_call %d %d", &type, &cid);
824 }
825
826 if(count == 5 || count == 2) {
827 mbtk_ip_info_t ip;
828 memset(&ip, 0, sizeof(mbtk_ip_info_t));
829 if(type == MBTK_DATA_CALL_START) {
b.liu15f456b2024-10-31 20:16:06 +0800830 int retry_interval[] = {5, 10, 15};
b.liuafdf2c62024-11-12 11:10:44 +0800831 if(count == 5) {
832 err = mbtk_data_call_start((mbtk_ril_cid_enum)cid, (mbtk_data_call_item_state_enum)auto_boot_call,
833 (mbtk_data_call_item_state_enum)def_route, (mbtk_data_call_item_state_enum)as_dns, retry_interval,
b.liu15f456b2024-10-31 20:16:06 +0800834 3, 0, &ip);
b.liuafdf2c62024-11-12 11:10:44 +0800835 } else {
836 mbtk_data_call_start((mbtk_ril_cid_enum)cid, MBTK_DATA_CALL_ITEM_STATE_NON,
837 MBTK_DATA_CALL_ITEM_STATE_NON, MBTK_DATA_CALL_ITEM_STATE_NON, retry_interval,
838 3, 0, &ip);
839 }
b.liubcf86c92024-08-19 19:48:28 +0800840 } else if(type == MBTK_DATA_CALL_STOP) {
841 err = mbtk_data_call_stop((mbtk_ril_cid_enum)cid, 10);
842 } else {
843 err = mbtk_data_call_state_get((mbtk_ril_cid_enum)cid, &ip);
844 }
845 if(err) {
846 printf("Error : %d\n", err);
847 } else {
848 printf("DATA_CALL success\n");
849 if(type == MBTK_DATA_CALL_START || type == MBTK_DATA_CALL_STATE) {
850 if(ip.ipv4.valid) {
851 // log_hex("IPv4", &ipv4, sizeof(mbtk_ipv4_info_t));
852 char ip_tmp[20];
853
854 memset(ip_tmp, 0, 20);
855 if(inet_ntop(AF_INET, &(ip.ipv4.IPAddr), ip_tmp, 20) == NULL) {
856 printf("IP error.\n");
857 } else {
858 printf("IP : %s\n", ip_tmp);
859 }
860
861 memset(ip_tmp, 0, 20);
862 if(inet_ntop(AF_INET, &(ip.ipv4.PrimaryDNS), ip_tmp, 20) == NULL) {
863 printf("PrimaryDNS error.\n");
864 } else {
865 printf("PrimaryDNS : %s\n", ip_tmp);
866 }
867
868 memset(ip_tmp, 0, 20);
869 if(inet_ntop(AF_INET, &(ip.ipv4.SecondaryDNS), ip_tmp, 20) == NULL) {
870 printf("SecondaryDNS error.\n");
871 } else {
872 printf("SecondaryDNS : %s\n", ip_tmp);
873 }
874
875 memset(ip_tmp, 0, 20);
876 if(inet_ntop(AF_INET, &(ip.ipv4.GateWay), ip_tmp, 20) == NULL) {
877 printf("GateWay error.\n");
878 } else {
879 printf("GateWay : %s\n", ip_tmp);
880 }
881
882 memset(ip_tmp, 0, 20);
883 if(inet_ntop(AF_INET, &(ip.ipv4.NetMask), ip_tmp, 20) == NULL) {
884 printf("NetMask error.\n");
885 } else {
886 printf("NetMask : %s\n", ip_tmp);
887 }
888 }
889
890 if(ip.ipv6.valid) {
891 // log_hex("IPv6", &ipv6, sizeof(mbtk_ipv6_info_t));
892 char ip_tmp[50];
893
894 memset(ip_tmp, 0, 50);
895 if(ipv6_2_str(&(ip.ipv6.IPV6Addr), ip_tmp)) {
896 printf("IP error.\n");
897 } else {
898 printf("IP : %s\n", ip_tmp);
899 }
900
901 memset(ip_tmp, 0, 50);
902 if(ipv6_2_str(&(ip.ipv6.PrimaryDNS), ip_tmp)) {
903 printf("PrimaryDNS error.\n");
904 } else {
905 printf("PrimaryDNS : %s\n", ip_tmp);
906 }
907
908 memset(ip_tmp, 0, 50);
909 if(ipv6_2_str(&(ip.ipv6.SecondaryDNS), ip_tmp)) {
910 printf("SecondaryDNS error.\n");
911 } else {
912 printf("SecondaryDNS : %s\n", ip_tmp);
913 }
914
915 memset(ip_tmp, 0, 50);
916 if(ipv6_2_str(&(ip.ipv6.GateWay), ip_tmp)) {
917 printf("GateWay error.\n");
918 } else {
919 printf("GateWay : %s\n", ip_tmp);
920 }
921
922 memset(ip_tmp, 0, 50);
923 if(ipv6_2_str(&(ip.ipv6.NetMask), ip_tmp)) {
924 printf("NetMask error.\n");
925 } else {
926 printf("NetMask : %s\n", ip_tmp);
927 }
928 }
929 }
930 }
931 }
932 }
b.liu87afc4c2024-08-14 17:33:45 +0800933 else if(!strncasecmp(cmd, "cell", 4)){
934 char *ptr = strstr(cmd, ","); //CPMS,ME,ME,ME
935 if(ptr == NULL)
936 {
b.liub4772072024-08-15 14:47:03 +0800937 mbtk_cell_info_array_t cell;
938 err = mbtk_cell_get(&cell);
939 if(err) {
b.liu87afc4c2024-08-14 17:33:45 +0800940 printf("Error : %d\n", err);
b.liub4772072024-08-15 14:47:03 +0800941 } else if(cell.num > 0){
942 // Current server cell.
943 switch(cell.type)
b.liu87afc4c2024-08-14 17:33:45 +0800944 {
b.liub4772072024-08-15 14:47:03 +0800945 case MBTK_CELL_TYPE_GSM:
946 printf("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell.cell[0].value1, cell.cell[0].value2, cell.cell[0].value3, cell.cell[0].value4);
947 break;
948 case MBTK_CELL_TYPE_UMTS:
949 printf("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell.cell[0].value1, cell.cell[0].value2, cell.cell[0].value3);
950 break;
951 case MBTK_CELL_TYPE_LTE:
952 printf("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell.cell[0].value1, cell.cell[0].value2, cell.cell[0].value3, cell.cell[0].value4, cell.cell[0].value5);
953 break;
954 default:
955 break;
956 }
957
958 int i = 1;
959 while (i < cell.num)
960 {
961 switch(cell.type)
b.liu87afc4c2024-08-14 17:33:45 +0800962 {
b.liub4772072024-08-15 14:47:03 +0800963 case MBTK_CELL_TYPE_GSM:
964 printf("CELL : %d, %d, %d, %d, %d", cell.cell[i].value1, cell.cell[i].value2, cell.cell[i].value3, cell.cell[i].value4, cell.cell[i].value5);
b.liu87afc4c2024-08-14 17:33:45 +0800965 break;
b.liub4772072024-08-15 14:47:03 +0800966 case MBTK_CELL_TYPE_UMTS:
967 printf("CELL : lac=%d, ci=%d, arfcn=%d\n", cell.cell[i].value1, cell.cell[i].value2, cell.cell[i].value3);
b.liu87afc4c2024-08-14 17:33:45 +0800968 break;
b.liub4772072024-08-15 14:47:03 +0800969 case MBTK_CELL_TYPE_LTE:
970 printf("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell.cell[i].value1, cell.cell[i].value2, cell.cell[i].value3, cell.cell[i].value4);
b.liu87afc4c2024-08-14 17:33:45 +0800971 break;
972 default:
973 break;
974 }
b.liub4772072024-08-15 14:47:03 +0800975 i++;
b.liu87afc4c2024-08-14 17:33:45 +0800976 }
b.liub4772072024-08-15 14:47:03 +0800977 } else {
978 printf("Cell no found.");
b.liu87afc4c2024-08-14 17:33:45 +0800979 }
b.liu87afc4c2024-08-14 17:33:45 +0800980 }
981 else{
982 char *ptr = strstr(cmd, ","); //cell,2,3,,40936,430
983 char mem[50]={0};
984 char resp[1024] = {0};
985 if(ptr != NULL)
986 {
987 ptr++;
988 memset(mem, 0, sizeof(mem));
989 memcpy(mem, ptr, strlen(ptr));
990 printf("cell:%s\n", mem);
991 }
992 printf("cell_mem: %s \n", mem);
993
994 memset(resp, 0, sizeof(resp));
b.liub4772072024-08-15 14:47:03 +0800995 err = mbtk_cell_set(mem, resp);
b.liu87afc4c2024-08-14 17:33:45 +0800996 if(err) {
997 printf("Error : %d\n", err);
998 } else {
999 printf("cell set . resp:%s\n", resp);
1000 }
b.liu87afc4c2024-08-14 17:33:45 +08001001 }
b.liub4772072024-08-15 14:47:03 +08001002 }
1003 else if(!strncasecmp(cmd, "call", 4)){
b.liu87afc4c2024-08-14 17:33:45 +08001004 char phone_number[12];
1005 char *ptr = strstr(cmd, " ");
1006 if(ptr == NULL)
1007 continue;
1008 while(*ptr != '\0' && *ptr == ' ')
1009 ptr++;
1010 memset(phone_number,0,strlen(phone_number));
1011 memcpy(phone_number,ptr,strlen(ptr));
1012 printf("phone number is: %s\n",phone_number);
b.liub4772072024-08-15 14:47:03 +08001013 err = mbtk_call_start(phone_number);
b.liu87afc4c2024-08-14 17:33:45 +08001014 if(err) {
1015 printf("Error : %d\n", err);
1016 } else {
1017 printf("Call success.\n");
1018 }
1019 } else if(!strncasecmp(cmd, "answer", 6)){
b.liub4772072024-08-15 14:47:03 +08001020 err = mbtk_call_answer();
b.liu87afc4c2024-08-14 17:33:45 +08001021 if(err) {
1022 printf("Error : %d\n", err);
1023 } else {
1024 printf("Call success.\n");
1025 }
1026 } else if(!strncasecmp(cmd, "hangup", 6)){
b.liu62240ee2024-11-07 17:52:45 +08001027 int phone_id = 1;
b.liu87afc4c2024-08-14 17:33:45 +08001028 if(!strcasecmp(cmd, "hangup")) { // hang up all
b.liub4772072024-08-15 14:47:03 +08001029 err = mbtk_call_hang();
b.liu87afc4c2024-08-14 17:33:45 +08001030 if(err) {
1031 printf("Error : %d\n", err);
1032 } else {
1033 printf("Call hang up all.\n");
1034 }
1035 } else if(!strcasecmp(cmd, "hangup 0")) {
b.liub4772072024-08-15 14:47:03 +08001036 err = mbtk_waiting_or_background_call_hang();
b.liu87afc4c2024-08-14 17:33:45 +08001037 if(err) {
1038 printf("Error : %d\n", err);
1039 } else {
1040 printf("Call hang up waiting or background.\n");
1041 }
1042 } else if(!strcasecmp(cmd, "hangup 3")) {
b.liub4772072024-08-15 14:47:03 +08001043 err = mbtk_foreground_resume_background_call_hang();
b.liu87afc4c2024-08-14 17:33:45 +08001044 if(err) {
1045 printf("Error : %d\n", err);
1046 } else {
1047 printf("Call hang up foreground resume background.\n");
1048 }
1049 } else {
1050 if(!strcasecmp(cmd, "hangup 1")) { // hang up a call
1051 phone_id = 1;
1052 } else if(!strcasecmp(cmd, "hangup 2")) {
1053 phone_id = 2;
1054 } else {
1055 printf("Error : Invalid input\n");
1056 }
b.liub4772072024-08-15 14:47:03 +08001057 err = mbtk_a_call_hang(phone_id);
b.liu87afc4c2024-08-14 17:33:45 +08001058 if(err) {
1059 printf("Error : %d\n", err);
1060 } else {
1061 printf("A Call hang up.\n");
1062 }
1063 }
1064 } else if(!strncasecmp(cmd, "waitin", 6)){
1065 mbtk_call_info_t reg;
b.liub4772072024-08-15 14:47:03 +08001066 err = mbtk_call_reg_get(&reg);
b.liu87afc4c2024-08-14 17:33:45 +08001067 if(err) {
1068 printf("Error : %d\n", err);
1069 } else {
1070 if(reg.call_wait == 0) {
1071 printf("No call ring\n");
1072 }
1073 else {
1074 printf("RING : %d, %d, %d, %d, %d, %s, %d\n", reg.dir1, reg.dir, reg.state, reg.mode, reg.mpty, reg.phone_number, reg.type);
1075 }
1076 }
1077 } else if(!strncasecmp(cmd, "mute", 4)){ // "mute" or "mute 0" or "mute 1"
1078 int mute;
1079 if(!strcasecmp(cmd, "mute")) { // Get
b.liub4772072024-08-15 14:47:03 +08001080 err = mbtk_mute_state_get(&mute);
b.liu87afc4c2024-08-14 17:33:45 +08001081 if(err) {
1082 printf("Error : %d\n", err);
1083 } else {
1084 printf("mute : %d\n", mute);
1085 }
1086 } else { // Set
1087 if(!strcasecmp(cmd, "mute 1")) { // on mute
1088 mute = 1;
1089 } else { // off mute
1090 mute = 0;
1091 }
b.liub4772072024-08-15 14:47:03 +08001092 err = mbtk_mute_state_set(mute);
b.liu87afc4c2024-08-14 17:33:45 +08001093 if(err) {
1094 printf("Error : %d\n", err);
1095 } else {
1096 printf("mute set success\n");
1097 }
1098 }
1099 } else if(!strncasecmp(cmd, "DTMF", 4)){ // valid character: (0, 1, ..., 9, A, B, C, D, *, #)
1100
1101 mbtk_call_dtmf_info_t reg;
1102
1103 char *ptr = strstr(cmd, " ");
1104 if(ptr == NULL)
1105 continue;
1106 while(*ptr != '\0' && *ptr == ' ')
1107 ptr++;
1108 reg.character = *ptr;
1109
1110 ptr = strstr(ptr, " ");
1111 if(ptr == NULL)
1112 continue;
1113 while(*ptr != '\0' && *ptr == ' ')
1114 ptr++;
1115 reg.duration = (uint32)atoi(ptr);
1116 printf("DTMF character is: %c,%d\n",reg.character, reg.duration);
b.liub4772072024-08-15 14:47:03 +08001117 err = mbtk_dtmf_send(&reg);
b.liu87afc4c2024-08-14 17:33:45 +08001118 if(err) {
1119 printf("Error : %d\n", err);
1120 } else {
1121 printf("DTMF success.\n");
1122 }
b.liub4772072024-08-15 14:47:03 +08001123 } else if(!strncasecmp(cmd, "cmgf", 4)){ // set mode 0: pud, 1:text
1124 int mode;
1125 if(!strcasecmp(cmd, "cmgf")) { // Get
1126 err = mbtk_sms_cmgf_get(&mode);
1127 if(err) {
1128 printf("Error : %d\n", err);
1129 } else {
1130 printf("VoLTE : %d\n", mode);
1131 }
1132 } else { // Set
1133 if(!strcasecmp(cmd, "cmgf 1")) { // cmgf 1
1134 mode = 1;
1135 } else { //
1136 mode = 0;
1137 }
1138 printf("mode:%d\n", mode);
1139 sleep(2);
1140 err = mbtk_sms_cmgf_set(mode);
1141 if(err) {
1142 printf("Error : %d\n", err);
1143 } else {
1144 printf("VoLTE set success\n");
1145 }
1146 }
1147 }else if(!strncasecmp(cmd, "cpms", 4)){ // //CPMS=ME, ME, ME
1148 char mem[100] = {0};
1149 char resp[100] = {0};
1150 if(!strcasecmp(cmd, "cpms")) { // Get
b.liu62240ee2024-11-07 17:52:45 +08001151 err = mbtk_sms_cpms_get(mem);
b.liub4772072024-08-15 14:47:03 +08001152 if(err) {
1153 printf("Error : %d\n", err);
1154 } else {
1155 printf("cpms : %s\n", mem);
1156 }
1157 } else { // Set
1158
1159 char *ptr = strstr(cmd, ","); //CPMS,ME,ME,ME
1160 if(ptr != NULL)
1161 {
1162 ptr++;
1163 memset(mem, 0, sizeof(mem));
1164 memcpy(mem, ptr, strlen(ptr));
1165 printf("cpms:%s\n", mem);
1166 }
1167 printf("cpms 0\n");
1168
1169 memset(resp, 0, sizeof(resp));
1170 err = mbtk_sms_cpms_set(mem, resp);
1171 if(err) {
1172 printf("Error : %d\n", err);
1173 } else {
1174 printf("cpms set success. resp:%s\n", resp);
1175 }
1176 }
1177 }else if(!strncasecmp(cmd, "cmgs", 4)){ // AT+CMGS="10086", CMGS TEST
1178 char cmgs[1024] = {0};
1179 char resp[50] = {0};
1180 if(!strcasecmp(cmd, "cmgs")) { // Get
1181 int mode;
1182 // err = mbtk_sms_cmgs_get(info_handle, &mode);
1183 if(err) {
1184 printf("Error : %d\n", err);
1185 } else {
1186 printf("VoLTE : %d\n", mode);
1187 }
1188 } else { // Set
1189
1190 /*
1191 *AT+CMGS="10086", CMGS TEST // Send a SMS
1192 > CMGS TEST
1193 +CMGS: 17
1194 OK
1195 */
1196
1197 char *ptr = strstr(cmd, "cmgs,"); //CMGS="10086",hf
1198 if(ptr != NULL)
1199 {
1200 ptr = strstr(cmd, ",");
1201 ptr++;
1202 memset(cmgs, 0, sizeof(cmgs));
1203 memcpy(cmgs, ptr, strlen(ptr));
1204 printf("1cmgs:%s, strlen(cmgs):%d\n", cmgs, strlen(cmgs));
1205 }
1206
1207 memset(resp, 0, sizeof(resp));
1208 err = mbtk_sms_cmgs_set(cmgs, resp);
1209 if(err) {
1210 printf("Error : %d\n", err);
1211 } else {
1212 printf("cmgs set success . resp:%s\n", resp);
1213 }
1214 }
1215 }else if(!strncasecmp(cmd, "cmss", 4)){ // +CMSS=<index>[,<da>[,<toda>]]
1216 char cmss[20] = {0};
1217 char resp[20] = {0};
1218 if(!strcasecmp(cmd, "cmgs")) { // Get
1219 printf("cmss : OK\n");
1220
1221 } else {
1222 char *ptr = strstr(cmd, "cmss,"); //CMSS=<index>
1223 if(ptr != NULL)
1224 {
1225 ptr = strstr(cmd, ",");
1226 ptr++;
1227 memset(cmss, 0, sizeof(cmss));
1228 memcpy(cmss, ptr, strlen(ptr));
1229 printf("1cmss:%s\n", cmss);
1230 }
1231
1232
1233 err = mbtk_sms_cmss_set(cmss, resp);
1234 if(err) {
1235 printf("Error : %d\n", err);
1236 } else {
1237 printf("cmss set success. resp:%s\n", resp);
1238 }
1239 }
1240 }
1241 else if(!strncasecmp(cmd, "cmgr", 4)){ // +CMGR=<index
1242 int index = 0;
1243 char resp[1024] = {0};
1244 if(!strcasecmp(cmd, "cmgr")) { // Get
1245 printf("cmgr : OK\n");
1246
1247 } else {
1248 char *ptr = strstr(cmd, "cmgr,"); //+CMGR <index>
1249 if(ptr != NULL)
1250 {
1251 ptr = strstr(cmd, ",");
1252 ptr++;
1253 index = atoi(ptr);
1254 }
1255 printf("1index:%d\n", index);
1256
1257 memset(resp, 0, sizeof(resp));
1258 err = mbtk_sms_cmgr_set(index, resp);
1259 if(err) {
1260 printf("Error : %d\n", err);
1261 } else {
1262 printf("cmgr set success. rep:%s\n", resp);
1263 }
1264 }
1265 }
1266 else if(!strncasecmp(cmd, "cmgw", 4)){ // +CMGW=<oa/da>[,<tooa/toda>[,<stat>]]<CR>
1267 //+CMGW=<length>[,<stat>]<CR>PDU is given<ctrl-Z/ESC>
1268 char cmgw[128] = {0};
1269 char resp[50] = {0};
1270 if(!strcasecmp(cmd, "cmgw")) { // Get
1271 printf("cmgw : OK\n");
1272
1273 } else {
1274 char *ptr = strstr(cmd, "cmgw,"); //+CMGW, <oa/da>, data
1275 if(ptr != NULL)
1276 {
1277 ptr = strstr(cmd, ",");
1278 ptr++;
1279 memset(cmgw, 0, sizeof(cmgw));
1280 memcpy(cmgw, ptr, strlen(ptr));
1281 printf("cmgw:%s\n", cmgw);
1282 }
1283
1284 memset(resp, 0, sizeof(resp));
1285 err = mbtk_sms_cmgw_set(cmgw, resp);
1286 if(err) {
1287 printf("Error : %d\n", err);
1288 } else {
1289 printf("cmgw set success. resp:%s\n", resp);
1290 }
1291 }
1292 }
1293 else if(!strncasecmp(cmd, "cmgd", 4)){ // +CMGD=<index>[,<delflag>
1294 //
1295 char cmgd[128] = {0};
1296 if(!strcasecmp(cmd, "cmgd")) { // Get
1297 printf("cmgd : OK\n");
1298
1299 } else {
1300 char *ptr = strstr(cmd, ","); //+CMGD=<index>[,<delflag>
1301 if(ptr != NULL)
1302 {
1303 ptr++;
1304 memset(cmgd, 0, sizeof(cmgd));
1305 memcpy(cmgd, ptr, strlen(ptr));
1306 printf("1cmgd:%s\n", cmgd);
1307 }
1308
1309
1310 err = mbtk_sms_cmgd_set(cmgd);
1311 if(err) {
1312 printf("Error : %d\n", err);
1313 } else {
1314 printf("VoLTE set success\n");
1315 }
1316 }
1317 }
1318 else if(!strncasecmp(cmd, "cmgl", 4)){ // AT+CMGL[=<stat>]
1319 //
1320 char cmgl[128] = {0};
1321 char resp[5*1024] ={0};
1322 if(!strcasecmp(cmd, "cmgl")) { // Get
1323 printf("cmgl : OK\n");
1324
1325 } else {
1326 char *ptr = strstr(cmd, "cmgl,"); // AT+CMGL[=<stat>]
1327 if(ptr != NULL)
1328 {
1329 ptr = strstr(cmd, ",");
1330 ptr++;
1331 memset(cmgl, 0, sizeof(cmgl));
1332 memcpy(cmgl, ptr, strlen(ptr));
1333 printf("0cmgl:%s\n", cmgl);
1334 }
1335
1336 memset(resp, 0, sizeof(resp));
1337 err = mbtk_sms_cmgl_set(cmgl, resp);
1338 if(err) {
1339 printf("Error : %d\n", err);
1340 } else {
1341 // printf("cmgl set success, reg:%s\n",resp);
1342 }
1343 }
1344 }
1345 else if(!strncasecmp(cmd, "csca", 4)){ // AT+CSCA=<number> [,<type>]
1346 //
1347 char csca[128] = {0};
1348 if(!strcasecmp(cmd, "csca")) { // Get
1349 err = mbtk_sms_csca_get(csca);
1350 if(err) {
1351 printf("mbtk_sms_csca_get Error : %d\n", err);
1352 } else {
1353 printf("mbtk_sms_csca_get success\n");
1354 }
1355
1356 } else {
1357 char *ptr = strstr(cmd, ","); // AT+CSCA=<number> [,<type>]
1358 if(ptr != NULL)
1359 {
1360 ptr++;
1361 memset(csca, 0, sizeof(csca));
1362 memcpy(csca, ptr, strlen(ptr));
1363 printf("csca:%s\n", csca);
1364 }
1365
1366 err = mbtk_sms_csca_set(csca);
1367 if(err) {
1368 printf("Error : %d\n", err);
1369 } else {
1370 printf("VoLTE set success\n");
1371 }
1372 }
1373 }
1374 else if(!strncasecmp(cmd, "csmp", 4)){ // AT+CSMP=[<fo>[,<vp>[,<pid>[,<dcs>]]]]
1375 //
1376 char csmp[128] = {0};
1377 if(!strcasecmp(cmd, "csmp")) { // Get
1378 printf("cmgl : OK\n");
1379
1380 } else {
1381 char *ptr = strstr(cmd, ","); // AT+CSMP=[<fo>[,<vp>[,<pid>[,<dcs>]]]]
1382 if(ptr != NULL)
1383 {
1384 ptr++;
1385 memset(csmp, 0, sizeof(csmp));
1386 memcpy(csmp, ptr, strlen(ptr));
1387 printf("csmp:%s\n", csmp);
1388 }
1389
1390 err = mbtk_sms_csmp_set(csmp);
1391 if(err) {
1392 printf("Error : %d\n", err);
1393 } else {
1394 printf("VoLTE set success\n");
1395 }
1396 }
1397 }
1398 else if(!strncasecmp(cmd, "cscb", 4)){ // AT+CSCB=<[<mode>[,<mids>[,<dcss>]]]>
1399 //
1400 char cscb[128] = {0};
1401 if(!strcasecmp(cmd, "cscb")) { // Get
1402 printf("cmgl : OK\n");
1403
1404 } else {
1405 char *ptr = strstr(cmd, ","); // AT+CSCB=<[<mode>[,<mids>[,<dcss>]]]>
1406 if(ptr != NULL)
1407 {
1408 ptr++;
1409 memset(cscb, 0, sizeof(cscb));
1410 memcpy(cscb, ptr, strlen(ptr));
1411 printf("cscb:%s\n", cscb);
1412 }
1413
1414 err = mbtk_sms_cscb_set(cscb);
1415 if(err) {
1416 printf("Error : %d\n", err);
1417 } else {
1418 printf("VoLTE set success\n");
1419 }
1420 }
1421 }
1422#if 0
1423 else if(!strncasecmp(cmd, "shutdown", 8)){
b.liu87afc4c2024-08-14 17:33:45 +08001424 if(!strcasecmp(cmd, "shutdown 0")) {
1425 err = mbtk_system_reboot(0);
1426 if(err) {
1427 printf("Error : %d\n", err);
1428 } else {
1429 printf("Success.\n");
1430 }
1431 } else if(!strcasecmp(cmd, "shutdown 1")) {
1432 err = mbtk_system_reboot(1);
1433 if(err) {
1434 printf("Error : %d\n", err);
1435 } else {
1436 printf("Success.\n");
1437 }
1438 } else if(!strcasecmp(cmd, "shutdown 2")) {
1439 err = mbtk_system_reboot(2);
1440 if(err) {
1441 printf("Error : %d\n", err);
1442 } else {
1443 printf("Success.\n");
1444 }
1445 } else {
1446 printf("Error.");
1447 }
1448 } else if(!strncasecmp(cmd, "power_sim", 9)){
1449 if(!strcasecmp(cmd, "power_sim 0")) {
1450 err = mbtk_sim_power_set(0);
1451 if(err) {
1452 printf("Error : %d\n", err);
1453 } else {
1454 printf("Success.\n");
1455 }
1456 } else if(!strcasecmp(cmd, "power_sim 1")) {
1457 err = mbtk_sim_power_set(1);
1458 if(err) {
1459 printf("Error : %d\n", err);
1460 } else {
1461 printf("Success.\n");
1462 }
1463 } else {
1464 printf("Error.");
1465 }
1466 } else if(!strncasecmp(cmd, "time", 4)){
1467 if(!strcasecmp(cmd, "time 0")) {
1468 err = mbtk_time_set(info_handle, 0, NULL);
1469 if(err) {
1470 printf("Error : %d\n", err);
1471 } else {
1472 printf("Success.\n");
1473 }
1474 } else if(!strcasecmp(cmd, "time 1")) {
1475 err = mbtk_time_set(info_handle, 1, NULL);
1476 if(err) {
1477 printf("Error : %d\n", err);
1478 } else {
1479 printf("Success.\n");
1480 }
1481 } else if(!strncasecmp(cmd, "time 2 ", 7)) {
1482 err = mbtk_time_set(info_handle, 2, cmd + 7);
1483 if(err) {
1484 printf("Error : %d\n", err);
1485 } else {
1486 printf("Success.\n");
1487 }
1488 } else { // Get time type.
1489 int time_type;
1490 err = mbtk_time_get(info_handle, &time_type);
1491 if(err) {
1492 printf("Error : %d\n", err);
1493 } else {
1494 printf("Time type:%d.\n", time_type);
1495 }
1496 }
b.liu87afc4c2024-08-14 17:33:45 +08001497 }
1498#endif
1499 else if(!strcasecmp(cmd, "h") || !strcasecmp(cmd, "help")) {
1500 help();
1501 } else if(!strcasecmp(cmd, "q")) {
1502 mbtk_ril_deinit();
1503 break;
1504 } else {
1505 printf("\n");
1506 }
1507 }
1508 }
1509
b.liu62240ee2024-11-07 17:52:45 +08001510#if RIL_DEBUG_THREAD
b.liu87afc4c2024-08-14 17:33:45 +08001511 thread_exit_with_wait();
b.liu87afc4c2024-08-14 17:33:45 +08001512exit:
b.liu62240ee2024-11-07 17:52:45 +08001513#endif
b.liu87afc4c2024-08-14 17:33:45 +08001514 mbtk_ril_deinit();
1515
1516 LOG("Client exec complete.");
1517
1518 return 0;
1519}