blob: 25037399ead24d36f5f0a292fc34df2d6c9280d0 [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;
ll3fe03462022-03-01 09:18:53 +0000399 if(!strlen(old_pin))
400 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000401 int send_num = 0;
402 int recv_num = 0;
403 char res_data[MAX_LEN] = {0};
404 int len = 0;
405 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
406 client_t.paramLen = 2;
407 client_t.uToken = Global_uToken;
408 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
409 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
410 if(send_num < 0)
411 {
412 RLOGD("sendto error:");
413 return send_num;
414 }
415 //get data msg
416 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
417 if(recv_num < 0 || recv_num == 0)
418 {
419 RLOGD("recvfrom step2 fail:");
420 return recv_num;
421 }
422 Parcel p;
423 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
424 p.setDataPosition(0);
425 if(p.dataAvail() > 0)
426 {
427 p.readInt32(&resp_type);
428 p.readInt32(&request);
429 p.readInt32(&slot_id);
430 p.readInt32(&error1);
431 }
432 return error1;
433}
434
435int lynq_unlock_pin(char *puk, char *pin){
436 int ret = -1;
437 if(puk == NULL || pin == NULL)
438 return ret;
439 int send_num = 0;
440 int recv_num = 0;
441 char res_data[MAX_LEN] = {0};
442 int len = 0;
443 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
444 client_t.paramLen = 2;
445 client_t.uToken = Global_uToken;
446 sprintf(client_t.param, "%s %s\n", puk, pin);
447 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
448 if(send_num < 0)
449 {
450 RLOGD("sendto error:");
451 return send_num;
452 }
453 //get data msg
454 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
455 if(recv_num < 0 || recv_num == 0)
456 {
457 RLOGD("recvfrom step2 fail:");
458 return recv_num;
459 }
460 Parcel p;
461 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
462 p.setDataPosition(0);
463 if(p.dataAvail() > 0)
464 {
465 p.readInt32(&resp_type);
466 p.readInt32(&request);
467 p.readInt32(&slot_id);
468 p.readInt32(&error1);
469 }
470 return error1;
471}
472
473static void delete_char(char str[],char target){
474 if(str == NULL){
475 return;
476 }
477 int i,j;
478 for(i=j=0;str[i]!='\0';i++){
479 if(str[i]!=target){
480 str[j++]=str[i];
481 }
482 }
483 str[j]='\0';
484}
485
486static int parse_param(char *cmd, char **argv, char buf[]){
487 if(cmd == NULL || argv == NULL || buf == NULL){
488 return 0;
489 }
490 if(strstr(cmd,"ERROR")){
491 //char *test = strchr(cmd, ':')+1;
492 int len = strlen(cmd);
493 memcpy(buf, cmd, len);
494 buf[len] = '\0';
495 return 3;
496 }
497 else{
498 int argc = 0;
499 char *token;
500 token = strtok(cmd, ",");
501 if(strstr(token, "CNUM")){
502 char *string;
503 while (token != NULL)
504 {
505 string = token;
506 argv[argc++] = string;
507 token = strtok(NULL, ",");
508 }
509 int lengh = strlen(argv[1]);
510 memcpy(buf, argv[1], lengh);
511 buf[lengh] = '\0';
512 delete_char(buf, '"');
513 }
514 }
515 return 0;
516}
517
518int lynq_query_phone_number(char buf[]){
519 int ret = -1;
520 if(buf == NULL)
521 return ret;
522 int send_num = 0;
523 int recv_num = 0;
524 int len = 0;
525 char res_data[MAX_LEN] = {0};
526 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
527 client_t.paramLen = 1;
528 client_t.uToken = Global_uToken;
529 sprintf(client_t.param, "%s\n", "AT+CNUM");
530 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
531 if(send_num < 0)
532 {
533 RLOGD("sendto error:");
534 return ret;
535 }
536 //get data msg
537 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
538 if(recv_num < 0 || recv_num == 0)
539 {
540 RLOGD("recvfrom step2 fail:");
541 return recv_num;
542 }
543 Parcel p;
544 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
545 p.setDataPosition(0);
546 int num = -1;
547 if(p.dataAvail() > 0)
548 {
549 char test[30] = {0};
550 char *argv[5] = {0};
551 p.readInt32(&resp_type);
552 p.readInt32(&request);
553 p.readInt32(&slot_id);
554 p.readInt32(&error1);
555 p.readInt32(&num);
556 if(num == -1){
557 }else{
558 p.read(test, num);
559 parse_param(test, argv, buf);
560 }
561 }
562 return error1;
563}
rjw5d2a50e2022-02-28 15:01:49 +0800564
565static int judge(int slot){
566 switch(slot){
567 case 0:
568 return -1;
569 case 1:
570 return -1;
571 }
572 return 0;
573}
574
575
576int lynq_switch_card(int slot){
577 int ret = -1;
578 if(!judge(slot))
579 return ret;
580 int send_num = 0;
581 int recv_num = 0;
582 char res_data[MAX_LEN] = {0};
583 int len = 0;
584 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
585 client_t.paramLen = 1;
586 client_t.uToken = Global_uToken;
587 sprintf(client_t.param, "%d\n", slot);
588 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
589 if(send_num < 0)
590 {
591 RLOGD("sendto error:");
592 return send_num;
593 }
594 return 0;
595}
lle1d5d7c2022-01-18 12:34:30 +0000596#if FLAG_TESS
597int lynq_query_operator(char buf[]){
598 int32_t token = -1;
599 if(buf == NULL)
600 return token;
601 char msg_imsi[20] = {0};
602 memset(msg_imsi,0,sizeof(msg_imsi));
603 token = lynq_get_imsi(msg_imsi);
604 if(strlen(msg_imsi) != 0){
605 FindOperator *ope_command = NULL;
606 ope_command = find_ope_command(msg_imsi, findOperator);
607 if(ope_command){
608 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
609 buf[strlen(ope_command->buf)] = '\0';
610 }
611 else{
612 /*more*/
613 char mccmnc[5] = {0};
614 memcpy(buf, msg_imsi, 5);
615 buf[5] = '\0';
616 /*more*/
617 }
618 return token;
619 }
620 else{
621 //msg->base.e = err;
622 const char *test = "please insert sim card";
623 memcpy(buf, test, strlen(test));
624 return token;
625 }
626}
627FindOperator findOperator[] = {
628#include "operator.h"
629};
630
631static FindOperator*find_ope_command (char *name,FindOperator *Class){
632 if(name == NULL || Class == NULL){
633 return ((FindOperator *)NULL);
634 }
635 register int i;
636 for (i = 0; Class[i].MCCMCN; i++)
637 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
638 return (&Class[i]);
639 return ((FindOperator *)NULL);
640}
641
642#endif
643
644
645
646