blob: 913599cb99677563791967a6a21252504a53c4bd [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;
llab0f3e12022-07-20 11:59:51 +000063static pthread_mutex_t g_lynq_sim_sendto_mutex;
llba425bd2022-03-17 02:23:00 +000064/**
65 * @brief mark call initialization state
66 * 0: deinit state
67 * 1: init state
68 */
69int g_lynq_sim_init_flag = 0;
70
71/**
72 * @brief lynq_req_sim_io need to send request
73 */
74char data_buf[32] = {0};
75char pin2_buf[32] = {0};
76char aidPtr_buf[32] = {0};
lle1d5d7c2022-01-18 12:34:30 +000077
llb15599d2022-04-01 07:50:08 +000078/**/
79char options_buf[32] = {0};
80char time_buf[32] = {0};
81char message_buf[32] = {0};
82
lle1d5d7c2022-01-18 12:34:30 +000083int lynq_sim_init(int utoken){
llba425bd2022-03-17 02:23:00 +000084 if(g_lynq_sim_init_flag == 1)
85 {
86 RLOGD("lynq_sim_init failed");
87 return -1;
88 }
89 g_lynq_sim_init_flag = 1;
lle1d5d7c2022-01-18 12:34:30 +000090 if(utoken < 0){
91 return -1;
92 }
lle1d5d7c2022-01-18 12:34:30 +000093 Global_uToken = utoken;
94 sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
ll33334af2022-06-30 16:54:51 +080095 if (-1 == sock_fd)
96 {
97 return sock_fd;
98 }
99 struct timeval timeOut;
llab0f3e12022-07-20 11:59:51 +0000100 timeOut.tv_sec = 60;
ll33334af2022-06-30 16:54:51 +0800101 timeOut.tv_usec = 0;
102 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
103 {
104 RLOGD("time out setting failed\n");
105 return -1;
106 }
lle1d5d7c2022-01-18 12:34:30 +0000107 /* 设置address */
108 memset(&addr_serv, 0, sizeof(addr_serv));
109 addr_serv.sin_family = AF_INET;
110 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
111 addr_serv.sin_port = htons(DEST_PORT);
112 len_addr_serv = sizeof(addr_serv);
113 /*test*/
114 return 0;
115}
116
117int lynq_sim_deinit(void){
llba425bd2022-03-17 02:23:00 +0000118 if(g_lynq_sim_init_flag == 0)
119 {
120 RLOGD("lynq_sim_deinit failed");
121 return -1;
122 }
123 g_lynq_sim_init_flag = 0;
lle1d5d7c2022-01-18 12:34:30 +0000124 close(sock_fd);
125 return 0;
126}
127
128static char * lynqStrdupReadString(Parcel &p) {
129 size_t stringlen;
130 const char16_t *s16;
131
132 s16 = p.readString16Inplace(&stringlen);
133 return strndup16to8(s16, stringlen);
134}
135
llba425bd2022-03-17 02:23:00 +0000136/*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 +0000137int lynq_get_sim_status(int *card_status)
138{
ll27dbe752022-08-10 00:33:52 -0700139 if(g_lynq_sim_init_flag == 0)
140 {
141 return -1;
142 }
lle1d5d7c2022-01-18 12:34:30 +0000143 int ret = -1;
144 if(card_status == NULL)
145 return ret;
146 int send_num = 0;
147 int recv_num = 0;
148 int len = 0;
149 lynq_client_t client_t1;
150 memset(&client_t1, 0, sizeof(client_t1) );
151 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
152 client_t1.paramLen = 0;
153 client_t1.uToken = Global_uToken;
154 char res_data[MAX_LEN] = {0};
155 int len1 = sizeof(client_t1.param);
156 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
llab0f3e12022-07-20 11:59:51 +0000157 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000158 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
159 if(send_num < 0)
160 {
161 RLOGD("sendto error:");
162 return send_num;
163 }
164 //get data msg
165 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
166 if(recv_num < 0 || recv_num == 0)
167 {
168 RLOGD("recvfrom step2 fail:");
169 return recv_num;
170 }
llab0f3e12022-07-20 11:59:51 +0000171 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000172 Parcel p;;
173 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
174 p.setDataPosition(0);
175 if(p.dataAvail() > 0)
176 {
177 p.readInt32(&resp_type);
178 p.readInt32(&request);
179 p.readInt32(&slot_id);
180 p.readInt32(&error1);
181 p.readInt32(card_status);
182 }
183 return error1;
184}
llba425bd2022-03-17 02:23:00 +0000185
lle1d5d7c2022-01-18 12:34:30 +0000186int lynq_get_imsi(char buf[])
187{
ll27dbe752022-08-10 00:33:52 -0700188 if(g_lynq_sim_init_flag == 0)
189 {
190 return -1;
191 }
lle1d5d7c2022-01-18 12:34:30 +0000192 int ret = -1;
193 if(buf == NULL)
194 return ret;
195 int send_num = 0;
196 int recv_num = 0;
197 int len = 0;
198 lynq_client_t client_t1;
199 memset(&client_t1, 0, sizeof(client_t1) );
200 client_t1.request = RIL_REQUEST_GET_IMSI;
201 client_t1.paramLen = 0;
202 client_t1.uToken = Global_uToken;
203 char res_data[MAX_LEN] = {0};
204 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000205 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000206 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
207 if(send_num < 0)
208 {
209 RLOGD("sendto error:");
210 return send_num;
211 }
212 //get data msg
213 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000214 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000215 if(recv_num < 0 || recv_num == 0)
216 {
217 RLOGD("recvfrom step2 fail:");
218 return recv_num;
219 }
220 Parcel p;
221 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
222 p.setDataPosition(0);
223 if(p.dataAvail() > 0)
224 {
225 p.readInt32(&resp_type);
226 p.readInt32(&request);
227 p.readInt32(&slot_id);
228 p.readInt32(&error1);
229 if(!error1){
230 char * test = lynqStrdupReadString(p);
231 memcpy(buf, test, strlen(test));
232 }
233 }
234 return error1;
235}
236
237
238/*add by lei*/
239
240int lynq_get_iccid(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700241 if(g_lynq_sim_init_flag == 0)
242 {
243 return -1;
244 }
lle1d5d7c2022-01-18 12:34:30 +0000245 int ret = -1;
246 if(buf == NULL)
247 return ret;
248 int send_num = 0;
249 int recv_num = 0;
250 int len = 0;
251 client_t.request = RIL_REQUEST_QUERY_ICCID;
252 client_t.paramLen = 0;
253 client_t.uToken = Global_uToken;
254 char res_data[MAX_LEN] = {0};
255 memset(client_t.param, 0, sizeof(client_t.param));
llab0f3e12022-07-20 11:59:51 +0000256 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000257 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
258 if(send_num < 0)
259 {
260 RLOGD("sendto error:");
261 return send_num;
262 }
263 //get data msg
264 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000265 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000266 if(recv_num < 0 || recv_num == 0)
267 {
268 RLOGD("recvfrom step2 fail:");
269 return recv_num;
270 }
271 Parcel p;
272 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
273 p.setDataPosition(0);
274 if(p.dataAvail() > 0)
275 {
276 p.readInt32(&resp_type);
277 p.readInt32(&request);
278 p.readInt32(&slot_id);
279 p.readInt32(&error1);
280 if(!error1){
281 char * test = lynqStrdupReadString(p);
282 memcpy(buf, test, strlen(test));
283 }
284 }
285 return error1;
286}
287
288int lynq_enable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700289 if(g_lynq_sim_init_flag == 0)
290 {
291 return -1;
292 }
lle1d5d7c2022-01-18 12:34:30 +0000293 int ret = -1;
294 if(pin == NULL)
295 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800296 if(!strlen(pin))
297 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000298 int send_num = 0;
299 int recv_num = 0;
300 char res_data[MAX_LEN] = {0};
301 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
302 client_t.paramLen = 4;
303 client_t.uToken = Global_uToken;
304 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
llab0f3e12022-07-20 11:59:51 +0000305 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000306 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
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);
llab0f3e12022-07-20 11:59:51 +0000315 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000316 if(recv_num < 0 || recv_num == 0)
317 {
318 RLOGD("recvfrom step2 fail:");
319 return recv_num;
320 }
321 Parcel p;
322 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
323 p.setDataPosition(0);
324 if(p.dataAvail() > 0)
325 {
326 p.readInt32(&resp_type);
327 p.readInt32(&request);
328 p.readInt32(&slot_id);
329 p.readInt32(&error1);
330 }
331 return error1;
332}
333
lle6cc3932022-08-18 06:06:39 -0700334int lynq_sim_power(int mode)
335{
336 if(g_lynq_sim_init_flag == 0)
337 {
338 return -1;
339 }
340 int ret = -1;
341 int send_num = 0;
342 int recv_num = 0;
343 int len = 0;
344 char res_data[MAX_LEN] = {0};
345 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
346 client_t.paramLen = 1;
347 client_t.uToken = Global_uToken;
348 char buf[64] = {0};
349 sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode);
350 sprintf(client_t.param, "%s\n", buf);
351 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
352 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
353 if(send_num < 0)
354 {
355 RLOGD("sendto error:");
356 return ret;
357 }
358 //get data msg
359 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
360 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
361 if(recv_num < 0 || recv_num == 0)
362 {
363 RLOGD("recvfrom step2 fail:");
364 return recv_num;
365 }
366 Parcel p;
367 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
368 p.setDataPosition(0);
369 int num = -1;
370 if(p.dataAvail() > 0)
371 {
372 char test[128] = {0};
373 p.readInt32(&resp_type);
374 p.readInt32(&request);
375 p.readInt32(&slot_id);
376 p.readInt32(&error1);
377 p.readInt32(&num);
378 if(num == -1){
379 }else{
380 p.read(test, num);
381 return error1;
382 }
383 }
384 return error1;
385}
386
lle1d5d7c2022-01-18 12:34:30 +0000387int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700388 if(g_lynq_sim_init_flag == 0)
389 {
390 return -1;
391 }
lle1d5d7c2022-01-18 12:34:30 +0000392 int ret = -1;
393 if(pin == NULL)
394 return ret;
395 int send_num = 0;
396 int recv_num = 0;
397 char res_data[MAX_LEN] = {0};
398 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
399 client_t.paramLen = 4;
400 client_t.uToken = Global_uToken;
401 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
llab0f3e12022-07-20 11:59:51 +0000402 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000403 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
404 if(send_num < 0)
405 {
406 RLOGD("sendto error:");
407 return send_num;
408 }
409 //get data msg
410 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000411 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000412 if(recv_num < 0 || recv_num == 0)
413 {
414 RLOGD("recvfrom step2 fail:");
415 return recv_num;
416 }
417 Parcel p;
418 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
419 p.setDataPosition(0);
420 if(p.dataAvail() > 0)
421 {
422 p.readInt32(&resp_type);
423 p.readInt32(&request);
424 p.readInt32(&slot_id);
425 p.readInt32(&error1);
426 }
427 return error1;
428}
429
430int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700431 if(g_lynq_sim_init_flag == 0)
432 {
433 return -1;
434 }
lle1d5d7c2022-01-18 12:34:30 +0000435 int ret = -1;
436 if(pin == NULL)
437 return ret;
438 int send_num = 0;
439 int recv_num = 0;
440 int len = 0;
441 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
442 client_t.paramLen = 3;
443 client_t.uToken = Global_uToken;
444 char res_data[MAX_LEN] = {0};
445 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
llab0f3e12022-07-20 11:59:51 +0000446 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000447 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
448 if(send_num < 0)
449 {
450 RLOGD("sendto error:");
451 return send_num;
452 }
453 //get data msg
454 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000455 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000456 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 int num = -1;
465 if(p.dataAvail() > 0)
466 {
467 p.readInt32(&resp_type);
468 p.readInt32(&request);
469 p.readInt32(&slot_id);
470 p.readInt32(&error1);
471 p.readInt32(&num);
472 if(num > 0){
473 int *test = (int *)calloc(1, sizeof(int)*num);
474 for(int i =0; i <num; i++){
475 p.readInt32(&test[i]);
476 buf[i] = test[i];
477 }
478 free(test);
479 }
480 }
481 return error1;
482}
483
484int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700485 if(g_lynq_sim_init_flag == 0)
486 {
487 return -1;
488 }
lle1d5d7c2022-01-18 12:34:30 +0000489 int ret = -1;
490 if(pin == NULL)
491 return ret;
492 int send_num = 0;
493 int recv_num = 0;
494 char res_data[MAX_LEN] = {0};
495 int len = 0;
496 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
497 client_t.paramLen = 1;
498 client_t.uToken = Global_uToken;
499 sprintf(client_t.param, "%s\n", pin);
llab0f3e12022-07-20 11:59:51 +0000500 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000501 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
502 if(send_num < 0)
503 {
504 RLOGD("sendto error:");
505 return send_num;
506 }
507 //get data msg
508 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000509 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000510 if(recv_num < 0 || recv_num == 0)
511 {
512 RLOGD("recvfrom step2 fail:");
513 return recv_num;
514 }
515 Parcel p;
516 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
517 p.setDataPosition(0);
518 if(p.dataAvail() > 0)
519 {
520 p.readInt32(&resp_type);
521 p.readInt32(&request);
522 p.readInt32(&slot_id);
523 p.readInt32(&error1);
524 }
525 return error1;
526}
527
528int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700529 if(g_lynq_sim_init_flag == 0)
530 {
531 return -1;
532 }
lle1d5d7c2022-01-18 12:34:30 +0000533 int ret = -1;
534 if(old_pin == NULL || new_pin == NULL)
535 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800536 if(!strlen(new_pin))
537 return ret;
ll3fe03462022-03-01 09:18:53 +0000538 if(!strlen(old_pin))
539 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000540 int send_num = 0;
541 int recv_num = 0;
542 char res_data[MAX_LEN] = {0};
543 int len = 0;
544 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
545 client_t.paramLen = 2;
546 client_t.uToken = Global_uToken;
547 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
llab0f3e12022-07-20 11:59:51 +0000548 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000549 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
550 if(send_num < 0)
551 {
552 RLOGD("sendto error:");
553 return send_num;
554 }
555 //get data msg
556 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000557 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000558 if(recv_num < 0 || recv_num == 0)
559 {
560 RLOGD("recvfrom step2 fail:");
561 return recv_num;
562 }
563 Parcel p;
564 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
565 p.setDataPosition(0);
566 if(p.dataAvail() > 0)
567 {
568 p.readInt32(&resp_type);
569 p.readInt32(&request);
570 p.readInt32(&slot_id);
571 p.readInt32(&error1);
572 }
573 return error1;
574}
575
576int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700577 if(g_lynq_sim_init_flag == 0)
578 {
579 return -1;
580 }
lle1d5d7c2022-01-18 12:34:30 +0000581 int ret = -1;
582 if(puk == NULL || pin == NULL)
583 return ret;
584 int send_num = 0;
585 int recv_num = 0;
586 char res_data[MAX_LEN] = {0};
587 int len = 0;
588 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
589 client_t.paramLen = 2;
590 client_t.uToken = Global_uToken;
591 sprintf(client_t.param, "%s %s\n", puk, pin);
llab0f3e12022-07-20 11:59:51 +0000592 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000593 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
594 if(send_num < 0)
595 {
596 RLOGD("sendto error:");
597 return send_num;
598 }
599 //get data msg
600 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000601 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000602 if(recv_num < 0 || recv_num == 0)
603 {
604 RLOGD("recvfrom step2 fail:");
605 return recv_num;
606 }
607 Parcel p;
608 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
609 p.setDataPosition(0);
610 if(p.dataAvail() > 0)
611 {
612 p.readInt32(&resp_type);
613 p.readInt32(&request);
614 p.readInt32(&slot_id);
615 p.readInt32(&error1);
616 }
617 return error1;
618}
619
620static void delete_char(char str[],char target){
621 if(str == NULL){
622 return;
623 }
624 int i,j;
625 for(i=j=0;str[i]!='\0';i++){
626 if(str[i]!=target){
627 str[j++]=str[i];
628 }
629 }
630 str[j]='\0';
631}
632
633static int parse_param(char *cmd, char **argv, char buf[]){
634 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800635 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000636 }
637 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000638 return 3;
639 }
640 else{
641 int argc = 0;
642 char *token;
643 token = strtok(cmd, ",");
llbe2bdbd2022-06-14 02:40:33 +0000644 if(strstr(token, "CNUM"))
645 {
lle1d5d7c2022-01-18 12:34:30 +0000646 char *string;
647 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000648 {
649 if(argc == 5)
650 {
651 if(NULL == argv[1])
652 {
653 return 9002;
654 }
655 int lengh = strlen(argv[1]);
656 memcpy(buf, argv[1], lengh);
657 delete_char(buf, '"');
658 RLOGD("too many phone number return\n");
659 return 0;
660 }
lle1d5d7c2022-01-18 12:34:30 +0000661 string = token;
662 argv[argc++] = string;
663 token = strtok(NULL, ",");
664 }
llbe2bdbd2022-06-14 02:40:33 +0000665 if(NULL == argv[1])
666 {
667 return 9001;
668 }
lle1d5d7c2022-01-18 12:34:30 +0000669 int lengh = strlen(argv[1]);
670 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000671 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800672 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000673 }
llbe2bdbd2022-06-14 02:40:33 +0000674 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000675 }
lle1d5d7c2022-01-18 12:34:30 +0000676}
677
678int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700679 if(g_lynq_sim_init_flag == 0)
680 {
681 return -1;
682 }
lle1d5d7c2022-01-18 12:34:30 +0000683 int ret = -1;
684 if(buf == NULL)
685 return ret;
686 int send_num = 0;
687 int recv_num = 0;
688 int len = 0;
689 char res_data[MAX_LEN] = {0};
690 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
691 client_t.paramLen = 1;
692 client_t.uToken = Global_uToken;
693 sprintf(client_t.param, "%s\n", "AT+CNUM");
llab0f3e12022-07-20 11:59:51 +0000694 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000695 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
696 if(send_num < 0)
697 {
698 RLOGD("sendto error:");
699 return ret;
700 }
701 //get data msg
702 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000703 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000704 if(recv_num < 0 || recv_num == 0)
705 {
706 RLOGD("recvfrom step2 fail:");
707 return recv_num;
708 }
709 Parcel p;
710 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
711 p.setDataPosition(0);
712 int num = -1;
713 if(p.dataAvail() > 0)
714 {
llb1fc9212022-04-12 03:02:01 +0000715 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000716 char *argv[5] = {0};
717 p.readInt32(&resp_type);
718 p.readInt32(&request);
719 p.readInt32(&slot_id);
720 p.readInt32(&error1);
721 p.readInt32(&num);
722 if(num == -1){
723 }else{
724 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800725 num = parse_param(test, argv, buf);
726 return num;
lle1d5d7c2022-01-18 12:34:30 +0000727 }
728 }
729 return error1;
730}
rjw5d2a50e2022-02-28 15:01:49 +0800731
ll4c5c6b72022-03-31 15:27:23 +0800732/**
733 * @brief To handle comma-separated strings, take the character before the first comma eg:123456,78 ->123456
734 *
735 * @param buf Type:[IN]
736 */
737static void parse_imei(char buf[])
738{
739 if(NULL == buf)
740 {
741 return;
742 }
743 const char s[2] = ",";
744 char *token;
745 token = strtok(buf, s);
746 return;
747}
748
749int lynq_get_imei(char buf[])
ll27dbe752022-08-10 00:33:52 -0700750{
751 if(g_lynq_sim_init_flag == 0)
752 {
753 return -1;
754 }
llfcd43492022-03-10 09:01:50 +0000755 int ret = -1;
756 if(buf == NULL)
757 return ret;
758 int send_num = 0;
759 int recv_num = 0;
760 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800761 lynq_client_t client_t1;
762 memset(&client_t1, 0, sizeof(client_t1) );
763 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
764 client_t1.paramLen = 0;
765 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000766 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800767 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000768 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800769 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000770 if(send_num < 0)
771 {
772 RLOGD("sendto error:");
ll4c5c6b72022-03-31 15:27:23 +0800773 return send_num;
llfcd43492022-03-10 09:01:50 +0000774 }
ll4c5c6b72022-03-31 15:27:23 +0800775 //get data msg
llfcd43492022-03-10 09:01:50 +0000776 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000777 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000778 if(recv_num < 0 || recv_num == 0)
779 {
780 RLOGD("recvfrom step2 fail:");
781 return recv_num;
782 }
783 Parcel p;
784 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
785 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800786 int num = 0;
llfcd43492022-03-10 09:01:50 +0000787 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800788 {
llfcd43492022-03-10 09:01:50 +0000789 p.readInt32(&resp_type);
790 p.readInt32(&request);
791 p.readInt32(&slot_id);
792 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800793 if(!error1){
794 p.readInt32(&num);
795 char * test = lynqStrdupReadString(p);
796 parse_imei(test);
797 memcpy(buf, test, strlen(test));
llfcd43492022-03-10 09:01:50 +0000798 }
799 }
800 return error1;
801}
802
rjw5d2a50e2022-02-28 15:01:49 +0800803static int judge(int slot){
804 switch(slot){
805 case 0:
806 return -1;
807 case 1:
808 return -1;
809 }
810 return 0;
811}
812
rjw5d2a50e2022-02-28 15:01:49 +0800813int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700814 if(g_lynq_sim_init_flag == 0)
815 {
816 return -1;
817 }
rjw5d2a50e2022-02-28 15:01:49 +0800818 int ret = -1;
819 if(!judge(slot))
820 return ret;
821 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800822 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
823 client_t.paramLen = 1;
824 client_t.uToken = Global_uToken;
825 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000826 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800827 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
828 if(send_num < 0)
829 {
830 RLOGD("sendto error:");
831 return send_num;
832 }
llab0f3e12022-07-20 11:59:51 +0000833 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800834 return 0;
835}
ll887a0172022-03-09 03:13:31 +0000836
837int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700838 if(g_lynq_sim_init_flag == 0)
839 {
840 return -1;
841 }
ll887a0172022-03-09 03:13:31 +0000842 int ret = -1;
843 if(!judge(num))
844 return ret;
845 int send_num = 0;
ll887a0172022-03-09 03:13:31 +0000846 client_t.request = RIL_REQUEST_SCREEN_STATE;
847 client_t.paramLen = 1;
848 client_t.uToken = Global_uToken;
849 sprintf(client_t.param, "%d\n", num);
llab0f3e12022-07-20 11:59:51 +0000850 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000851 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
852 if(send_num < 0)
853 {
854 RLOGD("sendto error:");
855 return send_num;
856 }
llab0f3e12022-07-20 11:59:51 +0000857 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000858 return 0;
859}
llba425bd2022-03-17 02:23:00 +0000860
861/**
862 * @brief Check whether the input is valid for lynq_req_sim_io api
863 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
864 * type: [IN] list[1]:EF id(fileid)
865 * type: [IN] list[2]:offset(p1)
866 * type: [IN] list[3]:offset(p2)
867 * type: [IN] list[4]:response len,sometimes needn't care(p3)
868 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
869 type: [IN] Path is in hex asciii format eg "7f205f70"
870 type: [IN] Path must always be provided.
871 * @param data type: [IN] May be NULL
872 * @param pin2 type: [IN] May be NULL
873 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
874 * @param sw type: [OUT]
875 * @param simResponse type: [OUT] response
876 * @return int
877 */
878static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
879{
llba425bd2022-03-17 02:23:00 +0000880 if(list == NULL)
881 {
882 return -1;
883 }
884 if(path == NULL)
885 {
886 return -1;
887 }
888 if(sw == NULL){
889 return -1;
890 }
891 if(simResponse == NULL){
892 return -1;
893 }
894 if(data == NULL)
895 {
896 memcpy(data_buf, "null", 4);
897 }
898 else
899 {
900 bzero(data_buf,32);
901 memcpy(data_buf, data, strlen(data));
902 }
903 if(pin2 == NULL)
904 {
905 memcpy(pin2_buf, "null", 4);
906 }
907 else
908 {
909 bzero(pin2_buf,32);
910 memcpy(pin2_buf, data, strlen(data));
911 }
912 if(aidPtr == NULL)
913 {
914 memcpy(aidPtr_buf, "null", 4);
915 }
916 else
917 {
918 bzero(aidPtr_buf,32);
919 memcpy(aidPtr_buf, data, strlen(data));
920 }
921 return 0;
922}
923
924int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
ll27dbe752022-08-10 00:33:52 -0700925{
926 if(g_lynq_sim_init_flag == 0)
927 {
928 return -1;
929 }
llba425bd2022-03-17 02:23:00 +0000930 int ret = -1;
931 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
932 {
933 return ret;
934 }
935 int send_num = 0;
936 int recv_num = 0;
937 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +0000938 client_t.request = RIL_REQUEST_SIM_IO;
939 client_t.paramLen = 9;
940 client_t.uToken = Global_uToken;
941 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);
llab0f3e12022-07-20 11:59:51 +0000942 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +0000943 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
944 if(send_num < 0)
945 {
946 RLOGD("sendto error:");
947 return send_num;
948 }
949 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000950 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +0000951 if(recv_num < 0 || recv_num == 0)
952 {
953 RLOGD("recvfrom step2 fail:");
954 return recv_num;
955 }
956 Parcel p;
957 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
958 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +0000959 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +0000960 {
llba425bd2022-03-17 02:23:00 +0000961 p.readInt32(&resp_type);
962 p.readInt32(&request);
963 p.readInt32(&slot_id);
964 p.readInt32(&error1);
965 if(!error1)
966 {
967 p.readInt32(&sw[0]);
968 p.readInt32(&sw[1]);
969 char * test = lynqStrdupReadString(p);
970 memcpy(simResponse, test, strlen(test));
971 }
972
973 }
974 return error1;
975}
llb15599d2022-04-01 07:50:08 +0000976
977/**
978 * @brief handle shutdown buf
979 * @param options type: [IN]My Param doc
980 * @param time type: [IN]My Param doc
981 * @param message type: [IN]My Param doc
982 */
983static void handle_shutdown_buf(char options[], char time[], char message[])
984{
985 if(NULL == options)
986 {
987 bzero(options_buf, 32);
988 memcpy(options_buf," ", 1);
989 }
990 else
991 {
992 memcpy(options_buf,options, strlen(options));
993 }
994 if(NULL == time)
995 {
996 bzero(time_buf, 32);
997 memcpy(time_buf," ", 1);
998 }
999 else
1000 {
1001 memcpy(time_buf, time, strlen(time));
1002 }
1003 if(NULL == message)
1004 {
1005 bzero(message_buf, 32);
1006 memcpy(message_buf," ", 1);
1007 }
1008 else
1009 {
1010 memcpy(message_buf, message, strlen(message));
1011 }
1012}
1013
1014int lynq_shutdown(char options[], char time[], char message[])
1015{
1016 char cmd[128] = {0};
1017 handle_shutdown_buf(options, time, message);
1018 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
1019 system(cmd);
1020 return 0;
1021}
1022
1023int lynq_get_version(char buf[])
1024{
1025 FILE * fp;
1026 char buffer[128];
1027 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
1028 fp = popen(buffer, "r");
1029 fgets(buffer, sizeof(buffer), fp);
1030 memcpy(buf, buffer, strlen(buffer));
1031 buf[strlen(buffer)] = '\0';
1032 pclose(fp);
1033 return 0;
1034}
lle1d5d7c2022-01-18 12:34:30 +00001035#if FLAG_TESS
1036int lynq_query_operator(char buf[]){
1037 int32_t token = -1;
1038 if(buf == NULL)
1039 return token;
1040 char msg_imsi[20] = {0};
1041 memset(msg_imsi,0,sizeof(msg_imsi));
1042 token = lynq_get_imsi(msg_imsi);
1043 if(strlen(msg_imsi) != 0){
1044 FindOperator *ope_command = NULL;
1045 ope_command = find_ope_command(msg_imsi, findOperator);
1046 if(ope_command){
1047 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
1048 buf[strlen(ope_command->buf)] = '\0';
1049 }
1050 else{
1051 /*more*/
1052 char mccmnc[5] = {0};
1053 memcpy(buf, msg_imsi, 5);
1054 buf[5] = '\0';
1055 /*more*/
1056 }
1057 return token;
1058 }
1059 else{
1060 //msg->base.e = err;
1061 const char *test = "please insert sim card";
1062 memcpy(buf, test, strlen(test));
1063 return token;
1064 }
1065}
1066FindOperator findOperator[] = {
1067#include "operator.h"
1068};
1069
1070static FindOperator*find_ope_command (char *name,FindOperator *Class){
1071 if(name == NULL || Class == NULL){
1072 return ((FindOperator *)NULL);
1073 }
1074 register int i;
1075 for (i = 0; Class[i].MCCMCN; i++)
1076 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1077 return (&Class[i]);
1078 return ((FindOperator *)NULL);
1079}
1080
1081#endif