blob: cd27be53a9632fe6ea609f3b670d4beab04451d9 [file] [log] [blame]
lle1d5d7c2022-01-18 12:34:30 +00001/*=============================================================================
2# FileName: lynq_sim.cpp
3# Desc: about SIM API
4# Author: mobiletek
5# Version: V1.0
6# LastChange: 2021-12-29
7# History:
8=============================================================================*/
9#include <stdio.h>
10#include <sys/types.h>
11#include <sys/socket.h>
12#include <arpa/inet.h>
13#include <string.h>
14#include <unistd.h>
15#include <binder/Parcel.h>
16#include <log/log.h>
17#include <cutils/jstring.h>
18#include <pthread.h>
19#include "lynq_sim.h"
20#include <sys/socket.h>
21#include <netinet/in.h>
22#include <arpa/inet.h>
23#define MAX_BUF 20
24#define MAX_NUM 80
25#define RIL_REQUEST_GET_SIM_STATUS 1
26#define RIL_REQUEST_GET_IMSI 11
27#define RIL_REQUEST_QUERY_ICCID 2026
28#define RIL_REQUEST_SET_FACILITY_LOCK 43
29#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
30#define RIL_REQUEST_ENTER_SIM_PIN 2
31#define RIL_REQUEST_ENTER_SIM_PUK 3
32#define RIL_REQUEST_CHANGE_SIM_PIN 6
33#define RIL_REQUEST_OEM_HOOK_RAW 59
ll887a0172022-03-09 03:13:31 +000034#define RIL_REQUEST_SCREEN_STATE 61
rjw5d2a50e2022-02-28 15:01:49 +080035#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
lle1d5d7c2022-01-18 12:34:30 +000036#define MAX_LEN 1024*8
37#define MAX_NUM 10
38#define LOG_TAG "LYNQ_SIM"
39#define FLAG_TESS 0
40using ::android::Parcel;
41#define DEST_PORT 8088
42#define DSET_IP_ADDRESS "127.0.0.1"
43
44typedef struct{
45 int uToken;
46 int request;
47 int paramLen;
48 char param[MAX_LEN];
49}lynq_client_t;
50
51lynq_client_t client_t;
52/* socket文件描述符 */
53int len_addr_serv;
54struct sockaddr_in addr_serv;
55static int sock_fd = 0;
56int Global_uToken = 0;
57int resp_type = -1;
58int request = -1;
59int slot_id = -1;
60int error1 = -1;
61
62int lynq_sim_init(int utoken){
63 if(utoken < 0){
64 return -1;
65 }
66 // LYLOGSET(LOG_INFO);
67 // LYLOGEINIT(USER_LOG_TAG);
68 Global_uToken = utoken;
69 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
70 if (-1 == sock_fd)
71 {
72 return sock_fd;
73 }
74 /* 设置address */
75 memset(&addr_serv, 0, sizeof(addr_serv));
76 addr_serv.sin_family = AF_INET;
77 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
78 addr_serv.sin_port = htons(DEST_PORT);
79 len_addr_serv = sizeof(addr_serv);
80 /*test*/
81 return 0;
82}
83
84int lynq_sim_deinit(void){
85 close(sock_fd);
86 return 0;
87}
88
89static char * lynqStrdupReadString(Parcel &p) {
90 size_t stringlen;
91 const char16_t *s16;
92
93 s16 = p.readString16Inplace(&stringlen);
94 return strndup16to8(s16, stringlen);
95}
96
97/*If you need to use any API under lynq_sim, you mustfirst call the init_sim() function to initialize these functions.*/
98int lynq_get_sim_status(int *card_status)
99{
100 int ret = -1;
101 if(card_status == NULL)
102 return ret;
103 int send_num = 0;
104 int recv_num = 0;
105 int len = 0;
106 lynq_client_t client_t1;
107 memset(&client_t1, 0, sizeof(client_t1) );
108 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
109 client_t1.paramLen = 0;
110 client_t1.uToken = Global_uToken;
111 char res_data[MAX_LEN] = {0};
112 int len1 = sizeof(client_t1.param);
113 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
114 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
115 if(send_num < 0)
116 {
117 RLOGD("sendto error:");
118 return send_num;
119 }
120 //get data msg
121 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
122 if(recv_num < 0 || recv_num == 0)
123 {
124 RLOGD("recvfrom step2 fail:");
125 return recv_num;
126 }
127 Parcel p;;
128 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
129 p.setDataPosition(0);
130 if(p.dataAvail() > 0)
131 {
132 p.readInt32(&resp_type);
133 p.readInt32(&request);
134 p.readInt32(&slot_id);
135 p.readInt32(&error1);
136 p.readInt32(card_status);
137 }
138 return error1;
139}
140/*AT> AT+CIMI AT< IMSI*/
141int lynq_get_imsi(char buf[])
142{
143 int ret = -1;
144 if(buf == NULL)
145 return ret;
146 int send_num = 0;
147 int recv_num = 0;
148 int len = 0;
149 lynq_client_t client_t1;
150 memset(&client_t1, 0, sizeof(client_t1) );
151 client_t1.request = RIL_REQUEST_GET_IMSI;
152 client_t1.paramLen = 0;
153 client_t1.uToken = Global_uToken;
154 char res_data[MAX_LEN] = {0};
155 memset(client_t1.param, 0, sizeof(client_t1.param));
156 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
157 if(send_num < 0)
158 {
159 RLOGD("sendto error:");
160 return send_num;
161 }
162 //get data msg
163 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
164 if(recv_num < 0 || recv_num == 0)
165 {
166 RLOGD("recvfrom step2 fail:");
167 return recv_num;
168 }
169 Parcel p;
170 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
171 p.setDataPosition(0);
172 if(p.dataAvail() > 0)
173 {
174 p.readInt32(&resp_type);
175 p.readInt32(&request);
176 p.readInt32(&slot_id);
177 p.readInt32(&error1);
178 if(!error1){
179 char * test = lynqStrdupReadString(p);
180 memcpy(buf, test, strlen(test));
181 }
182 }
183 return error1;
184}
185
186
187/*add by lei*/
188
189int lynq_get_iccid(char buf[]){
190 int ret = -1;
191 if(buf == NULL)
192 return ret;
193 int send_num = 0;
194 int recv_num = 0;
195 int len = 0;
196 client_t.request = RIL_REQUEST_QUERY_ICCID;
197 client_t.paramLen = 0;
198 client_t.uToken = Global_uToken;
199 char res_data[MAX_LEN] = {0};
200 memset(client_t.param, 0, sizeof(client_t.param));
201 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
202 if(send_num < 0)
203 {
204 RLOGD("sendto error:");
205 return send_num;
206 }
207 //get data msg
208 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
209 if(recv_num < 0 || recv_num == 0)
210 {
211 RLOGD("recvfrom step2 fail:");
212 return recv_num;
213 }
214 Parcel p;
215 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
216 p.setDataPosition(0);
217 if(p.dataAvail() > 0)
218 {
219 p.readInt32(&resp_type);
220 p.readInt32(&request);
221 p.readInt32(&slot_id);
222 p.readInt32(&error1);
223 if(!error1){
224 char * test = lynqStrdupReadString(p);
225 memcpy(buf, test, strlen(test));
226 }
227 }
228 return error1;
229}
230
231int lynq_enable_pin(char *pin){
232 int ret = -1;
233 if(pin == NULL)
234 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800235 if(!strlen(pin))
236 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000237 int send_num = 0;
238 int recv_num = 0;
239 char res_data[MAX_LEN] = {0};
240 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
241 client_t.paramLen = 4;
242 client_t.uToken = Global_uToken;
243 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
244 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
245 if(send_num < 0)
246 {
247 RLOGD("sendto error:");
248 return send_num;
249 }
250
251 //get data msg
252 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
253 if(recv_num < 0 || recv_num == 0)
254 {
255 RLOGD("recvfrom step2 fail:");
256 return recv_num;
257 }
258 Parcel p;
259 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
260 p.setDataPosition(0);
261 if(p.dataAvail() > 0)
262 {
263 p.readInt32(&resp_type);
264 p.readInt32(&request);
265 p.readInt32(&slot_id);
266 p.readInt32(&error1);
267 }
268 return error1;
269}
270
271int lynq_disable_pin(char *pin){
272 int ret = -1;
273 if(pin == NULL)
274 return ret;
275 int send_num = 0;
276 int recv_num = 0;
277 char res_data[MAX_LEN] = {0};
278 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
279 client_t.paramLen = 4;
280 client_t.uToken = Global_uToken;
281 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
282 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
283 if(send_num < 0)
284 {
285 RLOGD("sendto error:");
286 return send_num;
287 }
288 //get data msg
289 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
290 if(recv_num < 0 || recv_num == 0)
291 {
292 RLOGD("recvfrom step2 fail:");
293 return recv_num;
294 }
295 Parcel p;
296 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
297 p.setDataPosition(0);
298 if(p.dataAvail() > 0)
299 {
300 p.readInt32(&resp_type);
301 p.readInt32(&request);
302 p.readInt32(&slot_id);
303 p.readInt32(&error1);
304 }
305 return error1;
306}
307
308int lynq_query_pin_lock(char *pin,int buf[]){
309 int ret = -1;
310 if(pin == NULL)
311 return ret;
312 int send_num = 0;
313 int recv_num = 0;
314 int len = 0;
315 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
316 client_t.paramLen = 3;
317 client_t.uToken = Global_uToken;
318 char res_data[MAX_LEN] = {0};
319 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
320 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
321 if(send_num < 0)
322 {
323 RLOGD("sendto error:");
324 return send_num;
325 }
326 //get data msg
327 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
328 if(recv_num < 0 || recv_num == 0)
329 {
330 RLOGD("recvfrom step2 fail:");
331 return recv_num;
332 }
333 Parcel p;
334 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
335 p.setDataPosition(0);
336 int num = -1;
337 if(p.dataAvail() > 0)
338 {
339 p.readInt32(&resp_type);
340 p.readInt32(&request);
341 p.readInt32(&slot_id);
342 p.readInt32(&error1);
343 p.readInt32(&num);
344 if(num > 0){
345 int *test = (int *)calloc(1, sizeof(int)*num);
346 for(int i =0; i <num; i++){
347 p.readInt32(&test[i]);
348 buf[i] = test[i];
349 }
350 free(test);
351 }
352 }
353 return error1;
354}
355
356int lynq_verify_pin(char *pin){
357 int ret = -1;
358 if(pin == NULL)
359 return ret;
360 int send_num = 0;
361 int recv_num = 0;
362 char res_data[MAX_LEN] = {0};
363 int len = 0;
364 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
365 client_t.paramLen = 1;
366 client_t.uToken = Global_uToken;
367 sprintf(client_t.param, "%s\n", pin);
368 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
369 if(send_num < 0)
370 {
371 RLOGD("sendto error:");
372 return send_num;
373 }
374 //get data msg
375 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
376 if(recv_num < 0 || recv_num == 0)
377 {
378 RLOGD("recvfrom step2 fail:");
379 return recv_num;
380 }
381 Parcel p;
382 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
383 p.setDataPosition(0);
384 if(p.dataAvail() > 0)
385 {
386 p.readInt32(&resp_type);
387 p.readInt32(&request);
388 p.readInt32(&slot_id);
389 p.readInt32(&error1);
390 }
391 return error1;
392}
393
394int lynq_change_pin(char *old_pin, char *new_pin){
395 int ret = -1;
396 if(old_pin == NULL || new_pin == NULL)
397 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800398 if(!strlen(new_pin))
399 return ret;
ll3fe03462022-03-01 09:18:53 +0000400 if(!strlen(old_pin))
401 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000402 int send_num = 0;
403 int recv_num = 0;
404 char res_data[MAX_LEN] = {0};
405 int len = 0;
406 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
407 client_t.paramLen = 2;
408 client_t.uToken = Global_uToken;
409 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
410 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
411 if(send_num < 0)
412 {
413 RLOGD("sendto error:");
414 return send_num;
415 }
416 //get data msg
417 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
418 if(recv_num < 0 || recv_num == 0)
419 {
420 RLOGD("recvfrom step2 fail:");
421 return recv_num;
422 }
423 Parcel p;
424 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
425 p.setDataPosition(0);
426 if(p.dataAvail() > 0)
427 {
428 p.readInt32(&resp_type);
429 p.readInt32(&request);
430 p.readInt32(&slot_id);
431 p.readInt32(&error1);
432 }
433 return error1;
434}
435
436int lynq_unlock_pin(char *puk, char *pin){
437 int ret = -1;
438 if(puk == NULL || pin == NULL)
439 return ret;
440 int send_num = 0;
441 int recv_num = 0;
442 char res_data[MAX_LEN] = {0};
443 int len = 0;
444 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
445 client_t.paramLen = 2;
446 client_t.uToken = Global_uToken;
447 sprintf(client_t.param, "%s %s\n", puk, pin);
448 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
449 if(send_num < 0)
450 {
451 RLOGD("sendto error:");
452 return send_num;
453 }
454 //get data msg
455 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
456 if(recv_num < 0 || recv_num == 0)
457 {
458 RLOGD("recvfrom step2 fail:");
459 return recv_num;
460 }
461 Parcel p;
462 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
463 p.setDataPosition(0);
464 if(p.dataAvail() > 0)
465 {
466 p.readInt32(&resp_type);
467 p.readInt32(&request);
468 p.readInt32(&slot_id);
469 p.readInt32(&error1);
470 }
471 return error1;
472}
473
474static void delete_char(char str[],char target){
475 if(str == NULL){
476 return;
477 }
478 int i,j;
479 for(i=j=0;str[i]!='\0';i++){
480 if(str[i]!=target){
481 str[j++]=str[i];
482 }
483 }
484 str[j]='\0';
485}
486
487static int parse_param(char *cmd, char **argv, char buf[]){
488 if(cmd == NULL || argv == NULL || buf == NULL){
489 return 0;
490 }
491 if(strstr(cmd,"ERROR")){
492 //char *test = strchr(cmd, ':')+1;
493 int len = strlen(cmd);
494 memcpy(buf, cmd, len);
495 buf[len] = '\0';
496 return 3;
497 }
498 else{
499 int argc = 0;
500 char *token;
501 token = strtok(cmd, ",");
502 if(strstr(token, "CNUM")){
503 char *string;
504 while (token != NULL)
505 {
506 string = token;
507 argv[argc++] = string;
508 token = strtok(NULL, ",");
509 }
510 int lengh = strlen(argv[1]);
511 memcpy(buf, argv[1], lengh);
512 buf[lengh] = '\0';
513 delete_char(buf, '"');
514 }
515 }
516 return 0;
517}
518
519int lynq_query_phone_number(char buf[]){
520 int ret = -1;
521 if(buf == NULL)
522 return ret;
523 int send_num = 0;
524 int recv_num = 0;
525 int len = 0;
526 char res_data[MAX_LEN] = {0};
527 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
528 client_t.paramLen = 1;
529 client_t.uToken = Global_uToken;
530 sprintf(client_t.param, "%s\n", "AT+CNUM");
531 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
532 if(send_num < 0)
533 {
534 RLOGD("sendto error:");
535 return ret;
536 }
537 //get data msg
538 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
539 if(recv_num < 0 || recv_num == 0)
540 {
541 RLOGD("recvfrom step2 fail:");
542 return recv_num;
543 }
544 Parcel p;
545 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
546 p.setDataPosition(0);
547 int num = -1;
548 if(p.dataAvail() > 0)
549 {
550 char test[30] = {0};
551 char *argv[5] = {0};
552 p.readInt32(&resp_type);
553 p.readInt32(&request);
554 p.readInt32(&slot_id);
555 p.readInt32(&error1);
556 p.readInt32(&num);
557 if(num == -1){
558 }else{
559 p.read(test, num);
560 parse_param(test, argv, buf);
561 }
562 }
563 return error1;
564}
rjw5d2a50e2022-02-28 15:01:49 +0800565
566static int judge(int slot){
567 switch(slot){
568 case 0:
569 return -1;
570 case 1:
571 return -1;
572 }
573 return 0;
574}
575
rjw5d2a50e2022-02-28 15:01:49 +0800576int lynq_switch_card(int slot){
577 int ret = -1;
578 if(!judge(slot))
579 return ret;
580 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800581 char res_data[MAX_LEN] = {0};
582 int len = 0;
583 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
584 client_t.paramLen = 1;
585 client_t.uToken = Global_uToken;
586 sprintf(client_t.param, "%d\n", slot);
587 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
588 if(send_num < 0)
589 {
590 RLOGD("sendto error:");
591 return send_num;
592 }
593 return 0;
594}
ll887a0172022-03-09 03:13:31 +0000595
596int lynq_screen(int num){
597 int ret = -1;
598 if(!judge(num))
599 return ret;
600 int send_num = 0;
601 char res_data[MAX_LEN] = {0};
602 int len = 0;
603 client_t.request = RIL_REQUEST_SCREEN_STATE;
604 client_t.paramLen = 1;
605 client_t.uToken = Global_uToken;
606 sprintf(client_t.param, "%d\n", num);
607 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
608 if(send_num < 0)
609 {
610 RLOGD("sendto error:");
611 return send_num;
612 }
613 return 0;
614}
lle1d5d7c2022-01-18 12:34:30 +0000615#if FLAG_TESS
616int lynq_query_operator(char buf[]){
617 int32_t token = -1;
618 if(buf == NULL)
619 return token;
620 char msg_imsi[20] = {0};
621 memset(msg_imsi,0,sizeof(msg_imsi));
622 token = lynq_get_imsi(msg_imsi);
623 if(strlen(msg_imsi) != 0){
624 FindOperator *ope_command = NULL;
625 ope_command = find_ope_command(msg_imsi, findOperator);
626 if(ope_command){
627 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
628 buf[strlen(ope_command->buf)] = '\0';
629 }
630 else{
631 /*more*/
632 char mccmnc[5] = {0};
633 memcpy(buf, msg_imsi, 5);
634 buf[5] = '\0';
635 /*more*/
636 }
637 return token;
638 }
639 else{
640 //msg->base.e = err;
641 const char *test = "please insert sim card";
642 memcpy(buf, test, strlen(test));
643 return token;
644 }
645}
646FindOperator findOperator[] = {
647#include "operator.h"
648};
649
650static FindOperator*find_ope_command (char *name,FindOperator *Class){
651 if(name == NULL || Class == NULL){
652 return ((FindOperator *)NULL);
653 }
654 register int i;
655 for (i = 0; Class[i].MCCMCN; i++)
656 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
657 return (&Class[i]);
658 return ((FindOperator *)NULL);
659}
660
661#endif
662
663
664
665