blob: b9f12ea25cc9890c658887514b3fffbf6ede20e4 [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{
139 int ret = -1;
140 if(card_status == NULL)
141 return ret;
142 int send_num = 0;
143 int recv_num = 0;
144 int len = 0;
145 lynq_client_t client_t1;
146 memset(&client_t1, 0, sizeof(client_t1) );
147 client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
148 client_t1.paramLen = 0;
149 client_t1.uToken = Global_uToken;
150 char res_data[MAX_LEN] = {0};
151 int len1 = sizeof(client_t1.param);
152 memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
llab0f3e12022-07-20 11:59:51 +0000153 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000154 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
155 if(send_num < 0)
156 {
157 RLOGD("sendto error:");
158 return send_num;
159 }
160 //get data msg
161 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
162 if(recv_num < 0 || recv_num == 0)
163 {
164 RLOGD("recvfrom step2 fail:");
165 return recv_num;
166 }
llab0f3e12022-07-20 11:59:51 +0000167 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000168 Parcel p;;
169 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
170 p.setDataPosition(0);
171 if(p.dataAvail() > 0)
172 {
173 p.readInt32(&resp_type);
174 p.readInt32(&request);
175 p.readInt32(&slot_id);
176 p.readInt32(&error1);
177 p.readInt32(card_status);
178 }
179 return error1;
180}
llba425bd2022-03-17 02:23:00 +0000181
lle1d5d7c2022-01-18 12:34:30 +0000182int lynq_get_imsi(char buf[])
183{
184 int ret = -1;
185 if(buf == NULL)
186 return ret;
187 int send_num = 0;
188 int recv_num = 0;
189 int len = 0;
190 lynq_client_t client_t1;
191 memset(&client_t1, 0, sizeof(client_t1) );
192 client_t1.request = RIL_REQUEST_GET_IMSI;
193 client_t1.paramLen = 0;
194 client_t1.uToken = Global_uToken;
195 char res_data[MAX_LEN] = {0};
196 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000197 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000198 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
199 if(send_num < 0)
200 {
201 RLOGD("sendto error:");
202 return send_num;
203 }
204 //get data msg
205 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 +0000206 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000207 if(recv_num < 0 || recv_num == 0)
208 {
209 RLOGD("recvfrom step2 fail:");
210 return recv_num;
211 }
212 Parcel p;
213 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
214 p.setDataPosition(0);
215 if(p.dataAvail() > 0)
216 {
217 p.readInt32(&resp_type);
218 p.readInt32(&request);
219 p.readInt32(&slot_id);
220 p.readInt32(&error1);
221 if(!error1){
222 char * test = lynqStrdupReadString(p);
223 memcpy(buf, test, strlen(test));
224 }
225 }
226 return error1;
227}
228
229
230/*add by lei*/
231
232int lynq_get_iccid(char buf[]){
233 int ret = -1;
234 if(buf == NULL)
235 return ret;
236 int send_num = 0;
237 int recv_num = 0;
238 int len = 0;
239 client_t.request = RIL_REQUEST_QUERY_ICCID;
240 client_t.paramLen = 0;
241 client_t.uToken = Global_uToken;
242 char res_data[MAX_LEN] = {0};
243 memset(client_t.param, 0, sizeof(client_t.param));
llab0f3e12022-07-20 11:59:51 +0000244 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000245 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
246 if(send_num < 0)
247 {
248 RLOGD("sendto error:");
249 return send_num;
250 }
251 //get data msg
252 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 +0000253 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000254 if(recv_num < 0 || recv_num == 0)
255 {
256 RLOGD("recvfrom step2 fail:");
257 return recv_num;
258 }
259 Parcel p;
260 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
261 p.setDataPosition(0);
262 if(p.dataAvail() > 0)
263 {
264 p.readInt32(&resp_type);
265 p.readInt32(&request);
266 p.readInt32(&slot_id);
267 p.readInt32(&error1);
268 if(!error1){
269 char * test = lynqStrdupReadString(p);
270 memcpy(buf, test, strlen(test));
271 }
272 }
273 return error1;
274}
275
276int lynq_enable_pin(char *pin){
277 int ret = -1;
278 if(pin == NULL)
279 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800280 if(!strlen(pin))
281 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000282 int send_num = 0;
283 int recv_num = 0;
284 char res_data[MAX_LEN] = {0};
285 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
286 client_t.paramLen = 4;
287 client_t.uToken = Global_uToken;
288 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
llab0f3e12022-07-20 11:59:51 +0000289 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000290 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
291 if(send_num < 0)
292 {
293 RLOGD("sendto error:");
294 return send_num;
295 }
296
297 //get data msg
298 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 +0000299 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000300 if(recv_num < 0 || recv_num == 0)
301 {
302 RLOGD("recvfrom step2 fail:");
303 return recv_num;
304 }
305 Parcel p;
306 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
307 p.setDataPosition(0);
308 if(p.dataAvail() > 0)
309 {
310 p.readInt32(&resp_type);
311 p.readInt32(&request);
312 p.readInt32(&slot_id);
313 p.readInt32(&error1);
314 }
315 return error1;
316}
317
318int lynq_disable_pin(char *pin){
319 int ret = -1;
320 if(pin == NULL)
321 return ret;
322 int send_num = 0;
323 int recv_num = 0;
324 char res_data[MAX_LEN] = {0};
325 client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
326 client_t.paramLen = 4;
327 client_t.uToken = Global_uToken;
328 sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
llab0f3e12022-07-20 11:59:51 +0000329 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000330 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
331 if(send_num < 0)
332 {
333 RLOGD("sendto error:");
334 return send_num;
335 }
336 //get data msg
337 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 +0000338 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000339 if(recv_num < 0 || recv_num == 0)
340 {
341 RLOGD("recvfrom step2 fail:");
342 return recv_num;
343 }
344 Parcel p;
345 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
346 p.setDataPosition(0);
347 if(p.dataAvail() > 0)
348 {
349 p.readInt32(&resp_type);
350 p.readInt32(&request);
351 p.readInt32(&slot_id);
352 p.readInt32(&error1);
353 }
354 return error1;
355}
356
357int lynq_query_pin_lock(char *pin,int buf[]){
358 int ret = -1;
359 if(pin == NULL)
360 return ret;
361 int send_num = 0;
362 int recv_num = 0;
363 int len = 0;
364 client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
365 client_t.paramLen = 3;
366 client_t.uToken = Global_uToken;
367 char res_data[MAX_LEN] = {0};
368 sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
llab0f3e12022-07-20 11:59:51 +0000369 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000370 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
371 if(send_num < 0)
372 {
373 RLOGD("sendto error:");
374 return send_num;
375 }
376 //get data msg
377 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 +0000378 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000379 if(recv_num < 0 || recv_num == 0)
380 {
381 RLOGD("recvfrom step2 fail:");
382 return recv_num;
383 }
384 Parcel p;
385 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
386 p.setDataPosition(0);
387 int num = -1;
388 if(p.dataAvail() > 0)
389 {
390 p.readInt32(&resp_type);
391 p.readInt32(&request);
392 p.readInt32(&slot_id);
393 p.readInt32(&error1);
394 p.readInt32(&num);
395 if(num > 0){
396 int *test = (int *)calloc(1, sizeof(int)*num);
397 for(int i =0; i <num; i++){
398 p.readInt32(&test[i]);
399 buf[i] = test[i];
400 }
401 free(test);
402 }
403 }
404 return error1;
405}
406
407int lynq_verify_pin(char *pin){
408 int ret = -1;
409 if(pin == NULL)
410 return ret;
411 int send_num = 0;
412 int recv_num = 0;
413 char res_data[MAX_LEN] = {0};
414 int len = 0;
415 client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
416 client_t.paramLen = 1;
417 client_t.uToken = Global_uToken;
418 sprintf(client_t.param, "%s\n", pin);
llab0f3e12022-07-20 11:59:51 +0000419 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000420 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
421 if(send_num < 0)
422 {
423 RLOGD("sendto error:");
424 return send_num;
425 }
426 //get data msg
427 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 +0000428 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000429 if(recv_num < 0 || recv_num == 0)
430 {
431 RLOGD("recvfrom step2 fail:");
432 return recv_num;
433 }
434 Parcel p;
435 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
436 p.setDataPosition(0);
437 if(p.dataAvail() > 0)
438 {
439 p.readInt32(&resp_type);
440 p.readInt32(&request);
441 p.readInt32(&slot_id);
442 p.readInt32(&error1);
443 }
444 return error1;
445}
446
447int lynq_change_pin(char *old_pin, char *new_pin){
448 int ret = -1;
449 if(old_pin == NULL || new_pin == NULL)
450 return ret;
rjw5d2a50e2022-02-28 15:01:49 +0800451 if(!strlen(new_pin))
452 return ret;
ll3fe03462022-03-01 09:18:53 +0000453 if(!strlen(old_pin))
454 return ret;
lle1d5d7c2022-01-18 12:34:30 +0000455 int send_num = 0;
456 int recv_num = 0;
457 char res_data[MAX_LEN] = {0};
458 int len = 0;
459 client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
460 client_t.paramLen = 2;
461 client_t.uToken = Global_uToken;
462 sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
llab0f3e12022-07-20 11:59:51 +0000463 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000464 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
465 if(send_num < 0)
466 {
467 RLOGD("sendto error:");
468 return send_num;
469 }
470 //get data msg
471 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 +0000472 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000473 if(recv_num < 0 || recv_num == 0)
474 {
475 RLOGD("recvfrom step2 fail:");
476 return recv_num;
477 }
478 Parcel p;
479 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
480 p.setDataPosition(0);
481 if(p.dataAvail() > 0)
482 {
483 p.readInt32(&resp_type);
484 p.readInt32(&request);
485 p.readInt32(&slot_id);
486 p.readInt32(&error1);
487 }
488 return error1;
489}
490
491int lynq_unlock_pin(char *puk, char *pin){
492 int ret = -1;
493 if(puk == NULL || pin == NULL)
494 return ret;
495 int send_num = 0;
496 int recv_num = 0;
497 char res_data[MAX_LEN] = {0};
498 int len = 0;
499 client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
500 client_t.paramLen = 2;
501 client_t.uToken = Global_uToken;
502 sprintf(client_t.param, "%s %s\n", puk, pin);
llab0f3e12022-07-20 11:59:51 +0000503 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000504 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
505 if(send_num < 0)
506 {
507 RLOGD("sendto error:");
508 return send_num;
509 }
510 //get data msg
511 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 +0000512 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000513 if(recv_num < 0 || recv_num == 0)
514 {
515 RLOGD("recvfrom step2 fail:");
516 return recv_num;
517 }
518 Parcel p;
519 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
520 p.setDataPosition(0);
521 if(p.dataAvail() > 0)
522 {
523 p.readInt32(&resp_type);
524 p.readInt32(&request);
525 p.readInt32(&slot_id);
526 p.readInt32(&error1);
527 }
528 return error1;
529}
530
531static void delete_char(char str[],char target){
532 if(str == NULL){
533 return;
534 }
535 int i,j;
536 for(i=j=0;str[i]!='\0';i++){
537 if(str[i]!=target){
538 str[j++]=str[i];
539 }
540 }
541 str[j]='\0';
542}
543
544static int parse_param(char *cmd, char **argv, char buf[]){
545 if(cmd == NULL || argv == NULL || buf == NULL){
ll1651f342022-06-06 10:13:48 +0800546 return -1;
lle1d5d7c2022-01-18 12:34:30 +0000547 }
548 if(strstr(cmd,"ERROR")){
lle1d5d7c2022-01-18 12:34:30 +0000549 return 3;
550 }
551 else{
552 int argc = 0;
553 char *token;
554 token = strtok(cmd, ",");
llbe2bdbd2022-06-14 02:40:33 +0000555 if(strstr(token, "CNUM"))
556 {
lle1d5d7c2022-01-18 12:34:30 +0000557 char *string;
558 while (token != NULL)
llbe2bdbd2022-06-14 02:40:33 +0000559 {
560 if(argc == 5)
561 {
562 if(NULL == argv[1])
563 {
564 return 9002;
565 }
566 int lengh = strlen(argv[1]);
567 memcpy(buf, argv[1], lengh);
568 delete_char(buf, '"');
569 RLOGD("too many phone number return\n");
570 return 0;
571 }
lle1d5d7c2022-01-18 12:34:30 +0000572 string = token;
573 argv[argc++] = string;
574 token = strtok(NULL, ",");
575 }
llbe2bdbd2022-06-14 02:40:33 +0000576 if(NULL == argv[1])
577 {
578 return 9001;
579 }
lle1d5d7c2022-01-18 12:34:30 +0000580 int lengh = strlen(argv[1]);
581 memcpy(buf, argv[1], lengh);
lle1d5d7c2022-01-18 12:34:30 +0000582 delete_char(buf, '"');
ll1651f342022-06-06 10:13:48 +0800583 return 0;
lle1d5d7c2022-01-18 12:34:30 +0000584 }
llbe2bdbd2022-06-14 02:40:33 +0000585 return 9001;
lle1d5d7c2022-01-18 12:34:30 +0000586 }
lle1d5d7c2022-01-18 12:34:30 +0000587}
588
589int lynq_query_phone_number(char buf[]){
590 int ret = -1;
591 if(buf == NULL)
592 return ret;
593 int send_num = 0;
594 int recv_num = 0;
595 int len = 0;
596 char res_data[MAX_LEN] = {0};
597 client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
598 client_t.paramLen = 1;
599 client_t.uToken = Global_uToken;
600 sprintf(client_t.param, "%s\n", "AT+CNUM");
llab0f3e12022-07-20 11:59:51 +0000601 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000602 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
603 if(send_num < 0)
604 {
605 RLOGD("sendto error:");
606 return ret;
607 }
608 //get data msg
609 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
llab0f3e12022-07-20 11:59:51 +0000610 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
lle1d5d7c2022-01-18 12:34:30 +0000611 if(recv_num < 0 || recv_num == 0)
612 {
613 RLOGD("recvfrom step2 fail:");
614 return recv_num;
615 }
616 Parcel p;
617 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
618 p.setDataPosition(0);
619 int num = -1;
620 if(p.dataAvail() > 0)
621 {
llb1fc9212022-04-12 03:02:01 +0000622 char test[128] = {0};
lle1d5d7c2022-01-18 12:34:30 +0000623 char *argv[5] = {0};
624 p.readInt32(&resp_type);
625 p.readInt32(&request);
626 p.readInt32(&slot_id);
627 p.readInt32(&error1);
628 p.readInt32(&num);
629 if(num == -1){
630 }else{
631 p.read(test, num);
ll1651f342022-06-06 10:13:48 +0800632 num = parse_param(test, argv, buf);
633 return num;
lle1d5d7c2022-01-18 12:34:30 +0000634 }
635 }
636 return error1;
637}
rjw5d2a50e2022-02-28 15:01:49 +0800638
ll4c5c6b72022-03-31 15:27:23 +0800639/**
640 * @brief To handle comma-separated strings, take the character before the first comma eg:123456,78 ->123456
641 *
642 * @param buf Type:[IN]
643 */
644static void parse_imei(char buf[])
645{
646 if(NULL == buf)
647 {
648 return;
649 }
650 const char s[2] = ",";
651 char *token;
652 token = strtok(buf, s);
653 return;
654}
655
656int lynq_get_imei(char buf[])
657{
llfcd43492022-03-10 09:01:50 +0000658 int ret = -1;
659 if(buf == NULL)
660 return ret;
661 int send_num = 0;
662 int recv_num = 0;
663 int len = 0;
ll4c5c6b72022-03-31 15:27:23 +0800664 lynq_client_t client_t1;
665 memset(&client_t1, 0, sizeof(client_t1) );
666 client_t1.request = RIL_REQUEST_DEVICE_IDENTITY;
667 client_t1.paramLen = 0;
668 client_t1.uToken = Global_uToken;
llfcd43492022-03-10 09:01:50 +0000669 char res_data[MAX_LEN] = {0};
ll4c5c6b72022-03-31 15:27:23 +0800670 memset(client_t1.param, 0, sizeof(client_t1.param));
llab0f3e12022-07-20 11:59:51 +0000671 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll4c5c6b72022-03-31 15:27:23 +0800672 send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
llfcd43492022-03-10 09:01:50 +0000673 if(send_num < 0)
674 {
675 RLOGD("sendto error:");
ll4c5c6b72022-03-31 15:27:23 +0800676 return send_num;
llfcd43492022-03-10 09:01:50 +0000677 }
ll4c5c6b72022-03-31 15:27:23 +0800678 //get data msg
llfcd43492022-03-10 09:01:50 +0000679 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 +0000680 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llfcd43492022-03-10 09:01:50 +0000681 if(recv_num < 0 || recv_num == 0)
682 {
683 RLOGD("recvfrom step2 fail:");
684 return recv_num;
685 }
686 Parcel p;
687 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
688 p.setDataPosition(0);
ll4c5c6b72022-03-31 15:27:23 +0800689 int num = 0;
llfcd43492022-03-10 09:01:50 +0000690 if(p.dataAvail() > 0)
ll4c5c6b72022-03-31 15:27:23 +0800691 {
llfcd43492022-03-10 09:01:50 +0000692 p.readInt32(&resp_type);
693 p.readInt32(&request);
694 p.readInt32(&slot_id);
695 p.readInt32(&error1);
ll4c5c6b72022-03-31 15:27:23 +0800696 if(!error1){
697 p.readInt32(&num);
698 char * test = lynqStrdupReadString(p);
699 parse_imei(test);
700 memcpy(buf, test, strlen(test));
llfcd43492022-03-10 09:01:50 +0000701 }
702 }
703 return error1;
704}
705
rjw5d2a50e2022-02-28 15:01:49 +0800706static int judge(int slot){
707 switch(slot){
708 case 0:
709 return -1;
710 case 1:
711 return -1;
712 }
713 return 0;
714}
715
rjw5d2a50e2022-02-28 15:01:49 +0800716int lynq_switch_card(int slot){
717 int ret = -1;
718 if(!judge(slot))
719 return ret;
720 int send_num = 0;
rjw5d2a50e2022-02-28 15:01:49 +0800721 client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
722 client_t.paramLen = 1;
723 client_t.uToken = Global_uToken;
724 sprintf(client_t.param, "%d\n", slot);
llab0f3e12022-07-20 11:59:51 +0000725 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800726 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
727 if(send_num < 0)
728 {
729 RLOGD("sendto error:");
730 return send_num;
731 }
llab0f3e12022-07-20 11:59:51 +0000732 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
rjw5d2a50e2022-02-28 15:01:49 +0800733 return 0;
734}
ll887a0172022-03-09 03:13:31 +0000735
736int lynq_screen(int num){
737 int ret = -1;
738 if(!judge(num))
739 return ret;
740 int send_num = 0;
ll887a0172022-03-09 03:13:31 +0000741 client_t.request = RIL_REQUEST_SCREEN_STATE;
742 client_t.paramLen = 1;
743 client_t.uToken = Global_uToken;
744 sprintf(client_t.param, "%d\n", num);
llab0f3e12022-07-20 11:59:51 +0000745 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000746 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
747 if(send_num < 0)
748 {
749 RLOGD("sendto error:");
750 return send_num;
751 }
llab0f3e12022-07-20 11:59:51 +0000752 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
ll887a0172022-03-09 03:13:31 +0000753 return 0;
754}
llba425bd2022-03-17 02:23:00 +0000755
756/**
757 * @brief Check whether the input is valid for lynq_req_sim_io api
758 * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
759 * type: [IN] list[1]:EF id(fileid)
760 * type: [IN] list[2]:offset(p1)
761 * type: [IN] list[3]:offset(p2)
762 * type: [IN] list[4]:response len,sometimes needn't care(p3)
763 * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
764 type: [IN] Path is in hex asciii format eg "7f205f70"
765 type: [IN] Path must always be provided.
766 * @param data type: [IN] May be NULL
767 * @param pin2 type: [IN] May be NULL
768 * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
769 * @param sw type: [OUT]
770 * @param simResponse type: [OUT] response
771 * @return int
772 */
773static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
774{
llba425bd2022-03-17 02:23:00 +0000775 if(list == NULL)
776 {
777 return -1;
778 }
779 if(path == NULL)
780 {
781 return -1;
782 }
783 if(sw == NULL){
784 return -1;
785 }
786 if(simResponse == NULL){
787 return -1;
788 }
789 if(data == NULL)
790 {
791 memcpy(data_buf, "null", 4);
792 }
793 else
794 {
795 bzero(data_buf,32);
796 memcpy(data_buf, data, strlen(data));
797 }
798 if(pin2 == NULL)
799 {
800 memcpy(pin2_buf, "null", 4);
801 }
802 else
803 {
804 bzero(pin2_buf,32);
805 memcpy(pin2_buf, data, strlen(data));
806 }
807 if(aidPtr == NULL)
808 {
809 memcpy(aidPtr_buf, "null", 4);
810 }
811 else
812 {
813 bzero(aidPtr_buf,32);
814 memcpy(aidPtr_buf, data, strlen(data));
815 }
816 return 0;
817}
818
819int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
820{
821 int ret = -1;
822 if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
823 {
824 return ret;
825 }
826 int send_num = 0;
827 int recv_num = 0;
828 char res_data[MAX_LEN] = {0};
llba425bd2022-03-17 02:23:00 +0000829 client_t.request = RIL_REQUEST_SIM_IO;
830 client_t.paramLen = 9;
831 client_t.uToken = Global_uToken;
832 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 +0000833 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +0000834 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
835 if(send_num < 0)
836 {
837 RLOGD("sendto error:");
838 return send_num;
839 }
840 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 +0000841 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
llba425bd2022-03-17 02:23:00 +0000842 if(recv_num < 0 || recv_num == 0)
843 {
844 RLOGD("recvfrom step2 fail:");
845 return recv_num;
846 }
847 Parcel p;
848 p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
849 p.setDataPosition(0);
llba425bd2022-03-17 02:23:00 +0000850 if(p.dataAvail() > 0)
llb15599d2022-04-01 07:50:08 +0000851 {
llba425bd2022-03-17 02:23:00 +0000852 p.readInt32(&resp_type);
853 p.readInt32(&request);
854 p.readInt32(&slot_id);
855 p.readInt32(&error1);
856 if(!error1)
857 {
858 p.readInt32(&sw[0]);
859 p.readInt32(&sw[1]);
860 char * test = lynqStrdupReadString(p);
861 memcpy(simResponse, test, strlen(test));
862 }
863
864 }
865 return error1;
866}
llb15599d2022-04-01 07:50:08 +0000867
868/**
869 * @brief handle shutdown buf
870 * @param options type: [IN]My Param doc
871 * @param time type: [IN]My Param doc
872 * @param message type: [IN]My Param doc
873 */
874static void handle_shutdown_buf(char options[], char time[], char message[])
875{
876 if(NULL == options)
877 {
878 bzero(options_buf, 32);
879 memcpy(options_buf," ", 1);
880 }
881 else
882 {
883 memcpy(options_buf,options, strlen(options));
884 }
885 if(NULL == time)
886 {
887 bzero(time_buf, 32);
888 memcpy(time_buf," ", 1);
889 }
890 else
891 {
892 memcpy(time_buf, time, strlen(time));
893 }
894 if(NULL == message)
895 {
896 bzero(message_buf, 32);
897 memcpy(message_buf," ", 1);
898 }
899 else
900 {
901 memcpy(message_buf, message, strlen(message));
902 }
903}
904
905int lynq_shutdown(char options[], char time[], char message[])
906{
907 char cmd[128] = {0};
908 handle_shutdown_buf(options, time, message);
909 sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf);
910 system(cmd);
911 return 0;
912}
913
914int lynq_get_version(char buf[])
915{
916 FILE * fp;
917 char buffer[128];
918 sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION");
919 fp = popen(buffer, "r");
920 fgets(buffer, sizeof(buffer), fp);
921 memcpy(buf, buffer, strlen(buffer));
922 buf[strlen(buffer)] = '\0';
923 pclose(fp);
924 return 0;
925}
lle1d5d7c2022-01-18 12:34:30 +0000926#if FLAG_TESS
927int lynq_query_operator(char buf[]){
928 int32_t token = -1;
929 if(buf == NULL)
930 return token;
931 char msg_imsi[20] = {0};
932 memset(msg_imsi,0,sizeof(msg_imsi));
933 token = lynq_get_imsi(msg_imsi);
934 if(strlen(msg_imsi) != 0){
935 FindOperator *ope_command = NULL;
936 ope_command = find_ope_command(msg_imsi, findOperator);
937 if(ope_command){
938 memcpy(buf, ope_command->buf, strlen(ope_command->buf));
939 buf[strlen(ope_command->buf)] = '\0';
940 }
941 else{
942 /*more*/
943 char mccmnc[5] = {0};
944 memcpy(buf, msg_imsi, 5);
945 buf[5] = '\0';
946 /*more*/
947 }
948 return token;
949 }
950 else{
951 //msg->base.e = err;
952 const char *test = "please insert sim card";
953 memcpy(buf, test, strlen(test));
954 return token;
955 }
956}
957FindOperator findOperator[] = {
958#include "operator.h"
959};
960
961static FindOperator*find_ope_command (char *name,FindOperator *Class){
962 if(name == NULL || Class == NULL){
963 return ((FindOperator *)NULL);
964 }
965 register int i;
966 for (i = 0; Class[i].MCCMCN; i++)
967 if (strncmp (name, Class[i].MCCMCN, 5) == 0)
968 return (&Class[i]);
969 return ((FindOperator *)NULL);
970}
971
972#endif