blob: 73a7050a67c0ee4e8cb547d77a3e81cac80d6340 [file] [log] [blame]
liubin281ac462023-07-19 14:22:54 +08001#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <errno.h>
5#include <sys/socket.h>
6#include <sys/un.h>
7#include <netinet/in.h>
8#include <pthread.h>
9#include <sys/epoll.h>
10#include <string.h>
11#include <fcntl.h>
12#include <signal.h>
13
14#include "mbtk_info_api.h"
15#include "lynq/lynq_sms_api.h"
16
17//#include "lynq_net_api.h"
18
19static mbtk_info_handle_t* info_handle = NULL;
20
21void net_state_change_cb(const void* data, int data_len)
22{
23
24}
25
26void call_state_change_cb(const void* data, int data_len)
27{
28 mbtk_call_info_t *reg = (mbtk_call_info_t *)data;
29 switch (reg->call_wait)
30 {
31 case MBTK_CLCC:
32 printf("\r\nRING : %d, %d, %d, %d, %d, %s, %d\r\n", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type);
33 break;
34 case MBTK_DISCONNECTED:
35 printf("\r\nRING : call dis connected!\r\n");
36 break;
37 case MBTK_CPAS:
38 printf("\r\nCALL : Call state = %d\r\n", reg->pas);
39 /*
40 MBTK_CALL_RADY, //MT allows commands from TA/TE
41 MBTK_CALL_UNAVAILABLE, //MT does not allow commands from TA/TE
42 MBTK_CALL_UNKNOWN, //MT is not guaranteed to respond to instructions
43 MBTK_CALL_RINGING, //MT is ready for commands from TA/TE, but the ringer is active
44 MBTK_CALL_PROGRESS, //MT is ready for commands from TA/TE, but a call is in progress
45 MBTK_CALL_ASLEEP, //MT is unable to process commands from TA/TE because it is in a low functionality state
46 MBTK_CALL_ACTIVE,
47 */
48 switch (reg->pas)
49 {
50 case MBTK_CALL_RADY:
51 printf("CALL: call READY\r\n");
52 break;
53 case MBTK_CALL_UNAVAILABLE:
54 printf("CALL: call unavaliable\r\n");
55 break;
56 case MBTK_CALL_UNKNOWN:
57 printf("CALL: call unknown\r\n");
58 break;
59 case MBTK_CALL_RINGING:
60 printf("CALL: call ringing\r\n");
61 break;
62 case MBTK_CALL_PROGRESS:
63 printf("CALL: call progress\r\n");
64 break;
65 case MBTK_CALL_ASLEEP:
66 printf("CALL: call asleep\r\n");
67 break;
68 case MBTK_CALL_ACTIVE:
69 printf("CALL: call active\r\n");
70 break;
71 default:
72 printf("\r\n");
73 break;
74 }
75 break;
76 default:
77 printf("\r\nRING : None call_wait = %d\r\n", reg->call_wait);
78 break;
79 }
80 /*
81 if(reg->call_wait == ) //CLCC
82 {
83 printf("\r\nRING : %d, %d, %d, %d, %d, %s, %d\r\n", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type);
84 }
85 else if(reg->call_wait == 2) //Disconnected
86 {
87 printf("\r\nRING : call dis connected!\r\n");
88 }
89 else
90 {
91 printf("\r\nRING : None\r\n");
92 }
93 */
94}
95
96void sms_state_change_cb(const void* data, int data_len)
97{
98 LOGV("sms_state_change_cb()----------start\n");
99 uint8 *ptr = (uint8*)data;
100 printf("3sms_state_change_cb() : %s\n", ptr);
101
102 struct SMS_Struct s = PDUDecoding(ptr);
103 printf("服务中心地址: %s\n", s.SCA);
104 printf("发送方地址: %s\n", s.OA);
105 printf("服务中心时间戳: %s\n", s.SCTS);
106 printf("消息内容: %s\n", s.UD);
107 printf("数据编码方案: %s\n", DSC_to_msg(s.DCS));
108
109}
110
111void radio_state_change_cb(const void* data, int data_len)
112{
113 uint8 *ptr = (uint8*)data;
114 printf("Radio state : %d\n", *ptr);
115}
116
117void sim_state_change_cb(const void* data, int data_len)
118{
119 uint8 *ptr = (uint8*)data;
120 printf("SIM state : %d\n", *ptr);
121}
122
123#include <netdb.h>
124#include <sys/socket.h>
125#include <netinet/in.h>
126#include <arpa/inet.h>
127
128static void test2(int is_ipv6, char *ip)
129{
130 char ipaddr[20] = {0};
131 if(is_ipv6) {
132 struct in6_addr sin_addr;
133 if(inet_pton(AF_INET6, ip, &sin_addr) < 0) {
134 printf("inet_pton() fail.\n");
135 } else {
136 log_hex("IPv6", &sin_addr, sizeof(struct in6_addr));
137 }
138 } else {
139 struct in_addr sin_addr;
140 if(inet_pton(AF_INET, ip, &sin_addr) < 0) {
141 printf("inet_pton() fail.\n");
142 } else {
143 log_hex("IPv4", &sin_addr, sizeof(struct in_addr));
144 }
145 }
146}
147
148
149static void help()
150{
151 printf("version: Get version.\n");
152 printf("imei: Get IMEI.\n");
153 printf("sn: Get SN.\n");
154 printf("meid: Get MEID.\n");
155 printf("volte: Get VoLTE state.\n");
156 printf("volte 0: Close VoLTE.\n");
157 printf("volte 1: Open VoLTE.\n");
158 printf("radio: Get radio state.\n");
159 printf("radio 0: Close radio.\n");
160 printf("radio 1: Open radio.\n");
161 printf("sim: Get sim state.\n");
162 printf("avail_net: Get available network.\n");
163 printf("imsi: Get IMSI.\n");
164 printf("iccid: Get ICCID.\n");
165 printf("pn: Get Phone Number.\n");
166 printf("sel_mode: Get network select mode.\n");
167 printf("sel_mode <sel_mode> <net_type> <plmn>: Set network select mode.\n");
168 printf("band: Get current bands.\n");
169 printf("band support: Get support bands.\n");
170 printf("band <net_pref> <gsm_band> <umts_band> <tdlte_band> <fddlte_band>: Set current bands.\n");
171 printf("signal: Get network signal.\n");
172 printf("reg: Get network registe information.\n");
173 printf("cell: Get current cell information.\n");
174 printf("shutdown <0,1,2>: reboot/poweroff/halt system.\n");
175 printf("power_sim <0,1>: Power off/on sim.\n");
176 printf("temp <0,1>: Get SOC/RF temperature.\n");
177 printf("time <0,1,2> YYYY-MM-DD HH:MM:SS : Set system time as CELL/NTP/User.\n");
178 printf("apn : Get current apns.\n");
179 printf("apn <cid> <1/2/3/4> <apn> : Set apn.\n");
180 printf("data_call <0/1/2> <cid> <timeout>: Stop/Start/State data call.\n");
181 printf("call: Call the phone number.\n");
182 printf("answer: Answer the phone call.\n");
183 printf("hangup: Hang up all phone call. No id.\n");
184 printf("hangup 0: Hang up waiting or background phone call.\n");
185 printf("hangup 1: Hang up a phone call.\n");
186 printf("hangup 2: Hang up a phone call.\n");
187 printf("hangup 3: Hangup foreground resume background call.\n");
188 printf("waitin: Returns the list of current calls.\n");
189 printf("mute: Get mute state.\n");
190 printf("mute 0: Close mute.\n");
191 printf("mute 1: Open mute.\n");
192 printf("dtmf : Set dtmf character[0, 1, 2, ..., A, B, C, D, *, #], duration [300-600].\n Such as: dtmf 0 300\n");
193}
194
195static void sig_process(int sig)
196{
197 LOGI("I got signal %d\n", sig);
198 switch(sig)
199 {
200 case SIGINT: // Ctrl + C
201 {
202 LOGI("Exit by SIGINT.\n");
203 mbtk_info_handle_free(&info_handle);
204 exit(0);
205 }
206 case SIGQUIT: // Ctrl + \ (类似 SIGINT ,但要产生core文件)
207 {
208 LOGI("Exit by SIGQUIT.\n");
209 mbtk_info_handle_free(&info_handle);
210 exit(0);
211 }
212 case SIGTERM:// 默认kill (同 SIGKILL ,但 SIGKILL 不可捕获)
213 {
214 LOGI("Exit by SIGTERM.\n");
215 mbtk_info_handle_free(&info_handle);
216 exit(0);
217 }
218 case SIGTSTP:// Ctrl + Z (同 SIGSTOP ,但 SIGSTOP 不可捕获)
219 {
220 LOGI("Exit by SIGTSTP.\n");
221 exit(0);
222 }
223 case SIGSEGV: // 如空指针
224 {
225 LOGI("Exit by SIGSEGV.\n");
226 exit(0);
227 }
228 default:
229 {
230 LOGI("Unknown sig:%d\n",sig);
231 break;
232 }
233 }
234}
235
236int main(int argc, char *argv[])
237{
238 signal(SIGINT, sig_process);
239 signal(SIGQUIT, sig_process);
240 signal(SIGTERM, sig_process);
241 //signal(SIGTSTP, sig_process);
242 //signal(SIGSEGV, sig_process);
243
244 mbtk_log_init(NULL,"INFO_CLI");
245
246 //test2(0, "192.168.1.198");
247 //test2(1, "2409:8162:140:cd3c:1:2:1494:72ba");
248 //test2(1, "254.128.0.0.0.0.0.0.0.1.0.2.144.5.212.239");
249 //test2(1, "2400:3200::1");
250
251 info_handle = mbtk_info_handle_get();
252 if(!info_handle)
253 {
254 return -1;
255 }
256
257 mbtk_net_state_change_cb_reg(info_handle, net_state_change_cb);
258 mbtk_call_state_change_cb_reg(info_handle, call_state_change_cb);
259 mbtk_sms_state_change_cb_reg(info_handle, sms_state_change_cb);
260 mbtk_radio_state_change_cb_reg(info_handle, radio_state_change_cb);
261 mbtk_sim_state_change_cb_reg(info_handle, sim_state_change_cb);
262
263 printf(">>>>>>>>>>>>>>>>>>>>>>>>Enter cmd:\n");
264 char cmd[100];
265 while(1)
266 {
267 memset(cmd, 0, 100);
268 int err;
269 if(fgets(cmd, 100, stdin))
270 {
271 char *ptr = cmd + strlen(cmd) - 1;
272 while(ptr >= cmd && (*ptr == '\r' || *ptr == '\n'))
273 {
274 *ptr-- = '\0';
275 }
276 if(!strncasecmp(cmd, "version", 7))
277 {
278 char version[50] = {0};
279 err = mbtk_version_get(info_handle, version);
280 if(err) {
281 printf("Error : %d\n", err);
282 } else {
283 printf("Version : %s\n", version);
284 }
285 } else if(!strncasecmp(cmd, "imei", 4)){
286 char imei[50] = {0};
287 err = mbtk_imei_get(info_handle, imei);
288 if(err) {
289 printf("Error : %d\n", err);
290 } else {
291 printf("IMEI : %s\n", imei);
292 }
293 } else if(!strncasecmp(cmd, "sn", 2)){
294 char sn[50] = {0};
295 err = mbtk_sn_get(info_handle, sn);
296 if(err) {
297 printf("Error : %d\n", err);
298 } else {
299 printf("SN : %s\n", sn);
300 }
301 } else if(!strncasecmp(cmd, "meid", 4)){
302 char meid[50] = {0};
303 err = mbtk_meid_get(info_handle, meid);
304 if(err) {
305 printf("Error : %d\n", err);
306 } else {
307 printf("MEID : %s\n", meid);
308 }
309 } else if(!strncasecmp(cmd, "volte", 5)){ // "volte" or "volte 0" or "volte 1"
310 int volte;
311 if(!strcasecmp(cmd, "volte")) { // Get
312 err = mbtk_volte_state_get(info_handle, &volte);
313 if(err) {
314 printf("Error : %d\n", err);
315 } else {
316 printf("VoLTE : %d\n", volte);
317 }
318 } else { // Set
319 if(!strcasecmp(cmd, "volte 1")) { // Open VoLTE
320 volte = 1;
321 } else { // Close VoLTE
322 volte = 0;
323 }
324 err = mbtk_volte_state_set(info_handle, volte);
325 if(err) {
326 printf("Error : %d\n", err);
327 } else {
328 printf("VoLTE set success\n");
329 }
330 }
331 } else if(!strncasecmp(cmd, "radio", 5)){ // "radio" or "radio 0" or "radio 1"
332 int radio;
333 if(!strcasecmp(cmd, "radio")) { // Get
334 err = mbtk_radio_state_get(info_handle, &radio);
335 if(err) {
336 printf("Error : %d\n", err);
337 } else {
338 printf("Radio : %d\n", radio);
339 }
340 } else { // Set
341 if(!strcasecmp(cmd, "radio 1")) { // Open radio
342 radio = 1;
343 } else { // Close radio
344 radio = 0;
345 }
346 err = mbtk_radio_state_set(info_handle, radio);
347 if(err) {
348 printf("Error : %d\n", err);
349 } else {
350 printf("Radio set success\n");
351 }
352 }
353 } else if(!strncasecmp(cmd, "sim", 3)){
354 mbtk_sim_state_enum sim;
355 err = mbtk_sim_state_get(info_handle, &sim);
356 if(err) {
357 printf("Error : %d\n", err);
358 } else {
359 printf("Sim : %d\n", sim);
360 }
361 } else if(!strncasecmp(cmd, "imsi", 4)){
362 char imsi[50] = {0};
363 err = mbtk_imsi_get(info_handle, imsi);
364 if(err) {
365 printf("Error : %d\n", err);
366 } else {
367 printf("IMSI : %s\n", imsi);
368 }
369 } else if(!strncasecmp(cmd, "iccid", 5)){
370 char iccid[50] = {0};
371 err = mbtk_iccid_get(info_handle, iccid);
372 if(err) {
373 printf("Error : %d\n", err);
374 } else {
375 printf("ICCID : %s\n", iccid);
376 }
377 } else if(!strncasecmp(cmd, "pn", 2)){
378 char phone_number[50] = {0};
379 err = mbtk_phone_number_get(info_handle, phone_number);
380 if(err) {
381 printf("Error : %d\n", err);
382 } else {
383 printf("Phone Number : %s\n", phone_number);
384 }
385 } else if(!strncasecmp(cmd, "avail_net", 9)){
386 list_node_t* net_list = NULL;
387 err = mbtk_available_net_get(info_handle, &net_list);
388 if(err || net_list == NULL) {
389 printf("Error : %d\n", err);
390 } else {
391 mbtk_net_info_t* net = NULL;
392 list_first(net_list);
393 while ((net = (mbtk_net_info_t*) list_next(net_list)))
394 {
395 printf("Net : %d, %d, %d, %d\n", net->net_sel_mode, net->net_type, net->net_state, net->plmn);
396 }
397 }
398 list_free(net_list);
399 } else if(!strncasecmp(cmd, "cell", 4)){
400 char *ptr = strstr(cmd, ","); //CPMS,ME,ME,ME
401 if(ptr == NULL)
402 {
403 printf("ptr == NULL\n");
404 list_node_t* cell_list = NULL;
405 int type;
406 err = mbtk_cell_get(info_handle, &type, &cell_list);
407 if(err || cell_list == NULL) {
408 printf("Error : %d\n", err);
409 } else {
410 list_first(cell_list);
411 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
412 if(cell) { // Current server cell.
413 switch(type)
414 {
415 case 0:
416 printf("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
417 break;
418 case 1:
419 printf("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
420 break;
421 case 2:
422 printf("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
423 break;
424 default:
425 break;
426 }
427 }
428 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)))
429 {
430 switch(type)
431 {
432 case 0:
433 printf("CELL : %d, %d, %d, %d, %d", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
434 break;
435 case 1:
436 printf("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
437 break;
438 case 2:
439 printf("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
440 break;
441 default:
442 break;
443 }
444 }
445 }
446 list_free(cell_list);
447 }
448 else{
449 char *ptr = strstr(cmd, ","); //cell,2,3,,40936,430
450 char mem[50]={0};
451 char resp[1024] = {0};
452 if(ptr != NULL)
453 {
454 ptr++;
455 memset(mem, 0, sizeof(mem));
456 memcpy(mem, ptr, strlen(ptr));
457 printf("cell:%s\n", mem);
458 }
459 printf("cell_mem: %s \n", mem);
460
461 memset(resp, 0, sizeof(resp));
462 err = mbtk_cell_set(info_handle, mem, resp);
463 if(err) {
464 printf("Error : %d\n", err);
465 } else {
466 printf("cell set . resp:%s\n", resp);
467 }
468
469 }
470 } else if(!strncasecmp(cmd, "sel_mode", 8)){ // "sel_mode" or "sel_mode 1 7 46000"
471 mbtk_net_info_t net;
472 memset(&net, 0, sizeof(mbtk_net_info_t));
473 if(!strcasecmp(cmd, "sel_mode")) { // Get
474 err = mbtk_net_sel_mode_get(info_handle, &net);
475 if(err) {
476 printf("Error : %d\n", err);
477 } else {
478 printf("Net : %d, %d, %d, %d\n", net.net_sel_mode, net.net_type, net.net_state, net.plmn);
479 }
480 } else { // Set
481 char *ptr = strstr(cmd, " ");
482 if(ptr == NULL)
483 continue;
484 while(*ptr != '\0' && *ptr == ' ')
485 ptr++;
486 net.net_sel_mode = (uint8)atoi(ptr);
487
488 ptr = strstr(ptr, " ");
489 if(ptr == NULL)
490 continue;
491 while(*ptr != '\0' && *ptr == ' ')
492 ptr++;
493 net.net_type = (uint8)atoi(ptr);
494
495 ptr = strstr(ptr, " ");
496 if(ptr == NULL)
497 continue;
498 while(*ptr != '\0' && *ptr == ' ')
499 ptr++;
500 net.plmn = (uint32)atoi(ptr);
501
502 err = mbtk_net_sel_mode_set(info_handle, &net);
503 if(err) {
504 printf("Error : %d\n", err);
505 } else {
506 printf("Net select mode set success\n");
507 }
508 }
509 } else if(!strncasecmp(cmd, "band", 4)){ // "band" or "band support" or "band 0 79 147 482 524503"
510 mbtk_band_info_t band;
511 if(!strcasecmp(cmd, "band")) { // Get
512 err = mbtk_current_band_get(info_handle, &band);
513 if(err) {
514 printf("Error : %d\n", err);
515 } else {
516 printf("Band : %d, %d, %d, %d, %d\n", band.net_pref, band.gsm_band, band.umts_band, band.tdlte_band, band.fddlte_band);
517 }
518 } else if(!strcasecmp(cmd, "band support")) { // Get
519 err = mbtk_support_band_get(info_handle, &band);
520 if(err) {
521 printf("Error : %d\n", err);
522 } else {
523 printf("Band : %d, %d, %d, %d, %d\n", band.net_pref, band.gsm_band, band.umts_band, band.tdlte_band, band.fddlte_band);
524 }
525 } else { // "band 0 79 147 482 524503"
526 char *ptr = strstr(cmd, " ");
527 if(ptr == NULL)
528 continue;
529 while(*ptr != '\0' && *ptr == ' ')
530 ptr++;
531 band.net_pref = (uint8)atoi(ptr);
532
533 ptr = strstr(ptr, " ");
534 if(ptr == NULL)
535 continue;
536 while(*ptr != '\0' && *ptr == ' ')
537 ptr++;
538 band.gsm_band = (uint16)atoi(ptr);
539
540 ptr = strstr(ptr, " ");
541 if(ptr == NULL)
542 continue;
543 while(*ptr != '\0' && *ptr == ' ')
544 ptr++;
545 band.umts_band = (uint16)atoi(ptr);
546
547 ptr = strstr(ptr, " ");
548 if(ptr == NULL)
549 continue;
550 while(*ptr != '\0' && *ptr == ' ')
551 ptr++;
552 band.tdlte_band = (uint32)atoi(ptr);
553
554 ptr = strstr(ptr, " ");
555 if(ptr == NULL)
556 continue;
557 while(*ptr != '\0' && *ptr == ' ')
558 ptr++;
559 band.fddlte_band = (uint32)atoi(ptr);
560
561 err = mbtk_current_band_set(info_handle, &band);
562 if(err) {
563 printf("Error : %d\n", err);
564 } else {
565 printf("Band set success\n");
566 }
567 }
568 } else if(!strncasecmp(cmd, "signal", 6)){
569 mbtk_signal_info_t signal;
570 err = mbtk_net_signal_get(info_handle, &signal);
571 if(err) {
572 printf("Error : %d\n", err);
573 } else {
574 printf("Signal : %d, %d, %d, %d, %d, %d, %d, %d\n", signal.type, signal.rssi, signal.rxlev, signal.ber,
575 signal.rscp, signal.ecno, signal.rsrq, signal.rsrp);
576 }
577 } else if(!strncasecmp(cmd, "reg", 3)){
578 mbtk_net_reg_info_t reg;
579 err = mbtk_net_reg_get(info_handle, &reg);
580 if(err) {
581 printf("Error : %d\n", err);
582 } else {
583 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);
584 }
585 } else if(!strncasecmp(cmd, "call", 4)){
586 char phone_number[12];
587 char *ptr = strstr(cmd, " ");
588 if(ptr == NULL)
589 continue;
590 while(*ptr != '\0' && *ptr == ' ')
591 ptr++;
592 memset(phone_number,0,strlen(phone_number));
593 memcpy(phone_number,ptr,strlen(ptr));
594 printf("phone number is: %s\n",phone_number);
595 err = mbtk_call_start(info_handle, phone_number);
596 if(err) {
597 printf("Error : %d\n", err);
598 } else {
599 printf("Call success.\n");
600 }
601 } else if(!strncasecmp(cmd, "answer", 6)){
602 err = mbtk_call_answer(info_handle);
603 if(err) {
604 printf("Error : %d\n", err);
605 } else {
606 printf("Call success.\n");
607 }
608 } else if(!strncasecmp(cmd, "hangup", 6)){
609 int phone_id;
610 if(!strcasecmp(cmd, "hangup")) { // hang up all
611 err = mbtk_call_hang(info_handle);
612 if(err) {
613 printf("Error : %d\n", err);
614 } else {
615 printf("Call hang up all.\n");
616 }
617 } else if(!strcasecmp(cmd, "hangup 0")) {
618 err = mbtk_waiting_or_background_call_hang(info_handle);
619 if(err) {
620 printf("Error : %d\n", err);
621 } else {
622 printf("Call hang up waiting or background.\n");
623 }
624 } else if(!strcasecmp(cmd, "hangup 3")) {
625 err = mbtk_foreground_resume_background_call_hang(info_handle);
626 if(err) {
627 printf("Error : %d\n", err);
628 } else {
629 printf("Call hang up foreground resume background.\n");
630 }
631 } else {
632 if(!strcasecmp(cmd, "hangup 1")) { // hang up a call
633 phone_id = 1;
634 } else if(!strcasecmp(cmd, "hangup 2")) {
635 phone_id = 2;
636 } else {
637 printf("Error : Invalid input\n");
638 }
639 err = mbtk_a_call_hang(info_handle, phone_id);
640 if(err) {
641 printf("Error : %d\n", err);
642 } else {
643 printf("A Call hang up.\n");
644 }
645 }
646 } else if(!strncasecmp(cmd, "waitin", 6)){
647 mbtk_call_info_t reg;
648 err = mbtk_call_reg_get(info_handle, &reg);
649 if(err) {
650 printf("Error : %d\n", err);
651 } else {
652 if(reg.call_wait == 0) {
653 printf("No call ring\n");
654 }
655 else {
656 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);
657 }
658 }
659 } else if(!strncasecmp(cmd, "mute", 4)){ // "mute" or "mute 0" or "mute 1"
660 int mute;
661 if(!strcasecmp(cmd, "mute")) { // Get
662 err = mbtk_mute_state_get(info_handle, &mute);
663 if(err) {
664 printf("Error : %d\n", err);
665 } else {
666 printf("mute : %d\n", mute);
667 }
668 } else { // Set
669 if(!strcasecmp(cmd, "mute 1")) { // on mute
670 mute = 1;
671 } else { // off mute
672 mute = 0;
673 }
674 err = mbtk_mute_state_set(info_handle, mute);
675 if(err) {
676 printf("Error : %d\n", err);
677 } else {
678 printf("mute set success\n");
679 }
680 }
681 } else if(!strncasecmp(cmd, "DTMF", 4)){ // valid character: (0, 1, ..., 9, A, B, C, D, *, #)
682
683 mbtk_call_dtmf_info_t reg;
684
685 char *ptr = strstr(cmd, " ");
686 if(ptr == NULL)
687 continue;
688 while(*ptr != '\0' && *ptr == ' ')
689 ptr++;
690 reg.character = *ptr;
691
692 ptr = strstr(ptr, " ");
693 if(ptr == NULL)
694 continue;
695 while(*ptr != '\0' && *ptr == ' ')
696 ptr++;
697 reg.duration = (uint32)atoi(ptr);
698 printf("DTMF character is: %c,%d\n",reg.character, reg.duration);
699 err = mbtk_dtmf_send(info_handle, &reg);
700 if(err) {
701 printf("Error : %d\n", err);
702 } else {
703 printf("DTMF success.\n");
704 }
705 } else if(!strncasecmp(cmd, "shutdown", 8)){
706 if(!strcasecmp(cmd, "shutdown 0")) {
707 err = mbtk_system_reboot(0);
708 if(err) {
709 printf("Error : %d\n", err);
710 } else {
711 printf("Success.\n");
712 }
713 } else if(!strcasecmp(cmd, "shutdown 1")) {
714 err = mbtk_system_reboot(1);
715 if(err) {
716 printf("Error : %d\n", err);
717 } else {
718 printf("Success.\n");
719 }
720 } else if(!strcasecmp(cmd, "shutdown 2")) {
721 err = mbtk_system_reboot(2);
722 if(err) {
723 printf("Error : %d\n", err);
724 } else {
725 printf("Success.\n");
726 }
727 } else {
728 printf("Error.");
729 }
730 } else if(!strncasecmp(cmd, "power_sim", 9)){
731 if(!strcasecmp(cmd, "power_sim 0")) {
732 err = mbtk_sim_power_set(0);
733 if(err) {
734 printf("Error : %d\n", err);
735 } else {
736 printf("Success.\n");
737 }
738 } else if(!strcasecmp(cmd, "power_sim 1")) {
739 err = mbtk_sim_power_set(1);
740 if(err) {
741 printf("Error : %d\n", err);
742 } else {
743 printf("Success.\n");
744 }
745 } else {
746 printf("Error.");
747 }
748 } else if(!strncasecmp(cmd, "temp", 4)){
749 int temp;
750 if(!strcasecmp(cmd, "temp 0")) {
751 err = mbtk_temp_get(info_handle, 0, &temp);
752 if(err) {
753 printf("Error : %d\n", err);
754 } else {
755 printf("SOC : %d\n", temp);
756 }
757 } else if(!strcasecmp(cmd, "temp 1")) {
758 err = mbtk_temp_get(info_handle, 1, &temp);
759 if(err) {
760 printf("Error : %d\n", err);
761 } else {
762 printf("RF : %d\n", temp);
763 }
764 } else {
765 printf("Error.");
766 }
767 } else if(!strncasecmp(cmd, "time", 4)){
768 if(!strcasecmp(cmd, "time 0")) {
769 err = mbtk_time_set(info_handle, 0, NULL);
770 if(err) {
771 printf("Error : %d\n", err);
772 } else {
773 printf("Success.\n");
774 }
775 } else if(!strcasecmp(cmd, "time 1")) {
776 err = mbtk_time_set(info_handle, 1, NULL);
777 if(err) {
778 printf("Error : %d\n", err);
779 } else {
780 printf("Success.\n");
781 }
782 } else if(!strncasecmp(cmd, "time 2 ", 7)) {
783 err = mbtk_time_set(info_handle, 2, cmd + 7);
784 if(err) {
785 printf("Error : %d\n", err);
786 } else {
787 printf("Success.\n");
788 }
789 } else { // Get time type.
790 int time_type;
791 err = mbtk_time_get(info_handle, &time_type);
792 if(err) {
793 printf("Error : %d\n", err);
794 } else {
795 printf("Time type:%d.\n", time_type);
796 }
797 }
798 } else if(!strncasecmp(cmd, "apn", 3)){
799 if(!strcasecmp(cmd, "apn")) { // Get apn
800 #define APN_MAX 10
801 mbtk_apn_info_t apns[APN_MAX];
802 int apn_num = APN_MAX;
803 err = mbtk_apn_get(info_handle, &apn_num, apns);
804 if(err) {
805 printf("Error : %d\n", err);
806 } else {
807 printf("APN Num:%d\n", apn_num);
808 int i = 0;
809 while(i < apn_num) {
810 printf("APN : %d, %s, %s\n", apns[i].cid, apn2str(apns[i].ip_type), apns[i].apn);
811 i++;
812 }
813 }
814 } else { // apn <cid> <0/1/2/3> <apn>
815 char *ptr = strstr(cmd, " ");
816 if(ptr == NULL)
817 continue;
818 while(*ptr != '\0' && *ptr == ' ')
819 ptr++;
820 int cid = atoi(ptr);
821
822 ptr = strstr(ptr, " ");
823 if(ptr == NULL)
824 continue;
825 while(*ptr != '\0' && *ptr == ' ')
826 ptr++;
827 mbtk_ip_type_enum ip_type = (mbtk_ip_type_enum)atoi(ptr);
828
829 ptr = strstr(ptr, " ");
830 if(ptr == NULL)
831 continue;
832 while(*ptr != '\0' && *ptr == ' ')
833 ptr++;
834 char *apn = ptr;
835
836 err = mbtk_apn_set(info_handle, cid, ip_type, apn, NULL, NULL, NULL);
837 if(err) {
838 printf("Error : %d\n", err);
839 } else {
840 printf("APN set success\n");
841 }
842 }
843 } else if(!strncasecmp(cmd, "data_call", 9)){ // data_call <0/1/2> <cid> <timeout>
844 // data_call <0/1/2> <cid> <timeout>
845 char *ptr = strstr(cmd, " ");
846 if(ptr == NULL)
847 continue;
848 while(*ptr != '\0' && *ptr == ' ')
849 ptr++;
850 mbtk_data_call_type_enum type = (mbtk_data_call_type_enum)atoi(ptr);
851
852 ptr = strstr(ptr, " ");
853 if(ptr == NULL)
854 continue;
855 while(*ptr != '\0' && *ptr == ' ')
856 ptr++;
857 int cid = atoi(ptr);
858
859 ptr = strstr(ptr, " ");
860 if(ptr == NULL)
861 continue;
862 while(*ptr != '\0' && *ptr == ' ')
863 ptr++;
864 int timeout = atoi(ptr);
865
866 if(type == MBTK_DATA_CALL_START) {
867 err = mbtk_data_call_start(info_handle, cid, 0, FALSE, timeout);
868 } else if(type == MBTK_DATA_CALL_STOP) {
869 err = mbtk_data_call_stop(info_handle, cid, timeout);
870 } else {
871 mbtk_ipv4_info_t ipv4;
872 mbtk_ipv6_info_t ipv6;
873 err = mbtk_data_call_state_get(info_handle, cid, &ipv4, &ipv6);
874 if(!err) {
875 if(ipv4.valid) {
876 // log_hex("IPv4", &ipv4, sizeof(mbtk_ipv4_info_t));
877 char ip_tmp[20];
878
879 memset(ip_tmp, 0, 20);
880 if(inet_ntop(AF_INET, &(ipv4.IPAddr), ip_tmp, 20) == NULL) {
881 printf("IP error.\n");
882 } else {
883 printf("IP : %s\n", ip_tmp);
884 }
885
886 memset(ip_tmp, 0, 20);
887 if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), ip_tmp, 20) == NULL) {
888 printf("PrimaryDNS error.\n");
889 } else {
890 printf("PrimaryDNS : %s\n", ip_tmp);
891 }
892
893 memset(ip_tmp, 0, 20);
894 if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), ip_tmp, 20) == NULL) {
895 printf("SecondaryDNS error.\n");
896 } else {
897 printf("SecondaryDNS : %s\n", ip_tmp);
898 }
899
900 memset(ip_tmp, 0, 20);
901 if(inet_ntop(AF_INET, &(ipv4.GateWay), ip_tmp, 20) == NULL) {
902 printf("GateWay error.\n");
903 } else {
904 printf("GateWay : %s\n", ip_tmp);
905 }
906
907 memset(ip_tmp, 0, 20);
908 if(inet_ntop(AF_INET, &(ipv4.NetMask), ip_tmp, 20) == NULL) {
909 printf("NetMask error.\n");
910 } else {
911 printf("NetMask : %s\n", ip_tmp);
912 }
913 }
914
915 if(ipv6.valid) {
916 // log_hex("IPv6", &ipv6, sizeof(mbtk_ipv6_info_t));
917 char ip_tmp[50];
918
919 memset(ip_tmp, 0, 50);
920 if(ipv6_2_str(&(ipv6.IPV6Addr), ip_tmp)) {
921 printf("IP error.\n");
922 } else {
923 printf("IP : %s\n", ip_tmp);
924 }
925
926 memset(ip_tmp, 0, 50);
927 if(ipv6_2_str(&(ipv6.PrimaryDNS), ip_tmp)) {
928 printf("PrimaryDNS error.\n");
929 } else {
930 printf("PrimaryDNS : %s\n", ip_tmp);
931 }
932
933 memset(ip_tmp, 0, 50);
934 if(ipv6_2_str(&(ipv6.SecondaryDNS), ip_tmp)) {
935 printf("SecondaryDNS error.\n");
936 } else {
937 printf("SecondaryDNS : %s\n", ip_tmp);
938 }
939
940 memset(ip_tmp, 0, 50);
941 if(ipv6_2_str(&(ipv6.GateWay), ip_tmp)) {
942 printf("GateWay error.\n");
943 } else {
944 printf("GateWay : %s\n", ip_tmp);
945 }
946
947 memset(ip_tmp, 0, 50);
948 if(ipv6_2_str(&(ipv6.NetMask), ip_tmp)) {
949 printf("NetMask error.\n");
950 } else {
951 printf("NetMask : %s\n", ip_tmp);
952 }
953 }
954 }
955 }
956 if(err) {
957 printf("Error : %d\n", err);
958 } else {
959 printf("DATA_CALL success\n");
960 }
961 }else if(!strncasecmp(cmd, "cmgf", 4)){ // set mode 0: pud, 1:text
962 int mode;
963 if(!strcasecmp(cmd, "cmgf")) { // Get
964 err = mbtk_sms_cmgf_get(info_handle, &mode);
965 if(err) {
966 printf("Error : %d\n", err);
967 } else {
968 printf("VoLTE : %d\n", mode);
969 }
970 } else { // Set
971 if(!strcasecmp(cmd, "cmgf 1")) { // cmgf 1
972 mode = 1;
973 } else { //
974 mode = 0;
975 }
976 printf("mode:%d\n", mode);
977 sleep(2);
978 err = mbtk_sms_cmgf_set(info_handle, mode);
979 if(err) {
980 printf("Error : %d\n", err);
981 } else {
982 printf("VoLTE set success\n");
983 }
984 }
985 }else if(!strncasecmp(cmd, "cpms", 4)){ // //CPMS=ME, ME, ME
986 char mem[100] = {0};
987 char resp[100] = {0};
988 if(!strcasecmp(cmd, "cpms")) { // Get
989 err = mbtk_sms_cpms_get(info_handle, &mem);
990 if(err) {
991 printf("Error : %d\n", err);
992 } else {
993 printf("cpms : %s\n", mem);
994 }
995 } else { // Set
996
997 char *ptr = strstr(cmd, ","); //CPMS,ME,ME,ME
998 if(ptr != NULL)
999 {
1000 ptr++;
1001 memset(mem, 0, sizeof(mem));
1002 memcpy(mem, ptr, strlen(ptr));
1003 printf("cpms:%s\n", mem);
1004 }
1005 printf("cpms 0\n");
1006
1007 memset(resp, 0, sizeof(resp));
1008 err = mbtk_sms_cpms_set(info_handle, mem, resp);
1009 if(err) {
1010 printf("Error : %d\n", err);
1011 } else {
1012 printf("cpms set success. resp:%s\n", resp);
1013 }
1014 }
1015 }else if(!strncasecmp(cmd, "cmgs", 4)){ // AT+CMGS="10086", CMGS TEST
1016 char cmgs[1024] = {0};
1017 char resp[50] = {0};
1018 if(!strcasecmp(cmd, "cmgs")) { // Get
1019 int mode;
1020 // err = mbtk_sms_cmgs_get(info_handle, &mode);
1021 if(err) {
1022 printf("Error : %d\n", err);
1023 } else {
1024 printf("VoLTE : %d\n", mode);
1025 }
1026 } else { // Set
1027
1028 /*
1029 *AT+CMGS="10086", CMGS TEST // Send a SMS
1030 > CMGS TEST
1031 +CMGS: 17
1032 OK
1033 */
1034
1035 char *ptr = strstr(cmd, "cmgs,"); //CMGS="10086",hf
1036 if(ptr != NULL)
1037 {
1038 ptr = strstr(cmd, ",");
1039 ptr++;
1040 memset(cmgs, 0, sizeof(cmgs));
1041 memcpy(cmgs, ptr, strlen(ptr));
1042 printf("1cmgs:%s, strlen(cmgs):%d\n", cmgs, strlen(cmgs));
1043 }
1044
1045 memset(resp, 0, sizeof(resp));
1046 err = mbtk_sms_cmgs_set(info_handle, cmgs, resp);
1047 if(err) {
1048 printf("Error : %d\n", err);
1049 } else {
1050 printf("cmgs set success . resp:%s\n", resp);
1051 }
1052 }
1053 }else if(!strncasecmp(cmd, "cmss", 4)){ // +CMSS=<index>[,<da>[,<toda>]]
1054 char cmss[20] = {0};
1055 char resp[20] = {0};
1056 if(!strcasecmp(cmd, "cmgs")) { // Get
1057 printf("cmss : OK\n");
1058
1059 } else {
1060 char *ptr = strstr(cmd, "cmss,"); //CMSS=<index>
1061 if(ptr != NULL)
1062 {
1063 ptr = strstr(cmd, ",");
1064 ptr++;
1065 memset(cmss, 0, sizeof(cmss));
1066 memcpy(cmss, ptr, strlen(ptr));
1067 printf("1cmss:%s\n", cmss);
1068 }
1069
1070
1071 err = mbtk_sms_cmss_set(info_handle, cmss, resp);
1072 if(err) {
1073 printf("Error : %d\n", err);
1074 } else {
1075 printf("cmss set success. resp:%s\n", resp);
1076 }
1077 }
1078 }
1079 else if(!strncasecmp(cmd, "cmgr", 4)){ // +CMGR=<index
1080 int index = 0;
1081 char resp[1024] = {0};
1082 if(!strcasecmp(cmd, "cmgr")) { // Get
1083 printf("cmgr : OK\n");
1084
1085 } else {
1086 char *ptr = strstr(cmd, "cmgr,"); //+CMGR <index>
1087 if(ptr != NULL)
1088 {
1089 ptr = strstr(cmd, ",");
1090 ptr++;
1091 index = atoi(ptr);
1092 }
1093 printf("1index:%d\n", index);
1094
1095 memset(resp, 0, sizeof(resp));
1096 err = mbtk_sms_cmgr_set(info_handle, index, resp);
1097 if(err) {
1098 printf("Error : %d\n", err);
1099 } else {
1100 printf("cmgr set success. rep:%s\n", resp);
1101 }
1102 }
1103 }
1104 else if(!strncasecmp(cmd, "cmgw", 4)){ // +CMGW=<oa/da>[,<tooa/toda>[,<stat>]]<CR>
1105 //+CMGW=<length>[,<stat>]<CR>PDU is given<ctrl-Z/ESC>
1106 char cmgw[128] = {0};
1107 char resp[50] = {0};
1108 if(!strcasecmp(cmd, "cmgw")) { // Get
1109 printf("cmgw : OK\n");
1110
1111 } else {
1112 char *ptr = strstr(cmd, "cmgw,"); //+CMGW, <oa/da>, data
1113 if(ptr != NULL)
1114 {
1115 ptr = strstr(cmd, ",");
1116 ptr++;
1117 memset(cmgw, 0, sizeof(cmgw));
1118 memcpy(cmgw, ptr, strlen(ptr));
1119 printf("cmgw:%s\n", cmgw);
1120 }
1121
1122 memset(resp, 0, sizeof(resp));
1123 err = mbtk_sms_cmgw_set(info_handle, cmgw, resp);
1124 if(err) {
1125 printf("Error : %d\n", err);
1126 } else {
1127 printf("cmgw set success. resp:%s\n", resp);
1128 }
1129 }
1130 }
1131 else if(!strncasecmp(cmd, "cmgd", 4)){ // +CMGD=<index>[,<delflag>
1132 //
1133 char cmgd[128] = {0};
1134 if(!strcasecmp(cmd, "cmgd")) { // Get
1135 printf("cmgd : OK\n");
1136
1137 } else {
1138 char *ptr = strstr(cmd, ","); //+CMGD=<index>[,<delflag>
1139 if(ptr != NULL)
1140 {
1141 ptr++;
1142 memset(cmgd, 0, sizeof(cmgd));
1143 memcpy(cmgd, ptr, strlen(ptr));
1144 printf("1cmgd:%s\n", cmgd);
1145 }
1146
1147
1148 err = mbtk_sms_cmgd_set(info_handle, cmgd);
1149 if(err) {
1150 printf("Error : %d\n", err);
1151 } else {
1152 printf("VoLTE set success\n");
1153 }
1154 }
1155 }
1156 else if(!strncasecmp(cmd, "cmgl", 4)){ // AT+CMGL[=<stat>]
1157 //
1158 char cmgl[128] = {0};
1159 char resp[5*1024] ={0};
1160 if(!strcasecmp(cmd, "cmgl")) { // Get
1161 printf("cmgl : OK\n");
1162
1163 } else {
1164 char *ptr = strstr(cmd, "cmgl,"); // AT+CMGL[=<stat>]
1165 if(ptr != NULL)
1166 {
1167 ptr = strstr(cmd, ",");
1168 ptr++;
1169 memset(cmgl, 0, sizeof(cmgl));
1170 memcpy(cmgl, ptr, strlen(ptr));
1171 printf("0cmgl:%s\n", cmgl);
1172 }
1173
1174 memset(resp, 0, sizeof(resp));
1175 err = mbtk_sms_cmgl_set(info_handle, cmgl, resp);
1176 if(err) {
1177 printf("Error : %d\n", err);
1178 } else {
1179 // printf("cmgl set success, reg:%s\n",resp);
1180 }
1181 }
1182 }
1183 else if(!strncasecmp(cmd, "csca", 4)){ // AT+CSCA=<number> [,<type>]
1184 //
1185 char csca[128] = {0};
1186 if(!strcasecmp(cmd, "csca")) { // Get
1187 err = mbtk_sms_csca_get(info_handle, csca);
1188 if(err) {
1189 printf("mbtk_sms_csca_get Error : %d\n", err);
1190 } else {
1191 printf("mbtk_sms_csca_get success\n");
1192 }
1193
1194 } else {
1195 char *ptr = strstr(cmd, ","); // AT+CSCA=<number> [,<type>]
1196 if(ptr != NULL)
1197 {
1198 ptr++;
1199 memset(csca, 0, sizeof(csca));
1200 memcpy(csca, ptr, strlen(ptr));
1201 printf("csca:%s\n", csca);
1202 }
1203
1204 err = mbtk_sms_csca_set(info_handle, csca);
1205 if(err) {
1206 printf("Error : %d\n", err);
1207 } else {
1208 printf("VoLTE set success\n");
1209 }
1210 }
1211 }
1212 else if(!strncasecmp(cmd, "csmp", 4)){ // AT+CSMP=[<fo>[,<vp>[,<pid>[,<dcs>]]]]
1213 //
1214 char csmp[128] = {0};
1215 if(!strcasecmp(cmd, "csmp")) { // Get
1216 printf("cmgl : OK\n");
1217
1218 } else {
1219 char *ptr = strstr(cmd, ","); // AT+CSMP=[<fo>[,<vp>[,<pid>[,<dcs>]]]]
1220 if(ptr != NULL)
1221 {
1222 ptr++;
1223 memset(csmp, 0, sizeof(csmp));
1224 memcpy(csmp, ptr, strlen(ptr));
1225 printf("csmp:%s\n", csmp);
1226 }
1227
1228 err = mbtk_sms_csmp_set(info_handle, csmp);
1229 if(err) {
1230 printf("Error : %d\n", err);
1231 } else {
1232 printf("VoLTE set success\n");
1233 }
1234 }
1235 }
1236 else if(!strncasecmp(cmd, "cscb", 4)){ // AT+CSCB=<[<mode>[,<mids>[,<dcss>]]]>
1237 //
1238 char cscb[128] = {0};
1239 if(!strcasecmp(cmd, "cscb")) { // Get
1240 printf("cmgl : OK\n");
1241
1242 } else {
1243 char *ptr = strstr(cmd, ","); // AT+CSCB=<[<mode>[,<mids>[,<dcss>]]]>
1244 if(ptr != NULL)
1245 {
1246 ptr++;
1247 memset(cscb, 0, sizeof(cscb));
1248 memcpy(cscb, ptr, strlen(ptr));
1249 printf("cscb:%s\n", cscb);
1250 }
1251
1252 err = mbtk_sms_cscb_set(info_handle, cscb);
1253 if(err) {
1254 printf("Error : %d\n", err);
1255 } else {
1256 printf("VoLTE set success\n");
1257 }
1258 }
1259 }
1260 else if(!strcasecmp(cmd, "h") || !strcasecmp(cmd, "help")) {
1261 help();
1262 } else if(!strcasecmp(cmd, "q")) {
1263 mbtk_info_handle_free(&info_handle);
1264 break;
1265 } else {
1266 printf("\n");
1267 }
1268 }
1269 }
1270
1271 LOG("Client exec complete.");
1272#if 1
1273 while(1)
1274 {
1275 sleep(1000 * 365 * 24 * 60 * 60);
1276 }
1277#else
1278 sleep(1);
1279#endif
1280 return 0;
1281}