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