blob: 4a2eb1a5b0772e85185f43a1f1f27c80ad39a3d0 [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
llba425bd2022-03-17 02:23:00 +000035#define RIL_REQUEST_SIM_IO 28
ll4c5c6b72022-03-31 15:27:23 +080036#define RIL_REQUEST_DEVICE_IDENTITY 98
rjw5d2a50e2022-02-28 15:01:49 +080037#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
lle1d5d7c2022-01-18 12:34:30 +000038#define MAX_LEN 1024*8
39#define MAX_NUM 10
40#define LOG_TAG "LYNQ_SIM"
41#define FLAG_TESS 0
42using ::android::Parcel;
43#define DEST_PORT 8088
44#define DSET_IP_ADDRESS "127.0.0.1"
45
46typedef struct{
47 int uToken;
48 int request;
49 int paramLen;
50 char param[MAX_LEN];
51}lynq_client_t;
52
53lynq_client_t client_t;
54/* socket文件描述符 */
55int len_addr_serv;
56struct sockaddr_in addr_serv;
57static int sock_fd = 0;
58int Global_uToken = 0;
59int resp_type = -1;
60int request = -1;
61int slot_id = -1;
62int error1 = -1;
llba425bd2022-03-17 02:23:00 +000063/**
64 * @brief mark call initialization state
65 * 0: deinit state
66 * 1: init state
67 */
68int g_lynq_sim_init_flag = 0;
69
70/**
71 * @brief lynq_req_sim_io need to send request
72 */
73char data_buf[32] = {0};
74char pin2_buf[32] = {0};
75char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000076
77int lynq_sim_init(int utoken){
llba425bd2022-03-17 02:23:00 +000078 if(g_lynq_sim_init_flag == 1)
79 {
80 RLOGD("lynq_sim_init failed");
81 return -1;
82 }
83 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +000084 if(utoken < 0){
85 return -1;
86 }
lle1d5d7c2022-01-18 12:34:30 +000087 Global_uToken = utoken;
88 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
89 if (-1 == sock_fd)
90 {
91 return sock_fd;
92 }
93 /* 设置address */
94 memset(&addr_serv, 0, sizeof(addr_serv));
95 addr_serv.sin_family = AF_INET;
96 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
97 addr_serv.sin_port = htons(DEST_PORT);
98 len_addr_serv = sizeof(addr_serv);
99 /*test*/
100 return 0;
101}
102
103int lynq_sim_deinit(void){
llba425bd2022-03-17 02:23:00 +0000104 if(g_lynq_sim_init_flag == 0)
105 {
106 RLOGD("lynq_sim_deinit failed");
107 return -1;
108 }
109 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000110 close(sock_fd);
111 return 0;
112}
113
114static char * lynqStrdupReadString(Parcel &p) {
115 size_t stringlen;
116 const char16_t *s16;
117
118 s16 = p.readString16Inplace(&stringlen);
119 return strndup16to8(s16, stringlen);
120}
121
llba425bd2022-03-17 02:23:00 +0000122/*If you need to use any API under lynq_sim, you mustfirst call the lynq_sim_init() function to initialize these functions.*/
lle1d5d7c2022-01-18 12:34:30 +0000123int lynq_get_sim_status(int *card_status)
124{
125 int ret = -1;
126 if(card_status == NULL)
127 return ret;
128 int send_num = 0;
129 int recv_num = 0;
130 int len = 0;
131 lynq_client_t client_t1;
132 memset(&client_t1, 0, sizeof(client_t1) );
133 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
134 client_t1.paramLen = 0;
135 client_t1.uToken = Global_uToken;
136 char res_data[MAX_LEN] = {0};
137 int len1 = sizeof(client_t1.param);
138 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
139 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
140 if(send_num < 0)
141 {
142 RLOGD("sendto error:");
143 return send_num;
144 }
145 //get data msg
146 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
147 if(recv_num < 0 || recv_num == 0)
148 {
149 RLOGD("recvfrom step2 fail:");
150 return recv_num;
151 }
152 Parcel p;;
153 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
154 p.setDataPosition(0);
155 if(p.dataAvail() > 0)
156 {
157 p.readInt32(&resp_type);
158 p.readInt32(&request);
159 p.readInt32(&slot_id);
160 p.readInt32(&error1);
161 p.readInt32(card_status);
162 }
163 return error1;
164}
llba425bd2022-03-17 02:23:00 +0000165
lle1d5d7c2022-01-18 12:34:30 +0000166int lynq_get_imsi(char buf[])
167{
168 int ret = -1;
169 if(buf == NULL)
170 return ret;
171 int send_num = 0;
172 int recv_num = 0;
173 int len = 0;
174 lynq_client_t client_t1;
175 memset(&client_t1, 0, sizeof(client_t1) );
176 client_t1.request = RIL_REQUEST_GET_IMSI;
177 client_t1.paramLen = 0;
178 client_t1.uToken = Global_uToken;
179 char res_data[MAX_LEN] = {0};
180 memset(client_t1.param, 0, sizeof(client_t1.param));
181 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
182 if(send_num < 0)
183 {
184 RLOGD("sendto error:");
185 return send_num;
186 }
187 //get data msg
188 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
189 if(recv_num < 0 || recv_num == 0)
190 {
191 RLOGD("recvfrom step2 fail:");
192 return recv_num;
193 }
194 Parcel p;
195 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
196 p.setDataPosition(0);
197 if(p.dataAvail() > 0)
198 {
199 p.readInt32(&resp_type);
200 p.readInt32(&request);
201 p.readInt32(&slot_id);
202 p.readInt32(&error1);
203 if(!error1){
204 char * test = lynqStrdupReadString(p);
205 memcpy(buf, test, strlen(test));
206 }
207 }
208 return error1;
209}
210
211
212/*add by lei*/
213
214int lynq_get_iccid(char buf[]){
215 int ret = -1;
216 if(buf == NULL)
217 return ret;
218 int send_num = 0;
219 int recv_num = 0;
220 int len = 0;
221 client_t.request = RIL_REQUEST_QUERY_ICCID;
222 client_t.paramLen = 0;
223 client_t.uToken = Global_uToken;
224 char res_data[MAX_LEN] = {0};
225 memset(client_t.param, 0, sizeof(client_t.param));
226 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
227 if(send_num < 0)
228 {
229 RLOGD("sendto error:");
230 return send_num;
231 }
232 //get data msg
233 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
234 if(recv_num < 0 || recv_num == 0)
235 {
236 RLOGD("recvfrom step2 fail:");
237 return recv_num;
238 }
239 Parcel p;
240 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
241 p.setDataPosition(0);
242 if(p.dataAvail() > 0)
243 {
244 p.readInt32(&resp_type);
245 p.readInt32(&request);
246 p.readInt32(&slot_id);
247 p.readInt32(&error1);
248 if(!error1){
249 char * test = lynqStrdupReadString(p);
250 memcpy(buf, test, strlen(test));
251 }
252 }
253 return error1;
254}
255
256int lynq_enable_pin(char *pin){
257 int ret = -1;
258 if(pin == NULL)
259 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800260 if(!strlen(pin))
261 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000262 int send_num = 0;
263 int recv_num = 0;
264 char res_data[MAX_LEN] = {0};
265 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
266 client_t.paramLen = 4;
267 client_t.uToken = Global_uToken;
268 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
269 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
270 if(send_num < 0)
271 {
272 RLOGD("sendto error:");
273 return send_num;
274 }
275
276 //get data msg
277 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
278 if(recv_num < 0 || recv_num == 0)
279 {
280 RLOGD("recvfrom step2 fail:");
281 return recv_num;
282 }
283 Parcel p;
284 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
285 p.setDataPosition(0);
286 if(p.dataAvail() > 0)
287 {
288 p.readInt32(&resp_type);
289 p.readInt32(&request);
290 p.readInt32(&slot_id);
291 p.readInt32(&error1);
292 }
293 return error1;
294}
295
296int lynq_disable_pin(char *pin){
297 int ret = -1;
298 if(pin == NULL)
299 return ret;
300 int send_num = 0;
301 int recv_num = 0;
302 char res_data[MAX_LEN] = {0};
303 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
304 client_t.paramLen = 4;
305 client_t.uToken = Global_uToken;
306 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
307 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
308 if(send_num < 0)
309 {
310 RLOGD("sendto error:");
311 return send_num;
312 }
313 //get data msg
314 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
315 if(recv_num < 0 || recv_num == 0)
316 {
317 RLOGD("recvfrom step2 fail:");
318 return recv_num;
319 }
320 Parcel p;
321 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
322 p.setDataPosition(0);
323 if(p.dataAvail() > 0)
324 {
325 p.readInt32(&resp_type);
326 p.readInt32(&request);
327 p.readInt32(&slot_id);
328 p.readInt32(&error1);
329 }
330 return error1;
331}
332
333int lynq_query_pin_lock(char *pin,int buf[]){
334 int ret = -1;
335 if(pin == NULL)
336 return ret;
337 int send_num = 0;
338 int recv_num = 0;
339 int len = 0;
340 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
341 client_t.paramLen = 3;
342 client_t.uToken = Global_uToken;
343 char res_data[MAX_LEN] = {0};
344 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
345 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
346 if(send_num < 0)
347 {
348 RLOGD("sendto error:");
349 return send_num;
350 }
351 //get data msg
352 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
353 if(recv_num < 0 || recv_num == 0)
354 {
355 RLOGD("recvfrom step2 fail:");
356 return recv_num;
357 }
358 Parcel p;
359 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
360 p.setDataPosition(0);
361 int num = -1;
362 if(p.dataAvail() > 0)
363 {
364 p.readInt32(&resp_type);
365 p.readInt32(&request);
366 p.readInt32(&slot_id);
367 p.readInt32(&error1);
368 p.readInt32(&num);
369 if(num > 0){
370 int *test = (int *)calloc(1, sizeof(int)*num);
371 for(int i =0; i <num; i++){
372 p.readInt32(&test[i]);
373 buf[i] = test[i];
374 }
375 free(test);
376 }
377 }
378 return error1;
379}
380
381int lynq_verify_pin(char *pin){
382 int ret = -1;
383 if(pin == NULL)
384 return ret;
385 int send_num = 0;
386 int recv_num = 0;
387 char res_data[MAX_LEN] = {0};
388 int len = 0;
389 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
390 client_t.paramLen = 1;
391 client_t.uToken = Global_uToken;
392 sprintf(client_t.param, "%s\n", pin);
393 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
394 if(send_num < 0)
395 {
396 RLOGD("sendto error:");
397 return send_num;
398 }
399 //get data msg
400 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
401 if(recv_num < 0 || recv_num == 0)
402 {
403 RLOGD("recvfrom step2 fail:");
404 return recv_num;
405 }
406 Parcel p;
407 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
408 p.setDataPosition(0);
409 if(p.dataAvail() > 0)
410 {
411 p.readInt32(&resp_type);
412 p.readInt32(&request);
413 p.readInt32(&slot_id);
414 p.readInt32(&error1);
415 }
416 return error1;
417}
418
419int lynq_change_pin(char *old_pin, char *new_pin){
420 int ret = -1;
421 if(old_pin == NULL || new_pin == NULL)
422 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800423 if(!strlen(new_pin))
424 return ret;
ll3fe03462022-03-01 09:18:53 +0000425 if(!strlen(old_pin))
426 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000427 int send_num = 0;
428 int recv_num = 0;
429 char res_data[MAX_LEN] = {0};
430 int len = 0;
431 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
432 client_t.paramLen = 2;
433 client_t.uToken = Global_uToken;
434 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
435 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
436 if(send_num < 0)
437 {
438 RLOGD("sendto error:");
439 return send_num;
440 }
441 //get data msg
442 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
443 if(recv_num < 0 || recv_num == 0)
444 {
445 RLOGD("recvfrom step2 fail:");
446 return recv_num;
447 }
448 Parcel p;
449 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
450 p.setDataPosition(0);
451 if(p.dataAvail() > 0)
452 {
453 p.readInt32(&resp_type);
454 p.readInt32(&request);
455 p.readInt32(&slot_id);
456 p.readInt32(&error1);
457 }
458 return error1;
459}
460
461int lynq_unlock_pin(char *puk, char *pin){
462 int ret = -1;
463 if(puk == NULL || pin == NULL)
464 return ret;
465 int send_num = 0;
466 int recv_num = 0;
467 char res_data[MAX_LEN] = {0};
468 int len = 0;
469 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
470 client_t.paramLen = 2;
471 client_t.uToken = Global_uToken;
472 sprintf(client_t.param, "%s %s\n", puk, pin);
473 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
474 if(send_num < 0)
475 {
476 RLOGD("sendto error:");
477 return send_num;
478 }
479 //get data msg
480 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
481 if(recv_num < 0 || recv_num == 0)
482 {
483 RLOGD("recvfrom step2 fail:");
484 return recv_num;
485 }
486 Parcel p;
487 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
488 p.setDataPosition(0);
489 if(p.dataAvail() > 0)
490 {
491 p.readInt32(&resp_type);
492 p.readInt32(&request);
493 p.readInt32(&slot_id);
494 p.readInt32(&error1);
495 }
496 return error1;
497}
498
499static void delete_char(char str[],char target){
500 if(str == NULL){
501 return;
502 }
503 int i,j;
504 for(i=j=0;str[i]!='\0';i++){
505 if(str[i]!=target){
506 str[j++]=str[i];
507 }
508 }
509 str[j]='\0';
510}
511
512static int parse_param(char *cmd, char **argv, char buf[]){
513 if(cmd == NULL || argv == NULL || buf == NULL){
514 return 0;
515 }
516 if(strstr(cmd,"ERROR")){
517 //char *test = strchr(cmd, ':')+1;
518 int len = strlen(cmd);
519 memcpy(buf, cmd, len);
520 buf[len] = '\0';
521 return 3;
522 }
523 else{
524 int argc = 0;
525 char *token;
526 token = strtok(cmd, ",");
527 if(strstr(token, "CNUM")){
528 char *string;
529 while (token != NULL)
530 {
531 string = token;
532 argv[argc++] = string;
533 token = strtok(NULL, ",");
534 }
535 int lengh = strlen(argv[1]);
536 memcpy(buf, argv[1], lengh);
537 buf[lengh] = '\0';
538 delete_char(buf, '"');
539 }
540 }
541 return 0;
542}
543
544int lynq_query_phone_number(char buf[]){
545 int ret = -1;
546 if(buf == NULL)
547 return ret;
548 int send_num = 0;
549 int recv_num = 0;
550 int len = 0;
551 char res_data[MAX_LEN] = {0};
552 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
553 client_t.paramLen = 1;
554 client_t.uToken = Global_uToken;
555 sprintf(client_t.param, "%s\n", "AT+CNUM");
556 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
557 if(send_num < 0)
558 {
559 RLOGD("sendto error:");
560 return ret;
561 }
562 //get data msg
563 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
564 if(recv_num < 0 || recv_num == 0)
565 {
566 RLOGD("recvfrom step2 fail:");
567 return recv_num;
568 }
569 Parcel p;
570 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
571 p.setDataPosition(0);
572 int num = -1;
573 if(p.dataAvail() > 0)
574 {
575 char test[30] = {0};
576 char *argv[5] = {0};
577 p.readInt32(&resp_type);
578 p.readInt32(&request);
579 p.readInt32(&slot_id);
580 p.readInt32(&error1);
581 p.readInt32(&num);
582 if(num == -1){
583 }else{
584 p.read(test, num);
585 parse_param(test, argv, buf);
586 }
587 }
588 return error1;
589}
rjw5d2a50e2022-02-28 15:01:49 +0800590
ll4c5c6b72022-03-31 15:27:23 +0800591/**
592 * @brief To handle comma-separated strings, take the character before the first comma eg:123456,78 ->123456
593 *
594 * @param buf Type:[IN]
595 */
596static void parse_imei(char buf[])
597{
598 if(NULL == buf)
599 {
600 return;
601 }
602 const char s[2] = ",";
603 char *token;
604 token = strtok(buf, s);
605 return;
606}
607
608int lynq_get_imei(char buf[])
609{
llfcd43492022-03-10 09:01:50 +0000610 int ret = -1;
611 if(buf == NULL)
612 return ret;
613 int send_num = 0;
614 int recv_num = 0;
615 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800616 lynq_client_t client_t1;
617 memset(&client_t1, 0, sizeof(client_t1) );
618 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
619 client_t1.paramLen = 0;
620 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000621 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800622 memset(client_t1.param, 0, sizeof(client_t1.param));
623 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000624 if(send_num < 0)
625 {
626 RLOGD("sendto error:");
ll4c5c6b72022-03-31 15:27:23 +0800627 return send_num;
llfcd43492022-03-10 09:01:50 +0000628 }
ll4c5c6b72022-03-31 15:27:23 +0800629 //get data msg
llfcd43492022-03-10 09:01:50 +0000630 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
631 if(recv_num < 0 || recv_num == 0)
632 {
633 RLOGD("recvfrom step2 fail:");
634 return recv_num;
635 }
636 Parcel p;
637 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
638 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800639 int num = 0;
llfcd43492022-03-10 09:01:50 +0000640 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800641 {
llfcd43492022-03-10 09:01:50 +0000642 p.readInt32(&resp_type);
643 p.readInt32(&request);
644 p.readInt32(&slot_id);
645 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800646 if(!error1){
647 p.readInt32(&num);
648 char * test = lynqStrdupReadString(p);
649 parse_imei(test);
650 memcpy(buf, test, strlen(test));
llfcd43492022-03-10 09:01:50 +0000651 }
652 }
653 return error1;
654}
655
rjw5d2a50e2022-02-28 15:01:49 +0800656static int judge(int slot){
657 switch(slot){
658 case 0:
659 return -1;
660 case 1:
661 return -1;
662 }
663 return 0;
664}
665
rjw5d2a50e2022-02-28 15:01:49 +0800666int lynq_switch_card(int slot){
667 int ret = -1;
668 if(!judge(slot))
669 return ret;
670 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800671 char res_data[MAX_LEN] = {0};
672 int len = 0;
673 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
674 client_t.paramLen = 1;
675 client_t.uToken = Global_uToken;
676 sprintf(client_t.param, "%d\n", slot);
677 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
678 if(send_num < 0)
679 {
680 RLOGD("sendto error:");
681 return send_num;
682 }
683 return 0;
684}
ll887a0172022-03-09 03:13:31 +0000685
686int lynq_screen(int num){
687 int ret = -1;
688 if(!judge(num))
689 return ret;
690 int send_num = 0;
691 char res_data[MAX_LEN] = {0};
692 int len = 0;
693 client_t.request = RIL_REQUEST_SCREEN_STATE;
694 client_t.paramLen = 1;
695 client_t.uToken = Global_uToken;
696 sprintf(client_t.param, "%d\n", num);
697 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
698 if(send_num < 0)
699 {
700 RLOGD("sendto error:");
701 return send_num;
702 }
703 return 0;
704}
llba425bd2022-03-17 02:23:00 +0000705
706/**
707 * @brief Check whether the input is valid for lynq_req_sim_io api
708 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
709 * type: [IN] list[1]:EF id(fileid)
710 * type: [IN] list[2]:offset(p1)
711 * type: [IN] list[3]:offset(p2)
712 * type: [IN] list[4]:response len,sometimes needn't care(p3)
713 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
714 type: [IN] Path is in hex asciii format eg "7f205f70"
715 type: [IN] Path must always be provided.
716 * @param data type: [IN] May be NULL
717 * @param pin2 type: [IN] May be NULL
718 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
719 * @param sw type: [OUT]
720 * @param simResponse type: [OUT] response
721 * @return int
722 */
723static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
724{
725 printf("__LINE__:%d\n", __LINE__);
726 if(list == NULL)
727 {
728 return -1;
729 }
730 if(path == NULL)
731 {
732 return -1;
733 }
734 if(sw == NULL){
735 return -1;
736 }
737 if(simResponse == NULL){
738 return -1;
739 }
740 if(data == NULL)
741 {
742 memcpy(data_buf, "null", 4);
743 }
744 else
745 {
746 bzero(data_buf,32);
747 memcpy(data_buf, data, strlen(data));
748 }
749 if(pin2 == NULL)
750 {
751 memcpy(pin2_buf, "null", 4);
752 }
753 else
754 {
755 bzero(pin2_buf,32);
756 memcpy(pin2_buf, data, strlen(data));
757 }
758 if(aidPtr == NULL)
759 {
760 memcpy(aidPtr_buf, "null", 4);
761 }
762 else
763 {
764 bzero(aidPtr_buf,32);
765 memcpy(aidPtr_buf, data, strlen(data));
766 }
767 return 0;
768}
769
770int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
771{
772 int ret = -1;
773 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
774 {
775 return ret;
776 }
777 int send_num = 0;
778 int recv_num = 0;
779 char res_data[MAX_LEN] = {0};
780 int len = 0;
781 client_t.request = RIL_REQUEST_SIM_IO;
782 client_t.paramLen = 9;
783 client_t.uToken = Global_uToken;
784 sprintf(client_t.param, "%d %d %s %d %d %d %s %s %s\n", list[0], list[1], path, list[2], list[3], list[4], data_buf, pin2_buf, aidPtr_buf);
785 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
786 if(send_num < 0)
787 {
788 RLOGD("sendto error:");
789 return send_num;
790 }
791 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
792 if(recv_num < 0 || recv_num == 0)
793 {
794 RLOGD("recvfrom step2 fail:");
795 return recv_num;
796 }
797 Parcel p;
798 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
799 p.setDataPosition(0);
800 int num = -1;
801 if(p.dataAvail() > 0)
802 {
803 char test[30] = {0};
804 char *argv[5] = {0};
805 p.readInt32(&resp_type);
806 p.readInt32(&request);
807 p.readInt32(&slot_id);
808 p.readInt32(&error1);
809 if(!error1)
810 {
811 p.readInt32(&sw[0]);
812 p.readInt32(&sw[1]);
813 char * test = lynqStrdupReadString(p);
814 memcpy(simResponse, test, strlen(test));
815 }
816
817 }
818 return error1;
819}
lle1d5d7c2022-01-18 12:34:30 +0000820#if FLAG_TESS
821int lynq_query_operator(char buf[]){
822 int32_t token = -1;
823 if(buf == NULL)
824 return token;
825 char msg_imsi[20] = {0};
826 memset(msg_imsi,0,sizeof(msg_imsi));
827 token = lynq_get_imsi(msg_imsi);
828 if(strlen(msg_imsi) != 0){
829 FindOperator *ope_command = NULL;
830 ope_command = find_ope_command(msg_imsi, findOperator);
831 if(ope_command){
832 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
833 buf[strlen(ope_command->buf)] = '\0';
834 }
835 else{
836 /*more*/
837 char mccmnc[5] = {0};
838 memcpy(buf, msg_imsi, 5);
839 buf[5] = '\0';
840 /*more*/
841 }
842 return token;
843 }
844 else{
845 //msg->base.e = err;
846 const char *test = "please insert sim card";
847 memcpy(buf, test, strlen(test));
848 return token;
849 }
850}
851FindOperator findOperator[] = {
852#include "operator.h"
853};
854
855static FindOperator*find_ope_command (char *name,FindOperator *Class){
856 if(name == NULL || Class == NULL){
857 return ((FindOperator *)NULL);
858 }
859 register int i;
860 for (i = 0; Class[i].MCCMCN; i++)
861 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
862 return (&Class[i]);
863 return ((FindOperator *)NULL);
864}
865
866#endif