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