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