blob: a95e571b27c0779a0109b9d1f798306a8da5745e [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};
831 err = mbtk_data_call_start((mbtk_ril_cid_enum)cid, (bool)auto_boot_call, (bool)def_route, (bool)as_dns, retry_interval,
832 3, 0, &ip);
b.liubcf86c92024-08-19 19:48:28 +0800833 } else if(type == MBTK_DATA_CALL_STOP) {
834 err = mbtk_data_call_stop((mbtk_ril_cid_enum)cid, 10);
835 } else {
836 err = mbtk_data_call_state_get((mbtk_ril_cid_enum)cid, &ip);
837 }
838 if(err) {
839 printf("Error : %d\n", err);
840 } else {
841 printf("DATA_CALL success\n");
842 if(type == MBTK_DATA_CALL_START || type == MBTK_DATA_CALL_STATE) {
843 if(ip.ipv4.valid) {
844 // log_hex("IPv4", &ipv4, sizeof(mbtk_ipv4_info_t));
845 char ip_tmp[20];
846
847 memset(ip_tmp, 0, 20);
848 if(inet_ntop(AF_INET, &(ip.ipv4.IPAddr), ip_tmp, 20) == NULL) {
849 printf("IP error.\n");
850 } else {
851 printf("IP : %s\n", ip_tmp);
852 }
853
854 memset(ip_tmp, 0, 20);
855 if(inet_ntop(AF_INET, &(ip.ipv4.PrimaryDNS), ip_tmp, 20) == NULL) {
856 printf("PrimaryDNS error.\n");
857 } else {
858 printf("PrimaryDNS : %s\n", ip_tmp);
859 }
860
861 memset(ip_tmp, 0, 20);
862 if(inet_ntop(AF_INET, &(ip.ipv4.SecondaryDNS), ip_tmp, 20) == NULL) {
863 printf("SecondaryDNS error.\n");
864 } else {
865 printf("SecondaryDNS : %s\n", ip_tmp);
866 }
867
868 memset(ip_tmp, 0, 20);
869 if(inet_ntop(AF_INET, &(ip.ipv4.GateWay), ip_tmp, 20) == NULL) {
870 printf("GateWay error.\n");
871 } else {
872 printf("GateWay : %s\n", ip_tmp);
873 }
874
875 memset(ip_tmp, 0, 20);
876 if(inet_ntop(AF_INET, &(ip.ipv4.NetMask), ip_tmp, 20) == NULL) {
877 printf("NetMask error.\n");
878 } else {
879 printf("NetMask : %s\n", ip_tmp);
880 }
881 }
882
883 if(ip.ipv6.valid) {
884 // log_hex("IPv6", &ipv6, sizeof(mbtk_ipv6_info_t));
885 char ip_tmp[50];
886
887 memset(ip_tmp, 0, 50);
888 if(ipv6_2_str(&(ip.ipv6.IPV6Addr), ip_tmp)) {
889 printf("IP error.\n");
890 } else {
891 printf("IP : %s\n", ip_tmp);
892 }
893
894 memset(ip_tmp, 0, 50);
895 if(ipv6_2_str(&(ip.ipv6.PrimaryDNS), ip_tmp)) {
896 printf("PrimaryDNS error.\n");
897 } else {
898 printf("PrimaryDNS : %s\n", ip_tmp);
899 }
900
901 memset(ip_tmp, 0, 50);
902 if(ipv6_2_str(&(ip.ipv6.SecondaryDNS), ip_tmp)) {
903 printf("SecondaryDNS error.\n");
904 } else {
905 printf("SecondaryDNS : %s\n", ip_tmp);
906 }
907
908 memset(ip_tmp, 0, 50);
909 if(ipv6_2_str(&(ip.ipv6.GateWay), ip_tmp)) {
910 printf("GateWay error.\n");
911 } else {
912 printf("GateWay : %s\n", ip_tmp);
913 }
914
915 memset(ip_tmp, 0, 50);
916 if(ipv6_2_str(&(ip.ipv6.NetMask), ip_tmp)) {
917 printf("NetMask error.\n");
918 } else {
919 printf("NetMask : %s\n", ip_tmp);
920 }
921 }
922 }
923 }
924 }
925 }
b.liu87afc4c2024-08-14 17:33:45 +0800926 else if(!strncasecmp(cmd, "cell", 4)){
927 char *ptr = strstr(cmd, ","); //CPMS,ME,ME,ME
928 if(ptr == NULL)
929 {
b.liub4772072024-08-15 14:47:03 +0800930 mbtk_cell_info_array_t cell;
931 err = mbtk_cell_get(&cell);
932 if(err) {
b.liu87afc4c2024-08-14 17:33:45 +0800933 printf("Error : %d\n", err);
b.liub4772072024-08-15 14:47:03 +0800934 } else if(cell.num > 0){
935 // Current server cell.
936 switch(cell.type)
b.liu87afc4c2024-08-14 17:33:45 +0800937 {
b.liub4772072024-08-15 14:47:03 +0800938 case MBTK_CELL_TYPE_GSM:
939 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);
940 break;
941 case MBTK_CELL_TYPE_UMTS:
942 printf("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell.cell[0].value1, cell.cell[0].value2, cell.cell[0].value3);
943 break;
944 case MBTK_CELL_TYPE_LTE:
945 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);
946 break;
947 default:
948 break;
949 }
950
951 int i = 1;
952 while (i < cell.num)
953 {
954 switch(cell.type)
b.liu87afc4c2024-08-14 17:33:45 +0800955 {
b.liub4772072024-08-15 14:47:03 +0800956 case MBTK_CELL_TYPE_GSM:
957 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 +0800958 break;
b.liub4772072024-08-15 14:47:03 +0800959 case MBTK_CELL_TYPE_UMTS:
960 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 +0800961 break;
b.liub4772072024-08-15 14:47:03 +0800962 case MBTK_CELL_TYPE_LTE:
963 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 +0800964 break;
965 default:
966 break;
967 }
b.liub4772072024-08-15 14:47:03 +0800968 i++;
b.liu87afc4c2024-08-14 17:33:45 +0800969 }
b.liub4772072024-08-15 14:47:03 +0800970 } else {
971 printf("Cell no found.");
b.liu87afc4c2024-08-14 17:33:45 +0800972 }
b.liu87afc4c2024-08-14 17:33:45 +0800973 }
974 else{
975 char *ptr = strstr(cmd, ","); //cell,2,3,,40936,430
976 char mem[50]={0};
977 char resp[1024] = {0};
978 if(ptr != NULL)
979 {
980 ptr++;
981 memset(mem, 0, sizeof(mem));
982 memcpy(mem, ptr, strlen(ptr));
983 printf("cell:%s\n", mem);
984 }
985 printf("cell_mem: %s \n", mem);
986
987 memset(resp, 0, sizeof(resp));
b.liub4772072024-08-15 14:47:03 +0800988 err = mbtk_cell_set(mem, resp);
b.liu87afc4c2024-08-14 17:33:45 +0800989 if(err) {
990 printf("Error : %d\n", err);
991 } else {
992 printf("cell set . resp:%s\n", resp);
993 }
b.liu87afc4c2024-08-14 17:33:45 +0800994 }
b.liub4772072024-08-15 14:47:03 +0800995 }
996 else if(!strncasecmp(cmd, "call", 4)){
b.liu87afc4c2024-08-14 17:33:45 +0800997 char phone_number[12];
998 char *ptr = strstr(cmd, " ");
999 if(ptr == NULL)
1000 continue;
1001 while(*ptr != '\0' && *ptr == ' ')
1002 ptr++;
1003 memset(phone_number,0,strlen(phone_number));
1004 memcpy(phone_number,ptr,strlen(ptr));
1005 printf("phone number is: %s\n",phone_number);
b.liub4772072024-08-15 14:47:03 +08001006 err = mbtk_call_start(phone_number);
b.liu87afc4c2024-08-14 17:33:45 +08001007 if(err) {
1008 printf("Error : %d\n", err);
1009 } else {
1010 printf("Call success.\n");
1011 }
1012 } else if(!strncasecmp(cmd, "answer", 6)){
b.liub4772072024-08-15 14:47:03 +08001013 err = mbtk_call_answer();
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, "hangup", 6)){
b.liu62240ee2024-11-07 17:52:45 +08001020 int phone_id = 1;
b.liu87afc4c2024-08-14 17:33:45 +08001021 if(!strcasecmp(cmd, "hangup")) { // hang up all
b.liub4772072024-08-15 14:47:03 +08001022 err = mbtk_call_hang();
b.liu87afc4c2024-08-14 17:33:45 +08001023 if(err) {
1024 printf("Error : %d\n", err);
1025 } else {
1026 printf("Call hang up all.\n");
1027 }
1028 } else if(!strcasecmp(cmd, "hangup 0")) {
b.liub4772072024-08-15 14:47:03 +08001029 err = mbtk_waiting_or_background_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 waiting or background.\n");
1034 }
1035 } else if(!strcasecmp(cmd, "hangup 3")) {
b.liub4772072024-08-15 14:47:03 +08001036 err = mbtk_foreground_resume_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 foreground resume background.\n");
1041 }
1042 } else {
1043 if(!strcasecmp(cmd, "hangup 1")) { // hang up a call
1044 phone_id = 1;
1045 } else if(!strcasecmp(cmd, "hangup 2")) {
1046 phone_id = 2;
1047 } else {
1048 printf("Error : Invalid input\n");
1049 }
b.liub4772072024-08-15 14:47:03 +08001050 err = mbtk_a_call_hang(phone_id);
b.liu87afc4c2024-08-14 17:33:45 +08001051 if(err) {
1052 printf("Error : %d\n", err);
1053 } else {
1054 printf("A Call hang up.\n");
1055 }
1056 }
1057 } else if(!strncasecmp(cmd, "waitin", 6)){
1058 mbtk_call_info_t reg;
b.liub4772072024-08-15 14:47:03 +08001059 err = mbtk_call_reg_get(&reg);
b.liu87afc4c2024-08-14 17:33:45 +08001060 if(err) {
1061 printf("Error : %d\n", err);
1062 } else {
1063 if(reg.call_wait == 0) {
1064 printf("No call ring\n");
1065 }
1066 else {
1067 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);
1068 }
1069 }
1070 } else if(!strncasecmp(cmd, "mute", 4)){ // "mute" or "mute 0" or "mute 1"
1071 int mute;
1072 if(!strcasecmp(cmd, "mute")) { // Get
b.liub4772072024-08-15 14:47:03 +08001073 err = mbtk_mute_state_get(&mute);
b.liu87afc4c2024-08-14 17:33:45 +08001074 if(err) {
1075 printf("Error : %d\n", err);
1076 } else {
1077 printf("mute : %d\n", mute);
1078 }
1079 } else { // Set
1080 if(!strcasecmp(cmd, "mute 1")) { // on mute
1081 mute = 1;
1082 } else { // off mute
1083 mute = 0;
1084 }
b.liub4772072024-08-15 14:47:03 +08001085 err = mbtk_mute_state_set(mute);
b.liu87afc4c2024-08-14 17:33:45 +08001086 if(err) {
1087 printf("Error : %d\n", err);
1088 } else {
1089 printf("mute set success\n");
1090 }
1091 }
1092 } else if(!strncasecmp(cmd, "DTMF", 4)){ // valid character: (0, 1, ..., 9, A, B, C, D, *, #)
1093
1094 mbtk_call_dtmf_info_t reg;
1095
1096 char *ptr = strstr(cmd, " ");
1097 if(ptr == NULL)
1098 continue;
1099 while(*ptr != '\0' && *ptr == ' ')
1100 ptr++;
1101 reg.character = *ptr;
1102
1103 ptr = strstr(ptr, " ");
1104 if(ptr == NULL)
1105 continue;
1106 while(*ptr != '\0' && *ptr == ' ')
1107 ptr++;
1108 reg.duration = (uint32)atoi(ptr);
1109 printf("DTMF character is: %c,%d\n",reg.character, reg.duration);
b.liub4772072024-08-15 14:47:03 +08001110 err = mbtk_dtmf_send(&reg);
b.liu87afc4c2024-08-14 17:33:45 +08001111 if(err) {
1112 printf("Error : %d\n", err);
1113 } else {
1114 printf("DTMF success.\n");
1115 }
b.liub4772072024-08-15 14:47:03 +08001116 } else if(!strncasecmp(cmd, "cmgf", 4)){ // set mode 0: pud, 1:text
1117 int mode;
1118 if(!strcasecmp(cmd, "cmgf")) { // Get
1119 err = mbtk_sms_cmgf_get(&mode);
1120 if(err) {
1121 printf("Error : %d\n", err);
1122 } else {
1123 printf("VoLTE : %d\n", mode);
1124 }
1125 } else { // Set
1126 if(!strcasecmp(cmd, "cmgf 1")) { // cmgf 1
1127 mode = 1;
1128 } else { //
1129 mode = 0;
1130 }
1131 printf("mode:%d\n", mode);
1132 sleep(2);
1133 err = mbtk_sms_cmgf_set(mode);
1134 if(err) {
1135 printf("Error : %d\n", err);
1136 } else {
1137 printf("VoLTE set success\n");
1138 }
1139 }
1140 }else if(!strncasecmp(cmd, "cpms", 4)){ // //CPMS=ME, ME, ME
1141 char mem[100] = {0};
1142 char resp[100] = {0};
1143 if(!strcasecmp(cmd, "cpms")) { // Get
b.liu62240ee2024-11-07 17:52:45 +08001144 err = mbtk_sms_cpms_get(mem);
b.liub4772072024-08-15 14:47:03 +08001145 if(err) {
1146 printf("Error : %d\n", err);
1147 } else {
1148 printf("cpms : %s\n", mem);
1149 }
1150 } else { // Set
1151
1152 char *ptr = strstr(cmd, ","); //CPMS,ME,ME,ME
1153 if(ptr != NULL)
1154 {
1155 ptr++;
1156 memset(mem, 0, sizeof(mem));
1157 memcpy(mem, ptr, strlen(ptr));
1158 printf("cpms:%s\n", mem);
1159 }
1160 printf("cpms 0\n");
1161
1162 memset(resp, 0, sizeof(resp));
1163 err = mbtk_sms_cpms_set(mem, resp);
1164 if(err) {
1165 printf("Error : %d\n", err);
1166 } else {
1167 printf("cpms set success. resp:%s\n", resp);
1168 }
1169 }
1170 }else if(!strncasecmp(cmd, "cmgs", 4)){ // AT+CMGS="10086", CMGS TEST
1171 char cmgs[1024] = {0};
1172 char resp[50] = {0};
1173 if(!strcasecmp(cmd, "cmgs")) { // Get
1174 int mode;
1175 // err = mbtk_sms_cmgs_get(info_handle, &mode);
1176 if(err) {
1177 printf("Error : %d\n", err);
1178 } else {
1179 printf("VoLTE : %d\n", mode);
1180 }
1181 } else { // Set
1182
1183 /*
1184 *AT+CMGS="10086", CMGS TEST // Send a SMS
1185 > CMGS TEST
1186 +CMGS: 17
1187 OK
1188 */
1189
1190 char *ptr = strstr(cmd, "cmgs,"); //CMGS="10086",hf
1191 if(ptr != NULL)
1192 {
1193 ptr = strstr(cmd, ",");
1194 ptr++;
1195 memset(cmgs, 0, sizeof(cmgs));
1196 memcpy(cmgs, ptr, strlen(ptr));
1197 printf("1cmgs:%s, strlen(cmgs):%d\n", cmgs, strlen(cmgs));
1198 }
1199
1200 memset(resp, 0, sizeof(resp));
1201 err = mbtk_sms_cmgs_set(cmgs, resp);
1202 if(err) {
1203 printf("Error : %d\n", err);
1204 } else {
1205 printf("cmgs set success . resp:%s\n", resp);
1206 }
1207 }
1208 }else if(!strncasecmp(cmd, "cmss", 4)){ // +CMSS=<index>[,<da>[,<toda>]]
1209 char cmss[20] = {0};
1210 char resp[20] = {0};
1211 if(!strcasecmp(cmd, "cmgs")) { // Get
1212 printf("cmss : OK\n");
1213
1214 } else {
1215 char *ptr = strstr(cmd, "cmss,"); //CMSS=<index>
1216 if(ptr != NULL)
1217 {
1218 ptr = strstr(cmd, ",");
1219 ptr++;
1220 memset(cmss, 0, sizeof(cmss));
1221 memcpy(cmss, ptr, strlen(ptr));
1222 printf("1cmss:%s\n", cmss);
1223 }
1224
1225
1226 err = mbtk_sms_cmss_set(cmss, resp);
1227 if(err) {
1228 printf("Error : %d\n", err);
1229 } else {
1230 printf("cmss set success. resp:%s\n", resp);
1231 }
1232 }
1233 }
1234 else if(!strncasecmp(cmd, "cmgr", 4)){ // +CMGR=<index
1235 int index = 0;
1236 char resp[1024] = {0};
1237 if(!strcasecmp(cmd, "cmgr")) { // Get
1238 printf("cmgr : OK\n");
1239
1240 } else {
1241 char *ptr = strstr(cmd, "cmgr,"); //+CMGR <index>
1242 if(ptr != NULL)
1243 {
1244 ptr = strstr(cmd, ",");
1245 ptr++;
1246 index = atoi(ptr);
1247 }
1248 printf("1index:%d\n", index);
1249
1250 memset(resp, 0, sizeof(resp));
1251 err = mbtk_sms_cmgr_set(index, resp);
1252 if(err) {
1253 printf("Error : %d\n", err);
1254 } else {
1255 printf("cmgr set success. rep:%s\n", resp);
1256 }
1257 }
1258 }
1259 else if(!strncasecmp(cmd, "cmgw", 4)){ // +CMGW=<oa/da>[,<tooa/toda>[,<stat>]]<CR>
1260 //+CMGW=<length>[,<stat>]<CR>PDU is given<ctrl-Z/ESC>
1261 char cmgw[128] = {0};
1262 char resp[50] = {0};
1263 if(!strcasecmp(cmd, "cmgw")) { // Get
1264 printf("cmgw : OK\n");
1265
1266 } else {
1267 char *ptr = strstr(cmd, "cmgw,"); //+CMGW, <oa/da>, data
1268 if(ptr != NULL)
1269 {
1270 ptr = strstr(cmd, ",");
1271 ptr++;
1272 memset(cmgw, 0, sizeof(cmgw));
1273 memcpy(cmgw, ptr, strlen(ptr));
1274 printf("cmgw:%s\n", cmgw);
1275 }
1276
1277 memset(resp, 0, sizeof(resp));
1278 err = mbtk_sms_cmgw_set(cmgw, resp);
1279 if(err) {
1280 printf("Error : %d\n", err);
1281 } else {
1282 printf("cmgw set success. resp:%s\n", resp);
1283 }
1284 }
1285 }
1286 else if(!strncasecmp(cmd, "cmgd", 4)){ // +CMGD=<index>[,<delflag>
1287 //
1288 char cmgd[128] = {0};
1289 if(!strcasecmp(cmd, "cmgd")) { // Get
1290 printf("cmgd : OK\n");
1291
1292 } else {
1293 char *ptr = strstr(cmd, ","); //+CMGD=<index>[,<delflag>
1294 if(ptr != NULL)
1295 {
1296 ptr++;
1297 memset(cmgd, 0, sizeof(cmgd));
1298 memcpy(cmgd, ptr, strlen(ptr));
1299 printf("1cmgd:%s\n", cmgd);
1300 }
1301
1302
1303 err = mbtk_sms_cmgd_set(cmgd);
1304 if(err) {
1305 printf("Error : %d\n", err);
1306 } else {
1307 printf("VoLTE set success\n");
1308 }
1309 }
1310 }
1311 else if(!strncasecmp(cmd, "cmgl", 4)){ // AT+CMGL[=<stat>]
1312 //
1313 char cmgl[128] = {0};
1314 char resp[5*1024] ={0};
1315 if(!strcasecmp(cmd, "cmgl")) { // Get
1316 printf("cmgl : OK\n");
1317
1318 } else {
1319 char *ptr = strstr(cmd, "cmgl,"); // AT+CMGL[=<stat>]
1320 if(ptr != NULL)
1321 {
1322 ptr = strstr(cmd, ",");
1323 ptr++;
1324 memset(cmgl, 0, sizeof(cmgl));
1325 memcpy(cmgl, ptr, strlen(ptr));
1326 printf("0cmgl:%s\n", cmgl);
1327 }
1328
1329 memset(resp, 0, sizeof(resp));
1330 err = mbtk_sms_cmgl_set(cmgl, resp);
1331 if(err) {
1332 printf("Error : %d\n", err);
1333 } else {
1334 // printf("cmgl set success, reg:%s\n",resp);
1335 }
1336 }
1337 }
1338 else if(!strncasecmp(cmd, "csca", 4)){ // AT+CSCA=<number> [,<type>]
1339 //
1340 char csca[128] = {0};
1341 if(!strcasecmp(cmd, "csca")) { // Get
1342 err = mbtk_sms_csca_get(csca);
1343 if(err) {
1344 printf("mbtk_sms_csca_get Error : %d\n", err);
1345 } else {
1346 printf("mbtk_sms_csca_get success\n");
1347 }
1348
1349 } else {
1350 char *ptr = strstr(cmd, ","); // AT+CSCA=<number> [,<type>]
1351 if(ptr != NULL)
1352 {
1353 ptr++;
1354 memset(csca, 0, sizeof(csca));
1355 memcpy(csca, ptr, strlen(ptr));
1356 printf("csca:%s\n", csca);
1357 }
1358
1359 err = mbtk_sms_csca_set(csca);
1360 if(err) {
1361 printf("Error : %d\n", err);
1362 } else {
1363 printf("VoLTE set success\n");
1364 }
1365 }
1366 }
1367 else if(!strncasecmp(cmd, "csmp", 4)){ // AT+CSMP=[<fo>[,<vp>[,<pid>[,<dcs>]]]]
1368 //
1369 char csmp[128] = {0};
1370 if(!strcasecmp(cmd, "csmp")) { // Get
1371 printf("cmgl : OK\n");
1372
1373 } else {
1374 char *ptr = strstr(cmd, ","); // AT+CSMP=[<fo>[,<vp>[,<pid>[,<dcs>]]]]
1375 if(ptr != NULL)
1376 {
1377 ptr++;
1378 memset(csmp, 0, sizeof(csmp));
1379 memcpy(csmp, ptr, strlen(ptr));
1380 printf("csmp:%s\n", csmp);
1381 }
1382
1383 err = mbtk_sms_csmp_set(csmp);
1384 if(err) {
1385 printf("Error : %d\n", err);
1386 } else {
1387 printf("VoLTE set success\n");
1388 }
1389 }
1390 }
1391 else if(!strncasecmp(cmd, "cscb", 4)){ // AT+CSCB=<[<mode>[,<mids>[,<dcss>]]]>
1392 //
1393 char cscb[128] = {0};
1394 if(!strcasecmp(cmd, "cscb")) { // Get
1395 printf("cmgl : OK\n");
1396
1397 } else {
1398 char *ptr = strstr(cmd, ","); // AT+CSCB=<[<mode>[,<mids>[,<dcss>]]]>
1399 if(ptr != NULL)
1400 {
1401 ptr++;
1402 memset(cscb, 0, sizeof(cscb));
1403 memcpy(cscb, ptr, strlen(ptr));
1404 printf("cscb:%s\n", cscb);
1405 }
1406
1407 err = mbtk_sms_cscb_set(cscb);
1408 if(err) {
1409 printf("Error : %d\n", err);
1410 } else {
1411 printf("VoLTE set success\n");
1412 }
1413 }
1414 }
1415#if 0
1416 else if(!strncasecmp(cmd, "shutdown", 8)){
b.liu87afc4c2024-08-14 17:33:45 +08001417 if(!strcasecmp(cmd, "shutdown 0")) {
1418 err = mbtk_system_reboot(0);
1419 if(err) {
1420 printf("Error : %d\n", err);
1421 } else {
1422 printf("Success.\n");
1423 }
1424 } else if(!strcasecmp(cmd, "shutdown 1")) {
1425 err = mbtk_system_reboot(1);
1426 if(err) {
1427 printf("Error : %d\n", err);
1428 } else {
1429 printf("Success.\n");
1430 }
1431 } else if(!strcasecmp(cmd, "shutdown 2")) {
1432 err = mbtk_system_reboot(2);
1433 if(err) {
1434 printf("Error : %d\n", err);
1435 } else {
1436 printf("Success.\n");
1437 }
1438 } else {
1439 printf("Error.");
1440 }
1441 } else if(!strncasecmp(cmd, "power_sim", 9)){
1442 if(!strcasecmp(cmd, "power_sim 0")) {
1443 err = mbtk_sim_power_set(0);
1444 if(err) {
1445 printf("Error : %d\n", err);
1446 } else {
1447 printf("Success.\n");
1448 }
1449 } else if(!strcasecmp(cmd, "power_sim 1")) {
1450 err = mbtk_sim_power_set(1);
1451 if(err) {
1452 printf("Error : %d\n", err);
1453 } else {
1454 printf("Success.\n");
1455 }
1456 } else {
1457 printf("Error.");
1458 }
1459 } else if(!strncasecmp(cmd, "time", 4)){
1460 if(!strcasecmp(cmd, "time 0")) {
1461 err = mbtk_time_set(info_handle, 0, NULL);
1462 if(err) {
1463 printf("Error : %d\n", err);
1464 } else {
1465 printf("Success.\n");
1466 }
1467 } else if(!strcasecmp(cmd, "time 1")) {
1468 err = mbtk_time_set(info_handle, 1, NULL);
1469 if(err) {
1470 printf("Error : %d\n", err);
1471 } else {
1472 printf("Success.\n");
1473 }
1474 } else if(!strncasecmp(cmd, "time 2 ", 7)) {
1475 err = mbtk_time_set(info_handle, 2, cmd + 7);
1476 if(err) {
1477 printf("Error : %d\n", err);
1478 } else {
1479 printf("Success.\n");
1480 }
1481 } else { // Get time type.
1482 int time_type;
1483 err = mbtk_time_get(info_handle, &time_type);
1484 if(err) {
1485 printf("Error : %d\n", err);
1486 } else {
1487 printf("Time type:%d.\n", time_type);
1488 }
1489 }
b.liu87afc4c2024-08-14 17:33:45 +08001490 }
1491#endif
1492 else if(!strcasecmp(cmd, "h") || !strcasecmp(cmd, "help")) {
1493 help();
1494 } else if(!strcasecmp(cmd, "q")) {
1495 mbtk_ril_deinit();
1496 break;
1497 } else {
1498 printf("\n");
1499 }
1500 }
1501 }
1502
b.liu62240ee2024-11-07 17:52:45 +08001503#if RIL_DEBUG_THREAD
b.liu87afc4c2024-08-14 17:33:45 +08001504 thread_exit_with_wait();
b.liu87afc4c2024-08-14 17:33:45 +08001505exit:
b.liu62240ee2024-11-07 17:52:45 +08001506#endif
b.liu87afc4c2024-08-14 17:33:45 +08001507 mbtk_ril_deinit();
1508
1509 LOG("Client exec complete.");
1510
1511 return 0;
1512}