blob: be065df66179cede248a8b3143a3482c4d95a65a [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
llb15599d2022-04-01 07:50:08 +000077/**/
78char options_buf[32] = {0};
79char time_buf[32] = {0};
80char message_buf[32] = {0};
81
lle1d5d7c2022-01-18 12:34:30 +000082int lynq_sim_init(int utoken){
llba425bd2022-03-17 02:23:00 +000083 if(g_lynq_sim_init_flag == 1)
84 {
85 RLOGD("lynq_sim_init failed");
86 return -1;
87 }
88 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +000089 if(utoken < 0){
90 return -1;
91 }
lle1d5d7c2022-01-18 12:34:30 +000092 Global_uToken = utoken;
93 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
94 if (-1 == sock_fd)
95 {
96 return sock_fd;
97 }
98 /* 设置address */
99 memset(&addr_serv, 0, sizeof(addr_serv));
100 addr_serv.sin_family = AF_INET;
101 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
102 addr_serv.sin_port = htons(DEST_PORT);
103 len_addr_serv = sizeof(addr_serv);
104 /*test*/
105 return 0;
106}
107
108int lynq_sim_deinit(void){
llba425bd2022-03-17 02:23:00 +0000109 if(g_lynq_sim_init_flag == 0)
110 {
111 RLOGD("lynq_sim_deinit failed");
112 return -1;
113 }
114 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000115 close(sock_fd);
116 return 0;
117}
118
119static char * lynqStrdupReadString(Parcel &p) {
120 size_t stringlen;
121 const char16_t *s16;
122
123 s16 = p.readString16Inplace(&stringlen);
124 return strndup16to8(s16, stringlen);
125}
126
llba425bd2022-03-17 02:23:00 +0000127/*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 +0000128int lynq_get_sim_status(int *card_status)
129{
130 int ret = -1;
131 if(card_status == NULL)
132 return ret;
133 int send_num = 0;
134 int recv_num = 0;
135 int len = 0;
136 lynq_client_t client_t1;
137 memset(&client_t1, 0, sizeof(client_t1) );
138 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
139 client_t1.paramLen = 0;
140 client_t1.uToken = Global_uToken;
141 char res_data[MAX_LEN] = {0};
142 int len1 = sizeof(client_t1.param);
143 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
144 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
145 if(send_num < 0)
146 {
147 RLOGD("sendto error:");
148 return send_num;
149 }
150 //get data msg
151 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
152 if(recv_num < 0 || recv_num == 0)
153 {
154 RLOGD("recvfrom step2 fail:");
155 return recv_num;
156 }
157 Parcel p;;
158 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
159 p.setDataPosition(0);
160 if(p.dataAvail() > 0)
161 {
162 p.readInt32(&resp_type);
163 p.readInt32(&request);
164 p.readInt32(&slot_id);
165 p.readInt32(&error1);
166 p.readInt32(card_status);
167 }
168 return error1;
169}
llba425bd2022-03-17 02:23:00 +0000170
lle1d5d7c2022-01-18 12:34:30 +0000171int lynq_get_imsi(char buf[])
172{
173 int ret = -1;
174 if(buf == NULL)
175 return ret;
176 int send_num = 0;
177 int recv_num = 0;
178 int len = 0;
179 lynq_client_t client_t1;
180 memset(&client_t1, 0, sizeof(client_t1) );
181 client_t1.request = RIL_REQUEST_GET_IMSI;
182 client_t1.paramLen = 0;
183 client_t1.uToken = Global_uToken;
184 char res_data[MAX_LEN] = {0};
185 memset(client_t1.param, 0, sizeof(client_t1.param));
186 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
187 if(send_num < 0)
188 {
189 RLOGD("sendto error:");
190 return send_num;
191 }
192 //get data msg
193 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
194 if(recv_num < 0 || recv_num == 0)
195 {
196 RLOGD("recvfrom step2 fail:");
197 return recv_num;
198 }
199 Parcel p;
200 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
201 p.setDataPosition(0);
202 if(p.dataAvail() > 0)
203 {
204 p.readInt32(&resp_type);
205 p.readInt32(&request);
206 p.readInt32(&slot_id);
207 p.readInt32(&error1);
208 if(!error1){
209 char * test = lynqStrdupReadString(p);
210 memcpy(buf, test, strlen(test));
211 }
212 }
213 return error1;
214}
215
216
217/*add by lei*/
218
219int lynq_get_iccid(char buf[]){
220 int ret = -1;
221 if(buf == NULL)
222 return ret;
223 int send_num = 0;
224 int recv_num = 0;
225 int len = 0;
226 client_t.request = RIL_REQUEST_QUERY_ICCID;
227 client_t.paramLen = 0;
228 client_t.uToken = Global_uToken;
229 char res_data[MAX_LEN] = {0};
230 memset(client_t.param, 0, sizeof(client_t.param));
231 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
232 if(send_num < 0)
233 {
234 RLOGD("sendto error:");
235 return send_num;
236 }
237 //get data msg
238 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
239 if(recv_num < 0 || recv_num == 0)
240 {
241 RLOGD("recvfrom step2 fail:");
242 return recv_num;
243 }
244 Parcel p;
245 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
246 p.setDataPosition(0);
247 if(p.dataAvail() > 0)
248 {
249 p.readInt32(&resp_type);
250 p.readInt32(&request);
251 p.readInt32(&slot_id);
252 p.readInt32(&error1);
253 if(!error1){
254 char * test = lynqStrdupReadString(p);
255 memcpy(buf, test, strlen(test));
256 }
257 }
258 return error1;
259}
260
261int lynq_enable_pin(char *pin){
262 int ret = -1;
263 if(pin == NULL)
264 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800265 if(!strlen(pin))
266 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000267 int send_num = 0;
268 int recv_num = 0;
269 char res_data[MAX_LEN] = {0};
270 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
271 client_t.paramLen = 4;
272 client_t.uToken = Global_uToken;
273 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
274 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
275 if(send_num < 0)
276 {
277 RLOGD("sendto error:");
278 return send_num;
279 }
280
281 //get data msg
282 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
283 if(recv_num < 0 || recv_num == 0)
284 {
285 RLOGD("recvfrom step2 fail:");
286 return recv_num;
287 }
288 Parcel p;
289 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
290 p.setDataPosition(0);
291 if(p.dataAvail() > 0)
292 {
293 p.readInt32(&resp_type);
294 p.readInt32(&request);
295 p.readInt32(&slot_id);
296 p.readInt32(&error1);
297 }
298 return error1;
299}
300
301int lynq_disable_pin(char *pin){
302 int ret = -1;
303 if(pin == NULL)
304 return ret;
305 int send_num = 0;
306 int recv_num = 0;
307 char res_data[MAX_LEN] = {0};
308 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
309 client_t.paramLen = 4;
310 client_t.uToken = Global_uToken;
311 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
312 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
313 if(send_num < 0)
314 {
315 RLOGD("sendto error:");
316 return send_num;
317 }
318 //get data msg
319 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
320 if(recv_num < 0 || recv_num == 0)
321 {
322 RLOGD("recvfrom step2 fail:");
323 return recv_num;
324 }
325 Parcel p;
326 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
327 p.setDataPosition(0);
328 if(p.dataAvail() > 0)
329 {
330 p.readInt32(&resp_type);
331 p.readInt32(&request);
332 p.readInt32(&slot_id);
333 p.readInt32(&error1);
334 }
335 return error1;
336}
337
338int lynq_query_pin_lock(char *pin,int buf[]){
339 int ret = -1;
340 if(pin == NULL)
341 return ret;
342 int send_num = 0;
343 int recv_num = 0;
344 int len = 0;
345 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
346 client_t.paramLen = 3;
347 client_t.uToken = Global_uToken;
348 char res_data[MAX_LEN] = {0};
349 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
350 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
351 if(send_num < 0)
352 {
353 RLOGD("sendto error:");
354 return send_num;
355 }
356 //get data msg
357 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
358 if(recv_num < 0 || recv_num == 0)
359 {
360 RLOGD("recvfrom step2 fail:");
361 return recv_num;
362 }
363 Parcel p;
364 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
365 p.setDataPosition(0);
366 int num = -1;
367 if(p.dataAvail() > 0)
368 {
369 p.readInt32(&resp_type);
370 p.readInt32(&request);
371 p.readInt32(&slot_id);
372 p.readInt32(&error1);
373 p.readInt32(&num);
374 if(num > 0){
375 int *test = (int *)calloc(1, sizeof(int)*num);
376 for(int i =0; i <num; i++){
377 p.readInt32(&test[i]);
378 buf[i] = test[i];
379 }
380 free(test);
381 }
382 }
383 return error1;
384}
385
386int lynq_verify_pin(char *pin){
387 int ret = -1;
388 if(pin == NULL)
389 return ret;
390 int send_num = 0;
391 int recv_num = 0;
392 char res_data[MAX_LEN] = {0};
393 int len = 0;
394 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
395 client_t.paramLen = 1;
396 client_t.uToken = Global_uToken;
397 sprintf(client_t.param, "%s\n", pin);
398 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
399 if(send_num < 0)
400 {
401 RLOGD("sendto error:");
402 return send_num;
403 }
404 //get data msg
405 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
406 if(recv_num < 0 || recv_num == 0)
407 {
408 RLOGD("recvfrom step2 fail:");
409 return recv_num;
410 }
411 Parcel p;
412 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
413 p.setDataPosition(0);
414 if(p.dataAvail() > 0)
415 {
416 p.readInt32(&resp_type);
417 p.readInt32(&request);
418 p.readInt32(&slot_id);
419 p.readInt32(&error1);
420 }
421 return error1;
422}
423
424int lynq_change_pin(char *old_pin, char *new_pin){
425 int ret = -1;
426 if(old_pin == NULL || new_pin == NULL)
427 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800428 if(!strlen(new_pin))
429 return ret;
ll3fe03462022-03-01 09:18:53 +0000430 if(!strlen(old_pin))
431 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000432 int send_num = 0;
433 int recv_num = 0;
434 char res_data[MAX_LEN] = {0};
435 int len = 0;
436 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
437 client_t.paramLen = 2;
438 client_t.uToken = Global_uToken;
439 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
440 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
441 if(send_num < 0)
442 {
443 RLOGD("sendto error:");
444 return send_num;
445 }
446 //get data msg
447 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
448 if(recv_num < 0 || recv_num == 0)
449 {
450 RLOGD("recvfrom step2 fail:");
451 return recv_num;
452 }
453 Parcel p;
454 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
455 p.setDataPosition(0);
456 if(p.dataAvail() > 0)
457 {
458 p.readInt32(&resp_type);
459 p.readInt32(&request);
460 p.readInt32(&slot_id);
461 p.readInt32(&error1);
462 }
463 return error1;
464}
465
466int lynq_unlock_pin(char *puk, char *pin){
467 int ret = -1;
468 if(puk == NULL || pin == NULL)
469 return ret;
470 int send_num = 0;
471 int recv_num = 0;
472 char res_data[MAX_LEN] = {0};
473 int len = 0;
474 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
475 client_t.paramLen = 2;
476 client_t.uToken = Global_uToken;
477 sprintf(client_t.param, "%s %s\n", puk, pin);
478 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
479 if(send_num < 0)
480 {
481 RLOGD("sendto error:");
482 return send_num;
483 }
484 //get data msg
485 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
486 if(recv_num < 0 || recv_num == 0)
487 {
488 RLOGD("recvfrom step2 fail:");
489 return recv_num;
490 }
491 Parcel p;
492 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
493 p.setDataPosition(0);
494 if(p.dataAvail() > 0)
495 {
496 p.readInt32(&resp_type);
497 p.readInt32(&request);
498 p.readInt32(&slot_id);
499 p.readInt32(&error1);
500 }
501 return error1;
502}
503
504static void delete_char(char str[],char target){
505 if(str == NULL){
506 return;
507 }
508 int i,j;
509 for(i=j=0;str[i]!='\0';i++){
510 if(str[i]!=target){
511 str[j++]=str[i];
512 }
513 }
514 str[j]='\0';
515}
516
517static int parse_param(char *cmd, char **argv, char buf[]){
518 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800519 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000520 }
521 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000522 return 3;
523 }
524 else{
525 int argc = 0;
526 char *token;
527 token = strtok(cmd, ",");
llbe2bdbd2022-06-14 02:40:33 +0000528 if(strstr(token, "CNUM"))
529 {
lle1d5d7c2022-01-18 12:34:30 +0000530 char *string;
531 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000532 {
533 if(argc == 5)
534 {
535 if(NULL == argv[1])
536 {
537 return 9002;
538 }
539 int lengh = strlen(argv[1]);
540 memcpy(buf, argv[1], lengh);
541 delete_char(buf, '"');
542 RLOGD("too many phone number return\n");
543 return 0;
544 }
lle1d5d7c2022-01-18 12:34:30 +0000545 string = token;
546 argv[argc++] = string;
547 token = strtok(NULL, ",");
548 }
llbe2bdbd2022-06-14 02:40:33 +0000549 if(NULL == argv[1])
550 {
551 return 9001;
552 }
lle1d5d7c2022-01-18 12:34:30 +0000553 int lengh = strlen(argv[1]);
554 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000555 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800556 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000557 }
llbe2bdbd2022-06-14 02:40:33 +0000558 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000559 }
lle1d5d7c2022-01-18 12:34:30 +0000560}
561
562int lynq_query_phone_number(char buf[]){
563 int ret = -1;
564 if(buf == NULL)
565 return ret;
566 int send_num = 0;
567 int recv_num = 0;
568 int len = 0;
569 char res_data[MAX_LEN] = {0};
570 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
571 client_t.paramLen = 1;
572 client_t.uToken = Global_uToken;
573 sprintf(client_t.param, "%s\n", "AT+CNUM");
574 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
575 if(send_num < 0)
576 {
577 RLOGD("sendto error:");
578 return ret;
579 }
580 //get data msg
581 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
582 if(recv_num < 0 || recv_num == 0)
583 {
584 RLOGD("recvfrom step2 fail:");
585 return recv_num;
586 }
587 Parcel p;
588 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
589 p.setDataPosition(0);
590 int num = -1;
591 if(p.dataAvail() > 0)
592 {
llb1fc9212022-04-12 03:02:01 +0000593 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000594 char *argv[5] = {0};
595 p.readInt32(&resp_type);
596 p.readInt32(&request);
597 p.readInt32(&slot_id);
598 p.readInt32(&error1);
599 p.readInt32(&num);
600 if(num == -1){
601 }else{
602 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800603 num = parse_param(test, argv, buf);
604 return num;
lle1d5d7c2022-01-18 12:34:30 +0000605 }
606 }
607 return error1;
608}
rjw5d2a50e2022-02-28 15:01:49 +0800609
ll4c5c6b72022-03-31 15:27:23 +0800610/**
611 * @brief To handle comma-separated strings, take the character before the first comma eg:123456,78 ->123456
612 *
613 * @param buf Type:[IN]
614 */
615static void parse_imei(char buf[])
616{
617 if(NULL == buf)
618 {
619 return;
620 }
621 const char s[2] = ",";
622 char *token;
623 token = strtok(buf, s);
624 return;
625}
626
627int lynq_get_imei(char buf[])
628{
llfcd43492022-03-10 09:01:50 +0000629 int ret = -1;
630 if(buf == NULL)
631 return ret;
632 int send_num = 0;
633 int recv_num = 0;
634 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800635 lynq_client_t client_t1;
636 memset(&client_t1, 0, sizeof(client_t1) );
637 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
638 client_t1.paramLen = 0;
639 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000640 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800641 memset(client_t1.param, 0, sizeof(client_t1.param));
642 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000643 if(send_num < 0)
644 {
645 RLOGD("sendto error:");
ll4c5c6b72022-03-31 15:27:23 +0800646 return send_num;
llfcd43492022-03-10 09:01:50 +0000647 }
ll4c5c6b72022-03-31 15:27:23 +0800648 //get data msg
llfcd43492022-03-10 09:01:50 +0000649 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
650 if(recv_num < 0 || recv_num == 0)
651 {
652 RLOGD("recvfrom step2 fail:");
653 return recv_num;
654 }
655 Parcel p;
656 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
657 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800658 int num = 0;
llfcd43492022-03-10 09:01:50 +0000659 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800660 {
llfcd43492022-03-10 09:01:50 +0000661 p.readInt32(&resp_type);
662 p.readInt32(&request);
663 p.readInt32(&slot_id);
664 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800665 if(!error1){
666 p.readInt32(&num);
667 char * test = lynqStrdupReadString(p);
668 parse_imei(test);
669 memcpy(buf, test, strlen(test));
llfcd43492022-03-10 09:01:50 +0000670 }
671 }
672 return error1;
673}
674
rjw5d2a50e2022-02-28 15:01:49 +0800675static int judge(int slot){
676 switch(slot){
677 case 0:
678 return -1;
679 case 1:
680 return -1;
681 }
682 return 0;
683}
684
rjw5d2a50e2022-02-28 15:01:49 +0800685int lynq_switch_card(int slot){
686 int ret = -1;
687 if(!judge(slot))
688 return ret;
689 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800690 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
691 client_t.paramLen = 1;
692 client_t.uToken = Global_uToken;
693 sprintf(client_t.param, "%d\n", slot);
694 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
695 if(send_num < 0)
696 {
697 RLOGD("sendto error:");
698 return send_num;
699 }
700 return 0;
701}
ll887a0172022-03-09 03:13:31 +0000702
703int lynq_screen(int num){
704 int ret = -1;
705 if(!judge(num))
706 return ret;
707 int send_num = 0;
ll887a0172022-03-09 03:13:31 +0000708 client_t.request = RIL_REQUEST_SCREEN_STATE;
709 client_t.paramLen = 1;
710 client_t.uToken = Global_uToken;
711 sprintf(client_t.param, "%d\n", num);
712 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
713 if(send_num < 0)
714 {
715 RLOGD("sendto error:");
716 return send_num;
717 }
718 return 0;
719}
llba425bd2022-03-17 02:23:00 +0000720
721/**
722 * @brief Check whether the input is valid for lynq_req_sim_io api
723 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
724 * type: [IN] list[1]:EF id(fileid)
725 * type: [IN] list[2]:offset(p1)
726 * type: [IN] list[3]:offset(p2)
727 * type: [IN] list[4]:response len,sometimes needn't care(p3)
728 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
729 type: [IN] Path is in hex asciii format eg "7f205f70"
730 type: [IN] Path must always be provided.
731 * @param data type: [IN] May be NULL
732 * @param pin2 type: [IN] May be NULL
733 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
734 * @param sw type: [OUT]
735 * @param simResponse type: [OUT] response
736 * @return int
737 */
738static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
739{
llba425bd2022-03-17 02:23:00 +0000740 if(list == NULL)
741 {
742 return -1;
743 }
744 if(path == NULL)
745 {
746 return -1;
747 }
748 if(sw == NULL){
749 return -1;
750 }
751 if(simResponse == NULL){
752 return -1;
753 }
754 if(data == NULL)
755 {
756 memcpy(data_buf, "null", 4);
757 }
758 else
759 {
760 bzero(data_buf,32);
761 memcpy(data_buf, data, strlen(data));
762 }
763 if(pin2 == NULL)
764 {
765 memcpy(pin2_buf, "null", 4);
766 }
767 else
768 {
769 bzero(pin2_buf,32);
770 memcpy(pin2_buf, data, strlen(data));
771 }
772 if(aidPtr == NULL)
773 {
774 memcpy(aidPtr_buf, "null", 4);
775 }
776 else
777 {
778 bzero(aidPtr_buf,32);
779 memcpy(aidPtr_buf, data, strlen(data));
780 }
781 return 0;
782}
783
784int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
785{
786 int ret = -1;
787 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
788 {
789 return ret;
790 }
791 int send_num = 0;
792 int recv_num = 0;
793 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +0000794 client_t.request = RIL_REQUEST_SIM_IO;
795 client_t.paramLen = 9;
796 client_t.uToken = Global_uToken;
797 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);
798 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
799 if(send_num < 0)
800 {
801 RLOGD("sendto error:");
802 return send_num;
803 }
804 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
805 if(recv_num < 0 || recv_num == 0)
806 {
807 RLOGD("recvfrom step2 fail:");
808 return recv_num;
809 }
810 Parcel p;
811 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
812 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +0000813 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +0000814 {
llba425bd2022-03-17 02:23:00 +0000815 p.readInt32(&resp_type);
816 p.readInt32(&request);
817 p.readInt32(&slot_id);
818 p.readInt32(&error1);
819 if(!error1)
820 {
821 p.readInt32(&sw[0]);
822 p.readInt32(&sw[1]);
823 char * test = lynqStrdupReadString(p);
824 memcpy(simResponse, test, strlen(test));
825 }
826
827 }
828 return error1;
829}
llb15599d2022-04-01 07:50:08 +0000830
831/**
832 * @brief handle shutdown buf
833 * @param options type: [IN]My Param doc
834 * @param time type: [IN]My Param doc
835 * @param message type: [IN]My Param doc
836 */
837static void handle_shutdown_buf(char options[], char time[], char message[])
838{
839 if(NULL == options)
840 {
841 bzero(options_buf, 32);
842 memcpy(options_buf," ", 1);
843 }
844 else
845 {
846 memcpy(options_buf,options, strlen(options));
847 }
848 if(NULL == time)
849 {
850 bzero(time_buf, 32);
851 memcpy(time_buf," ", 1);
852 }
853 else
854 {
855 memcpy(time_buf, time, strlen(time));
856 }
857 if(NULL == message)
858 {
859 bzero(message_buf, 32);
860 memcpy(message_buf," ", 1);
861 }
862 else
863 {
864 memcpy(message_buf, message, strlen(message));
865 }
866}
867
868int lynq_shutdown(char options[], char time[], char message[])
869{
870 char cmd[128] = {0};
871 handle_shutdown_buf(options, time, message);
872 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
873 system(cmd);
874 return 0;
875}
876
877int lynq_get_version(char buf[])
878{
879 FILE * fp;
880 char buffer[128];
881 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
882 fp = popen(buffer, "r");
883 fgets(buffer, sizeof(buffer), fp);
884 memcpy(buf, buffer, strlen(buffer));
885 buf[strlen(buffer)] = '\0';
886 pclose(fp);
887 return 0;
888}
lle1d5d7c2022-01-18 12:34:30 +0000889#if FLAG_TESS
890int lynq_query_operator(char buf[]){
891 int32_t token = -1;
892 if(buf == NULL)
893 return token;
894 char msg_imsi[20] = {0};
895 memset(msg_imsi,0,sizeof(msg_imsi));
896 token = lynq_get_imsi(msg_imsi);
897 if(strlen(msg_imsi) != 0){
898 FindOperator *ope_command = NULL;
899 ope_command = find_ope_command(msg_imsi, findOperator);
900 if(ope_command){
901 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
902 buf[strlen(ope_command->buf)] = '\0';
903 }
904 else{
905 /*more*/
906 char mccmnc[5] = {0};
907 memcpy(buf, msg_imsi, 5);
908 buf[5] = '\0';
909 /*more*/
910 }
911 return token;
912 }
913 else{
914 //msg->base.e = err;
915 const char *test = "please insert sim card";
916 memcpy(buf, test, strlen(test));
917 return token;
918 }
919}
920FindOperator findOperator[] = {
921#include "operator.h"
922};
923
924static FindOperator*find_ope_command (char *name,FindOperator *Class){
925 if(name == NULL || Class == NULL){
926 return ((FindOperator *)NULL);
927 }
928 register int i;
929 for (i = 0; Class[i].MCCMCN; i++)
930 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
931 return (&Class[i]);
932 return ((FindOperator *)NULL);
933}
934
935#endif