blob: 76403e1a822193cbd3ce47fd5a53576d5550290a [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
334int lynq_disable_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700335 if(g_lynq_sim_init_flag == 0)
336 {
337 return -1;
338 }
lle1d5d7c2022-01-18 12:34:30 +0000339 int ret = -1;
340 if(pin == NULL)
341 return ret;
342 int send_num = 0;
343 int recv_num = 0;
344 char res_data[MAX_LEN] = {0};
345 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
346 client_t.paramLen = 4;
347 client_t.uToken = Global_uToken;
348 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
llab0f3e12022-07-20 11:59:51 +0000349 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000350 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);
llab0f3e12022-07-20 11:59:51 +0000358 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000359 if(recv_num < 0 || recv_num == 0)
360 {
361 RLOGD("recvfrom step2 fail:");
362 return recv_num;
363 }
364 Parcel p;
365 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
366 p.setDataPosition(0);
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 }
374 return error1;
375}
376
377int lynq_query_pin_lock(char *pin,int buf[]){
ll27dbe752022-08-10 00:33:52 -0700378 if(g_lynq_sim_init_flag == 0)
379 {
380 return -1;
381 }
lle1d5d7c2022-01-18 12:34:30 +0000382 int ret = -1;
383 if(pin == NULL)
384 return ret;
385 int send_num = 0;
386 int recv_num = 0;
387 int len = 0;
388 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
389 client_t.paramLen = 3;
390 client_t.uToken = Global_uToken;
391 char res_data[MAX_LEN] = {0};
392 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
llab0f3e12022-07-20 11:59:51 +0000393 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000394 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
395 if(send_num < 0)
396 {
397 RLOGD("sendto error:");
398 return send_num;
399 }
400 //get data msg
401 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 +0000402 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000403 if(recv_num < 0 || recv_num == 0)
404 {
405 RLOGD("recvfrom step2 fail:");
406 return recv_num;
407 }
408 Parcel p;
409 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
410 p.setDataPosition(0);
411 int num = -1;
412 if(p.dataAvail() > 0)
413 {
414 p.readInt32(&resp_type);
415 p.readInt32(&request);
416 p.readInt32(&slot_id);
417 p.readInt32(&error1);
418 p.readInt32(&num);
419 if(num > 0){
420 int *test = (int *)calloc(1, sizeof(int)*num);
421 for(int i =0; i <num; i++){
422 p.readInt32(&test[i]);
423 buf[i] = test[i];
424 }
425 free(test);
426 }
427 }
428 return error1;
429}
430
431int lynq_verify_pin(char *pin){
ll27dbe752022-08-10 00:33:52 -0700432 if(g_lynq_sim_init_flag == 0)
433 {
434 return -1;
435 }
lle1d5d7c2022-01-18 12:34:30 +0000436 int ret = -1;
437 if(pin == NULL)
438 return ret;
439 int send_num = 0;
440 int recv_num = 0;
441 char res_data[MAX_LEN] = {0};
442 int len = 0;
443 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
444 client_t.paramLen = 1;
445 client_t.uToken = Global_uToken;
446 sprintf(client_t.param, "%s\n", pin);
llab0f3e12022-07-20 11:59:51 +0000447 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000448 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);
llab0f3e12022-07-20 11:59:51 +0000456 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000457 if(recv_num < 0 || recv_num == 0)
458 {
459 RLOGD("recvfrom step2 fail:");
460 return recv_num;
461 }
462 Parcel p;
463 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
464 p.setDataPosition(0);
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 }
472 return error1;
473}
474
475int lynq_change_pin(char *old_pin, char *new_pin){
ll27dbe752022-08-10 00:33:52 -0700476 if(g_lynq_sim_init_flag == 0)
477 {
478 return -1;
479 }
lle1d5d7c2022-01-18 12:34:30 +0000480 int ret = -1;
481 if(old_pin == NULL || new_pin == NULL)
482 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800483 if(!strlen(new_pin))
484 return ret;
ll3fe03462022-03-01 09:18:53 +0000485 if(!strlen(old_pin))
486 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000487 int send_num = 0;
488 int recv_num = 0;
489 char res_data[MAX_LEN] = {0};
490 int len = 0;
491 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
492 client_t.paramLen = 2;
493 client_t.uToken = Global_uToken;
494 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
llab0f3e12022-07-20 11:59:51 +0000495 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000496 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
497 if(send_num < 0)
498 {
499 RLOGD("sendto error:");
500 return send_num;
501 }
502 //get data msg
503 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 +0000504 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000505 if(recv_num < 0 || recv_num == 0)
506 {
507 RLOGD("recvfrom step2 fail:");
508 return recv_num;
509 }
510 Parcel p;
511 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
512 p.setDataPosition(0);
513 if(p.dataAvail() > 0)
514 {
515 p.readInt32(&resp_type);
516 p.readInt32(&request);
517 p.readInt32(&slot_id);
518 p.readInt32(&error1);
519 }
520 return error1;
521}
522
523int lynq_unlock_pin(char *puk, char *pin){
ll27dbe752022-08-10 00:33:52 -0700524 if(g_lynq_sim_init_flag == 0)
525 {
526 return -1;
527 }
lle1d5d7c2022-01-18 12:34:30 +0000528 int ret = -1;
529 if(puk == NULL || pin == NULL)
530 return ret;
531 int send_num = 0;
532 int recv_num = 0;
533 char res_data[MAX_LEN] = {0};
534 int len = 0;
535 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
536 client_t.paramLen = 2;
537 client_t.uToken = Global_uToken;
538 sprintf(client_t.param, "%s %s\n", puk, pin);
llab0f3e12022-07-20 11:59:51 +0000539 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000540 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
541 if(send_num < 0)
542 {
543 RLOGD("sendto error:");
544 return send_num;
545 }
546 //get data msg
547 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 +0000548 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000549 if(recv_num < 0 || recv_num == 0)
550 {
551 RLOGD("recvfrom step2 fail:");
552 return recv_num;
553 }
554 Parcel p;
555 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
556 p.setDataPosition(0);
557 if(p.dataAvail() > 0)
558 {
559 p.readInt32(&resp_type);
560 p.readInt32(&request);
561 p.readInt32(&slot_id);
562 p.readInt32(&error1);
563 }
564 return error1;
565}
566
567static void delete_char(char str[],char target){
568 if(str == NULL){
569 return;
570 }
571 int i,j;
572 for(i=j=0;str[i]!='\0';i++){
573 if(str[i]!=target){
574 str[j++]=str[i];
575 }
576 }
577 str[j]='\0';
578}
579
580static int parse_param(char *cmd, char **argv, char buf[]){
581 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800582 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000583 }
584 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000585 return 3;
586 }
587 else{
588 int argc = 0;
589 char *token;
590 token = strtok(cmd, ",");
llbe2bdbd2022-06-14 02:40:33 +0000591 if(strstr(token, "CNUM"))
592 {
lle1d5d7c2022-01-18 12:34:30 +0000593 char *string;
594 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000595 {
596 if(argc == 5)
597 {
598 if(NULL == argv[1])
599 {
600 return 9002;
601 }
602 int lengh = strlen(argv[1]);
603 memcpy(buf, argv[1], lengh);
604 delete_char(buf, '"');
605 RLOGD("too many phone number return\n");
606 return 0;
607 }
lle1d5d7c2022-01-18 12:34:30 +0000608 string = token;
609 argv[argc++] = string;
610 token = strtok(NULL, ",");
611 }
llbe2bdbd2022-06-14 02:40:33 +0000612 if(NULL == argv[1])
613 {
614 return 9001;
615 }
lle1d5d7c2022-01-18 12:34:30 +0000616 int lengh = strlen(argv[1]);
617 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000618 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800619 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000620 }
llbe2bdbd2022-06-14 02:40:33 +0000621 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000622 }
lle1d5d7c2022-01-18 12:34:30 +0000623}
624
625int lynq_query_phone_number(char buf[]){
ll27dbe752022-08-10 00:33:52 -0700626 if(g_lynq_sim_init_flag == 0)
627 {
628 return -1;
629 }
lle1d5d7c2022-01-18 12:34:30 +0000630 int ret = -1;
631 if(buf == NULL)
632 return ret;
633 int send_num = 0;
634 int recv_num = 0;
635 int len = 0;
636 char res_data[MAX_LEN] = {0};
637 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
638 client_t.paramLen = 1;
639 client_t.uToken = Global_uToken;
640 sprintf(client_t.param, "%s\n", "AT+CNUM");
llab0f3e12022-07-20 11:59:51 +0000641 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000642 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
643 if(send_num < 0)
644 {
645 RLOGD("sendto error:");
646 return ret;
647 }
648 //get data msg
649 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 +0000650 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000651 if(recv_num < 0 || recv_num == 0)
652 {
653 RLOGD("recvfrom step2 fail:");
654 return recv_num;
655 }
656 Parcel p;
657 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
658 p.setDataPosition(0);
659 int num = -1;
660 if(p.dataAvail() > 0)
661 {
llb1fc9212022-04-12 03:02:01 +0000662 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000663 char *argv[5] = {0};
664 p.readInt32(&resp_type);
665 p.readInt32(&request);
666 p.readInt32(&slot_id);
667 p.readInt32(&error1);
668 p.readInt32(&num);
669 if(num == -1){
670 }else{
671 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800672 num = parse_param(test, argv, buf);
673 return num;
lle1d5d7c2022-01-18 12:34:30 +0000674 }
675 }
676 return error1;
677}
rjw5d2a50e2022-02-28 15:01:49 +0800678
ll4c5c6b72022-03-31 15:27:23 +0800679/**
680 * @brief To handle comma-separated strings, take the character before the first comma eg:123456,78 ->123456
681 *
682 * @param buf Type:[IN]
683 */
684static void parse_imei(char buf[])
685{
686 if(NULL == buf)
687 {
688 return;
689 }
690 const char s[2] = ",";
691 char *token;
692 token = strtok(buf, s);
693 return;
694}
695
696int lynq_get_imei(char buf[])
ll27dbe752022-08-10 00:33:52 -0700697{
698 if(g_lynq_sim_init_flag == 0)
699 {
700 return -1;
701 }
llfcd43492022-03-10 09:01:50 +0000702 int ret = -1;
703 if(buf == NULL)
704 return ret;
705 int send_num = 0;
706 int recv_num = 0;
707 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800708 lynq_client_t client_t1;
709 memset(&client_t1, 0, sizeof(client_t1) );
710 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
711 client_t1.paramLen = 0;
712 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000713 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800714 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000715 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800716 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000717 if(send_num < 0)
718 {
719 RLOGD("sendto error:");
ll4c5c6b72022-03-31 15:27:23 +0800720 return send_num;
llfcd43492022-03-10 09:01:50 +0000721 }
ll4c5c6b72022-03-31 15:27:23 +0800722 //get data msg
llfcd43492022-03-10 09:01:50 +0000723 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 +0000724 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000725 if(recv_num < 0 || recv_num == 0)
726 {
727 RLOGD("recvfrom step2 fail:");
728 return recv_num;
729 }
730 Parcel p;
731 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
732 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800733 int num = 0;
llfcd43492022-03-10 09:01:50 +0000734 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800735 {
llfcd43492022-03-10 09:01:50 +0000736 p.readInt32(&resp_type);
737 p.readInt32(&request);
738 p.readInt32(&slot_id);
739 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800740 if(!error1){
741 p.readInt32(&num);
742 char * test = lynqStrdupReadString(p);
743 parse_imei(test);
744 memcpy(buf, test, strlen(test));
llfcd43492022-03-10 09:01:50 +0000745 }
746 }
747 return error1;
748}
749
rjw5d2a50e2022-02-28 15:01:49 +0800750static int judge(int slot){
751 switch(slot){
752 case 0:
753 return -1;
754 case 1:
755 return -1;
756 }
757 return 0;
758}
759
rjw5d2a50e2022-02-28 15:01:49 +0800760int lynq_switch_card(int slot){
ll27dbe752022-08-10 00:33:52 -0700761 if(g_lynq_sim_init_flag == 0)
762 {
763 return -1;
764 }
rjw5d2a50e2022-02-28 15:01:49 +0800765 int ret = -1;
766 if(!judge(slot))
767 return ret;
768 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800769 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
770 client_t.paramLen = 1;
771 client_t.uToken = Global_uToken;
772 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000773 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800774 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
775 if(send_num < 0)
776 {
777 RLOGD("sendto error:");
778 return send_num;
779 }
llab0f3e12022-07-20 11:59:51 +0000780 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800781 return 0;
782}
ll887a0172022-03-09 03:13:31 +0000783
784int lynq_screen(int num){
ll27dbe752022-08-10 00:33:52 -0700785 if(g_lynq_sim_init_flag == 0)
786 {
787 return -1;
788 }
ll887a0172022-03-09 03:13:31 +0000789 int ret = -1;
790 if(!judge(num))
791 return ret;
792 int send_num = 0;
ll887a0172022-03-09 03:13:31 +0000793 client_t.request = RIL_REQUEST_SCREEN_STATE;
794 client_t.paramLen = 1;
795 client_t.uToken = Global_uToken;
796 sprintf(client_t.param, "%d\n", num);
llab0f3e12022-07-20 11:59:51 +0000797 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000798 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 }
llab0f3e12022-07-20 11:59:51 +0000804 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000805 return 0;
806}
llba425bd2022-03-17 02:23:00 +0000807
808/**
809 * @brief Check whether the input is valid for lynq_req_sim_io api
810 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
811 * type: [IN] list[1]:EF id(fileid)
812 * type: [IN] list[2]:offset(p1)
813 * type: [IN] list[3]:offset(p2)
814 * type: [IN] list[4]:response len,sometimes needn't care(p3)
815 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
816 type: [IN] Path is in hex asciii format eg "7f205f70"
817 type: [IN] Path must always be provided.
818 * @param data type: [IN] May be NULL
819 * @param pin2 type: [IN] May be NULL
820 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
821 * @param sw type: [OUT]
822 * @param simResponse type: [OUT] response
823 * @return int
824 */
825static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
826{
llba425bd2022-03-17 02:23:00 +0000827 if(list == NULL)
828 {
829 return -1;
830 }
831 if(path == NULL)
832 {
833 return -1;
834 }
835 if(sw == NULL){
836 return -1;
837 }
838 if(simResponse == NULL){
839 return -1;
840 }
841 if(data == NULL)
842 {
843 memcpy(data_buf, "null", 4);
844 }
845 else
846 {
847 bzero(data_buf,32);
848 memcpy(data_buf, data, strlen(data));
849 }
850 if(pin2 == NULL)
851 {
852 memcpy(pin2_buf, "null", 4);
853 }
854 else
855 {
856 bzero(pin2_buf,32);
857 memcpy(pin2_buf, data, strlen(data));
858 }
859 if(aidPtr == NULL)
860 {
861 memcpy(aidPtr_buf, "null", 4);
862 }
863 else
864 {
865 bzero(aidPtr_buf,32);
866 memcpy(aidPtr_buf, data, strlen(data));
867 }
868 return 0;
869}
870
871int 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 -0700872{
873 if(g_lynq_sim_init_flag == 0)
874 {
875 return -1;
876 }
llba425bd2022-03-17 02:23:00 +0000877 int ret = -1;
878 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
879 {
880 return ret;
881 }
882 int send_num = 0;
883 int recv_num = 0;
884 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +0000885 client_t.request = RIL_REQUEST_SIM_IO;
886 client_t.paramLen = 9;
887 client_t.uToken = Global_uToken;
888 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 +0000889 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +0000890 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
891 if(send_num < 0)
892 {
893 RLOGD("sendto error:");
894 return send_num;
895 }
896 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 +0000897 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +0000898 if(recv_num < 0 || recv_num == 0)
899 {
900 RLOGD("recvfrom step2 fail:");
901 return recv_num;
902 }
903 Parcel p;
904 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
905 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +0000906 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +0000907 {
llba425bd2022-03-17 02:23:00 +0000908 p.readInt32(&resp_type);
909 p.readInt32(&request);
910 p.readInt32(&slot_id);
911 p.readInt32(&error1);
912 if(!error1)
913 {
914 p.readInt32(&sw[0]);
915 p.readInt32(&sw[1]);
916 char * test = lynqStrdupReadString(p);
917 memcpy(simResponse, test, strlen(test));
918 }
919
920 }
921 return error1;
922}
llb15599d2022-04-01 07:50:08 +0000923
924/**
925 * @brief handle shutdown buf
926 * @param options type: [IN]My Param doc
927 * @param time type: [IN]My Param doc
928 * @param message type: [IN]My Param doc
929 */
930static void handle_shutdown_buf(char options[], char time[], char message[])
931{
932 if(NULL == options)
933 {
934 bzero(options_buf, 32);
935 memcpy(options_buf," ", 1);
936 }
937 else
938 {
939 memcpy(options_buf,options, strlen(options));
940 }
941 if(NULL == time)
942 {
943 bzero(time_buf, 32);
944 memcpy(time_buf," ", 1);
945 }
946 else
947 {
948 memcpy(time_buf, time, strlen(time));
949 }
950 if(NULL == message)
951 {
952 bzero(message_buf, 32);
953 memcpy(message_buf," ", 1);
954 }
955 else
956 {
957 memcpy(message_buf, message, strlen(message));
958 }
959}
960
961int lynq_shutdown(char options[], char time[], char message[])
962{
963 char cmd[128] = {0};
964 handle_shutdown_buf(options, time, message);
965 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
966 system(cmd);
967 return 0;
968}
969
970int lynq_get_version(char buf[])
971{
972 FILE * fp;
973 char buffer[128];
974 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
975 fp = popen(buffer, "r");
976 fgets(buffer, sizeof(buffer), fp);
977 memcpy(buf, buffer, strlen(buffer));
978 buf[strlen(buffer)] = '\0';
979 pclose(fp);
980 return 0;
981}
lle1d5d7c2022-01-18 12:34:30 +0000982#if FLAG_TESS
983int lynq_query_operator(char buf[]){
984 int32_t token = -1;
985 if(buf == NULL)
986 return token;
987 char msg_imsi[20] = {0};
988 memset(msg_imsi,0,sizeof(msg_imsi));
989 token = lynq_get_imsi(msg_imsi);
990 if(strlen(msg_imsi) != 0){
991 FindOperator *ope_command = NULL;
992 ope_command = find_ope_command(msg_imsi, findOperator);
993 if(ope_command){
994 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
995 buf[strlen(ope_command->buf)] = '\0';
996 }
997 else{
998 /*more*/
999 char mccmnc[5] = {0};
1000 memcpy(buf, msg_imsi, 5);
1001 buf[5] = '\0';
1002 /*more*/
1003 }
1004 return token;
1005 }
1006 else{
1007 //msg->base.e = err;
1008 const char *test = "please insert sim card";
1009 memcpy(buf, test, strlen(test));
1010 return token;
1011 }
1012}
1013FindOperator findOperator[] = {
1014#include "operator.h"
1015};
1016
1017static FindOperator*find_ope_command (char *name,FindOperator *Class){
1018 if(name == NULL || Class == NULL){
1019 return ((FindOperator *)NULL);
1020 }
1021 register int i;
1022 for (i = 0; Class[i].MCCMCN; i++)
1023 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
1024 return (&Class[i]);
1025 return ((FindOperator *)NULL);
1026}
1027
1028#endif