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