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