| /*============================================================================= |
| # FileName: lynq_sim.cpp |
| # Desc: about SIM API |
| # Author: mobiletek |
| # Version: V1.0 |
| # LastChange: 2021-12-29 |
| # History: |
| =============================================================================*/ |
| #include <stdio.h> |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| #include <arpa/inet.h> |
| #include <string.h> |
| #include <unistd.h> |
| #include <binder/Parcel.h> |
| #include <log/log.h> |
| #include <cutils/jstring.h> |
| #include <pthread.h> |
| #include "lynq_sim.h" |
| #include <sys/socket.h> |
| #include <netinet/in.h> |
| #include <arpa/inet.h> |
| #include <errno.h> /*add for get recvfrom errorid on 20220921*/ |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #define MAX_BUF 20 |
| #define MAX_NUM 80 |
| #define RIL_REQUEST_GET_SIM_STATUS 1 |
| #define RIL_REQUEST_GET_IMSI 11 |
| #define RIL_REQUEST_QUERY_ICCID 2026 |
| #define RIL_REQUEST_SET_FACILITY_LOCK 43 |
| #define RIL_REQUEST_QUERY_FACILITY_LOCK 42 |
| #define RIL_REQUEST_ENTER_SIM_PIN 2 |
| #define RIL_REQUEST_ENTER_SIM_PUK 3 |
| #define RIL_REQUEST_CHANGE_SIM_PIN 6 |
| #define RIL_REQUEST_OEM_HOOK_RAW 59 |
| #define RIL_REQUEST_SCREEN_STATE 61 |
| #define RIL_REQUEST_SIM_IO 28 |
| #define RIL_REQUEST_DEVICE_IDENTITY 98 |
| #define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008 |
| #define LYNQ_REQUEST_CHANGE_SCREEN_STATE 8014 /*add for two sim suspend on 20220919*/ |
| #define MAX_LEN 1024*8 |
| #define MAX_NUM 10 |
| #define LOG_TAG "LYNQ_SIM" |
| #define FLAG_TESS 0 |
| using ::android::Parcel; |
| #define DEST_PORT 8088 |
| #define DSET_IP_ADDRESS "127.0.0.1" |
| |
| typedef struct{ |
| int uToken; |
| int request; |
| int paramLen; |
| char param[MAX_LEN]; |
| }lynq_client_t; |
| |
| lynq_client_t client_t; |
| /* socket文件描述符 */ |
| int len_addr_serv; |
| struct sockaddr_in addr_serv; |
| static int sock_fd = 0; |
| int Global_uToken = 0; |
| int solicited_token = -1; |
| int resp_type = -1; |
| int request = -1; |
| int slot_id = -1; |
| int error1 = -1; |
| static pthread_mutex_t g_lynq_sim_sendto_mutex; |
| /** |
| * @brief mark call initialization state |
| * 0: deinit state |
| * 1: init state |
| */ |
| int g_lynq_sim_init_flag = 0; |
| |
| /** |
| * @brief lynq_req_sim_io need to send request |
| */ |
| char data_buf[32] = {0}; |
| char pin2_buf[32] = {0}; |
| char aidPtr_buf[32] = {0}; |
| |
| /**/ |
| char options_buf[32] = {0}; |
| char time_buf[32] = {0}; |
| char message_buf[32] = {0}; |
| |
| int lynq_sim_init(int utoken){ |
| if(g_lynq_sim_init_flag == 1) |
| { |
| RLOGD("lynq_sim_init failed"); |
| return -1; |
| } |
| g_lynq_sim_init_flag = 1; |
| if(utoken < 0){ |
| return -1; |
| } |
| Global_uToken = utoken; |
| sock_fd = socket(AF_INET, SOCK_DGRAM, 0); |
| if (-1 == sock_fd) |
| { |
| return sock_fd; |
| } |
| struct timeval timeOut; |
| timeOut.tv_sec = 60; |
| timeOut.tv_usec = 0; |
| if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0) |
| { |
| RLOGD("time out setting failed\n"); |
| return -1; |
| } |
| /* 设置address */ |
| memset(&addr_serv, 0, sizeof(addr_serv)); |
| addr_serv.sin_family = AF_INET; |
| addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS); |
| addr_serv.sin_port = htons(DEST_PORT); |
| len_addr_serv = sizeof(addr_serv); |
| /*test*/ |
| return 0; |
| } |
| |
| int lynq_sim_deinit(void){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| RLOGD("lynq_sim_deinit failed"); |
| return -1; |
| } |
| g_lynq_sim_init_flag = 0; |
| close(sock_fd); |
| return 0; |
| } |
| |
| static char * lynqStrdupReadString(Parcel &p) { |
| size_t stringlen; |
| const char16_t *s16; |
| |
| s16 = p.readString16Inplace(&stringlen); |
| return strndup16to8(s16, stringlen); |
| } |
| |
| /*If you need to use any API under lynq_sim, you mustfirst call the lynq_sim_init() function to initialize these functions.*/ |
| int lynq_get_sim_status(int *card_status) |
| { |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(card_status == NULL) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| int len = 0; |
| lynq_client_t client_t1; |
| memset(&client_t1, 0, sizeof(client_t1) ); |
| client_t1.request = RIL_REQUEST_GET_SIM_STATUS; |
| client_t1.paramLen = 0; |
| client_t1.uToken = Global_uToken; |
| char res_data[MAX_LEN] = {0}; |
| int len1 = sizeof(client_t1.param); |
| memset(client_t1.param, 0, sizeof(char)*MAX_LEN); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return recv_num; |
| } |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| Parcel p;; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| p.readInt32(card_status); |
| } |
| return error1; |
| } |
| |
| int lynq_get_imsi(char buf[]) |
| { |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(buf == NULL) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| int len = 0; |
| lynq_client_t client_t1; |
| memset(&client_t1, 0, sizeof(client_t1) ); |
| client_t1.request = RIL_REQUEST_GET_IMSI; |
| client_t1.paramLen = 0; |
| client_t1.uToken = Global_uToken; |
| char res_data[MAX_LEN] = {0}; |
| memset(client_t1.param, 0, sizeof(client_t1.param)); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| if(!error1){ |
| char * test = lynqStrdupReadString(p); |
| memcpy(buf, test, strlen(test)); |
| free(test); |
| } |
| } |
| return error1; |
| } |
| |
| |
| /*add by lei*/ |
| |
| int lynq_get_iccid(char buf[]){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(buf == NULL) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| int len = 0; |
| client_t.request = RIL_REQUEST_QUERY_ICCID; |
| client_t.paramLen = 0; |
| client_t.uToken = Global_uToken; |
| char res_data[MAX_LEN] = {0}; |
| memset(client_t.param, 0, sizeof(client_t.param)); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| if(!error1){ |
| char * test = lynqStrdupReadString(p); |
| memcpy(buf, test, strlen(test)); |
| free(test); |
| } |
| } |
| return error1; |
| } |
| |
| int lynq_enable_pin(char *pin){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(pin == NULL) |
| return ret; |
| if(!strlen(pin)) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| char res_data[MAX_LEN] = {0}; |
| client_t.request = RIL_REQUEST_SET_FACILITY_LOCK; |
| client_t.paramLen = 4; |
| client_t.uToken = Global_uToken; |
| sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1"); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| } |
| return error1; |
| } |
| |
| int lynq_sim_power(int mode) |
| { |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| int send_num = 0; |
| int recv_num = 0; |
| int len = 0; |
| char res_data[MAX_LEN] = {0}; |
| client_t.request = RIL_REQUEST_OEM_HOOK_RAW; |
| client_t.paramLen = 1; |
| client_t.uToken = Global_uToken; |
| char buf[64] = {0}; |
| sprintf(buf, "%s%d", "AT+ESIMPOWER=", mode); |
| sprintf(client_t.param, "%s\n", buf); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return ret; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| int num = -1; |
| if(p.dataAvail() > 0) |
| { |
| char test[128] = {0}; |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| p.readInt32(&num); |
| if(num == -1){ |
| }else{ |
| p.read(test, num); |
| return error1; |
| } |
| } |
| return error1; |
| } |
| |
| int lynq_disable_pin(char *pin){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(pin == NULL) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| char res_data[MAX_LEN] = {0}; |
| client_t.request = RIL_REQUEST_SET_FACILITY_LOCK; |
| client_t.paramLen = 4; |
| client_t.uToken = Global_uToken; |
| sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0"); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| } |
| return error1; |
| } |
| |
| int lynq_query_pin_lock(char *pin,int buf[]){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(pin == NULL) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| int len = 0; |
| client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK; |
| client_t.paramLen = 3; |
| client_t.uToken = Global_uToken; |
| char res_data[MAX_LEN] = {0}; |
| sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11"); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| int num = -1; |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| p.readInt32(&num); |
| if(num > 0){ |
| int *test = (int *)calloc(1, sizeof(int)*num); |
| for(int i =0; i <num; i++){ |
| p.readInt32(&test[i]); |
| buf[i] = test[i]; |
| } |
| free(test); |
| } |
| } |
| return error1; |
| } |
| |
| int lynq_verify_pin(char *pin){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(pin == NULL) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| char res_data[MAX_LEN] = {0}; |
| int len = 0; |
| client_t.request = RIL_REQUEST_ENTER_SIM_PIN; |
| client_t.paramLen = 1; |
| client_t.uToken = Global_uToken; |
| sprintf(client_t.param, "%s\n", pin); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| } |
| return error1; |
| } |
| |
| int lynq_change_pin(char *old_pin, char *new_pin){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(old_pin == NULL || new_pin == NULL) |
| return ret; |
| if(!strlen(new_pin)) |
| return ret; |
| if(!strlen(old_pin)) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| char res_data[MAX_LEN] = {0}; |
| int len = 0; |
| client_t.request = RIL_REQUEST_CHANGE_SIM_PIN; |
| client_t.paramLen = 2; |
| client_t.uToken = Global_uToken; |
| sprintf(client_t.param, "%s %s\n", old_pin, new_pin); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| } |
| return error1; |
| } |
| |
| int lynq_unlock_pin(char *puk, char *pin){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(puk == NULL || pin == NULL) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| char res_data[MAX_LEN] = {0}; |
| int len = 0; |
| client_t.request = RIL_REQUEST_ENTER_SIM_PUK; |
| client_t.paramLen = 2; |
| client_t.uToken = Global_uToken; |
| sprintf(client_t.param, "%s %s\n", puk, pin); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| } |
| return error1; |
| } |
| |
| static void delete_char(char str[],char target){ |
| if(str == NULL){ |
| return; |
| } |
| int i,j; |
| for(i=j=0;str[i]!='\0';i++){ |
| if(str[i]!=target){ |
| str[j++]=str[i]; |
| } |
| } |
| str[j]='\0'; |
| } |
| |
| static int parse_param(char *cmd, char **argv, char buf[]){ |
| if(cmd == NULL || argv == NULL || buf == NULL){ |
| return -1; |
| } |
| if(strstr(cmd,"ERROR")){ |
| return 3; |
| } |
| else{ |
| int argc = 0; |
| char *token; |
| token = strtok(cmd, ","); |
| if(token == NULL) |
| { |
| return 9001; |
| } |
| if(strstr(token, "CNUM")) |
| { |
| char *string; |
| while (token != NULL) |
| { |
| if(argc == 5) |
| { |
| if(NULL == argv[1]) |
| { |
| return 9002; |
| } |
| int lengh = strlen(argv[1]); |
| memcpy(buf, argv[1], lengh); |
| delete_char(buf, '"'); |
| RLOGD("too many phone number return\n"); |
| return 0; |
| } |
| string = token; |
| argv[argc++] = string; |
| token = strtok(NULL, ","); |
| } |
| if(NULL == argv[1]) |
| { |
| return 9001; |
| } |
| int lengh = strlen(argv[1]); |
| memcpy(buf, argv[1], lengh); |
| delete_char(buf, '"'); |
| return 0; |
| } |
| return 9001; |
| } |
| } |
| |
| int lynq_query_phone_number(char buf[]){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(buf == NULL) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| int len = 0; |
| char res_data[MAX_LEN] = {0}; |
| client_t.request = RIL_REQUEST_OEM_HOOK_RAW; |
| client_t.paramLen = 1; |
| client_t.uToken = Global_uToken; |
| sprintf(client_t.param, "%s\n", "AT+CNUM"); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return ret; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| int num = -1; |
| if(p.dataAvail() > 0) |
| { |
| char test[128] = {0}; |
| char *argv[5] = {0}; |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| p.readInt32(&num); |
| if(num == -1){ |
| }else{ |
| p.read(test, num); |
| num = parse_param(test, argv, buf); |
| return num; |
| } |
| } |
| return error1; |
| } |
| |
| int lynq_get_imei_and_sv(char imei[],char sv[]) |
| { |
| RLOGD("%s called",__func__); |
| if(g_lynq_sim_init_flag == 0) |
| { |
| RLOGD("%s init_flag is %d",__func__,g_lynq_sim_init_flag); |
| return -2; |
| } |
| int ret = -1; |
| if(imei == NULL || sv== NULL) |
| { |
| RLOGD("%s imei is NULL or sv is NULL",__func__); |
| return ret; |
| } |
| |
| int send_num = 0; |
| int recv_num = 0; |
| int len = 0; |
| lynq_client_t client_t1; |
| memset(&client_t1, 0, sizeof(client_t1) ); |
| client_t1.request = RIL_REQUEST_DEVICE_IDENTITY; |
| client_t1.paramLen = 0; |
| client_t1.uToken = Global_uToken; |
| char res_data[MAX_LEN] = {0}; |
| memset(client_t1.param, 0, sizeof(client_t1.param)); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("%s sendto error: %d",__func__,send_num); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| //get data msg |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("%s recvfrom step2 fail:%d",__func__,recv_num); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| int num = 0; |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| if(!error1){ |
| p.readInt32(&num); |
| if(num<2) |
| { |
| RLOGD("%s num %d error, should greater than 1",__func__,num); |
| return -1; |
| } |
| char *resp[2]={NULL,NULL}; |
| int i; |
| for(i=0;i<2;i++) |
| { |
| resp[i]= lynqStrdupReadString(p); |
| if(resp[i]==NULL) |
| { |
| break; |
| } |
| } |
| |
| if(i==2){ |
| memcpy(imei, resp[0], strlen(resp[0])+1); |
| memcpy(sv, resp[1], strlen(resp[1])+1); |
| } |
| else |
| { |
| RLOGD("%s resp[%d] is null",__func__,i); |
| } |
| |
| for(i=0;i<2;i++) |
| { |
| if(resp[i]!=NULL) |
| { |
| free(resp[i]); |
| } |
| } |
| return i==2? 0:-1; |
| } |
| } |
| RLOGD("%s called failed %d",__func__,error1); |
| return error1; |
| } |
| |
| static int judge(int slot){ |
| switch(slot){ |
| case 0: |
| return -1; |
| case 1: |
| return -1; |
| } |
| return 0; |
| } |
| |
| int lynq_switch_card(int slot){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(!judge(slot)) |
| return ret; |
| int send_num = 0; |
| client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL; |
| client_t.paramLen = 1; |
| client_t.uToken = Global_uToken; |
| sprintf(client_t.param, "%d\n", slot); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| return send_num; |
| } |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return 0; |
| } |
| /**@breif change screen state |
| *param num type: [IN] screen_state,0:close,1:open |
| *param ret type: [OUT] result,0:success,other:fail |
| *return int |
| */ |
| int lynq_screen(int num){ |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| |
| int ret = -1; |
| if(!judge(num)) |
| return ret; |
| int send_num = 0; |
| int recv_num = 0; |
| int error[2]; |
| char res_data[MAX_LEN] = {0}; |
| |
| //change the first screen |
| client_t.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE; //8014 |
| client_t.paramLen = 1; |
| client_t.uToken = Global_uToken; |
| sprintf(client_t.param, "%d\n", num); |
| |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("sendto error:\n"); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| for(int i=0;i<2;i++) |
| { |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);//recvfrom fail |
| RLOGD("screen recvform error\n"); |
| return errno; |
| } |
| if(i == 1) |
| { |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| RLOGD("recvfrom success\n"); |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); |
| p.setDataPosition(0); |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| error[i] = error1;//change screen state result |
| } |
| } |
| |
| if((error[0] != 0) || (error[1] != 0)) |
| { |
| RLOGD("error[0] = %d errpr[1] = %d\n",error[0], error[1]); |
| if(error[0] != 0) |
| { |
| return error[0]; |
| } |
| else |
| { |
| return error[1]; |
| } |
| } |
| else |
| { |
| return 0; |
| } |
| |
| } |
| |
| /** |
| * @brief Check whether the input is valid for lynq_req_sim_io api |
| * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command) |
| * type: [IN] list[1]:EF id(fileid) |
| * type: [IN] list[2]:offset(p1) |
| * type: [IN] list[3]:offset(p2) |
| * type: [IN] list[4]:response len,sometimes needn't care(p3) |
| * @param path type: [IN] "pathid" from TS 27.007 +CRSM command. |
| type: [IN] Path is in hex asciii format eg "7f205f70" |
| type: [IN] Path must always be provided. |
| * @param data type: [IN] May be NULL |
| * @param pin2 type: [IN] May be NULL |
| * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. |
| * @param sw type: [OUT] |
| * @param simResponse type: [OUT] response |
| * @return int |
| */ |
| static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse) |
| { |
| if(list == NULL) |
| { |
| return -1; |
| } |
| if(path == NULL) |
| { |
| return -1; |
| } |
| if(sw == NULL){ |
| return -1; |
| } |
| if(simResponse == NULL){ |
| return -1; |
| } |
| if(data == NULL) |
| { |
| memcpy(data_buf, "null", 4); |
| } |
| else |
| { |
| bzero(data_buf,32); |
| memcpy(data_buf, data, strlen(data)); |
| } |
| if(pin2 == NULL) |
| { |
| memcpy(pin2_buf, "null", 4); |
| } |
| else |
| { |
| bzero(pin2_buf,32); |
| memcpy(pin2_buf, data, strlen(data)); |
| } |
| if(aidPtr == NULL) |
| { |
| memcpy(aidPtr_buf, "null", 4); |
| } |
| else |
| { |
| bzero(aidPtr_buf,32); |
| memcpy(aidPtr_buf, data, strlen(data)); |
| } |
| return 0; |
| } |
| |
| int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse) |
| { |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse)) |
| { |
| return ret; |
| } |
| int send_num = 0; |
| int recv_num = 0; |
| char res_data[MAX_LEN] = {0}; |
| client_t.request = RIL_REQUEST_SIM_IO; |
| client_t.paramLen = 9; |
| client_t.uToken = Global_uToken; |
| 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); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return send_num; |
| } |
| recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| if(recv_num < 0 || recv_num == 0) |
| { |
| RLOGD("recvfrom step2 fail:"); |
| return recv_num; |
| } |
| Parcel p; |
| p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen); |
| p.setDataPosition(0); |
| if(p.dataAvail() > 0) |
| { |
| p.readInt32(&resp_type); |
| p.readInt32(&solicited_token); |
| p.readInt32(&request); |
| p.readInt32(&slot_id); |
| p.readInt32(&error1); |
| if(!error1) |
| { |
| p.readInt32(&sw[0]); |
| p.readInt32(&sw[1]); |
| char * test = lynqStrdupReadString(p); |
| memcpy(simResponse, test, strlen(test)); |
| free(test); |
| } |
| |
| } |
| return error1; |
| } |
| |
| static void wait_reset_mipc_response(int *response) |
| { |
| usleep(500*1000); |
| int outfd = open("/data/tp",O_RDONLY); |
| if(outfd == -1){ |
| RLOGD("open error"); |
| return; |
| } |
| char rst[1024]; |
| int s; |
| s = read(outfd,rst,sizeof(rst)); |
| sscanf(rst,"%d",response); |
| usleep(1); |
| close(outfd); |
| return; |
| } |
| |
| int lynq_reset_modem(void) |
| { |
| if(g_lynq_sim_init_flag == 0) |
| { |
| return -1; |
| } |
| int ret = -1; |
| int send_num = 0; |
| client_t.request = RIL_REQUEST_OEM_HOOK_RAW; |
| client_t.paramLen = 1; |
| client_t.uToken = Global_uToken; |
| sprintf(client_t.param, "%s\n", "AT+LRSTMD"); |
| pthread_mutex_lock(&g_lynq_sim_sendto_mutex); |
| send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); |
| if(send_num < 0) |
| { |
| RLOGD("function %s sendto error:", __FUNCTION__); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| return ret; |
| } |
| wait_reset_mipc_response(&ret); |
| pthread_mutex_unlock(&g_lynq_sim_sendto_mutex); |
| RLOGD("function %d ret %d",__FUNCTION__, ret); |
| return ret; |
| } |
| |
| /** |
| * @brief handle shutdown buf |
| * @param options type: [IN]My Param doc |
| * @param time type: [IN]My Param doc |
| * @param message type: [IN]My Param doc |
| */ |
| static void handle_shutdown_buf(char options[], char time[], char message[]) |
| { |
| if(NULL == options) |
| { |
| bzero(options_buf, 32); |
| memcpy(options_buf," ", 1); |
| } |
| else |
| { |
| memcpy(options_buf,options, strlen(options)); |
| } |
| if(NULL == time) |
| { |
| bzero(time_buf, 32); |
| memcpy(time_buf," ", 1); |
| } |
| else |
| { |
| memcpy(time_buf, time, strlen(time)); |
| } |
| if(NULL == message) |
| { |
| bzero(message_buf, 32); |
| memcpy(message_buf," ", 1); |
| } |
| else |
| { |
| memcpy(message_buf, message, strlen(message)); |
| } |
| } |
| |
| int lynq_shutdown(char options[], char time[], char message[]) |
| { |
| char cmd[128] = {0}; |
| handle_shutdown_buf(options, time, message); |
| sprintf(cmd, "%s %s %s %s", "shutdown", options_buf, time_buf, message_buf); |
| system(cmd); |
| return 0; |
| } |
| |
| int lynq_get_version(char buf[]) |
| { |
| FILE * fp; |
| char buffer[128]; |
| sprintf(buffer, "%s", "uci get lynq_uci_ro.lynq_version.LYNQ_SW_VERSION"); |
| fp = popen(buffer, "r"); |
| fgets(buffer, sizeof(buffer), fp); |
| memcpy(buf, buffer, strlen(buffer)); |
| buf[strlen(buffer)] = '\0'; |
| pclose(fp); |
| return 0; |
| } |
| #if FLAG_TESS |
| int lynq_query_operator(char buf[]){ |
| int32_t token = -1; |
| if(buf == NULL) |
| return token; |
| char msg_imsi[20] = {0}; |
| memset(msg_imsi,0,sizeof(msg_imsi)); |
| token = lynq_get_imsi(msg_imsi); |
| if(strlen(msg_imsi) != 0){ |
| FindOperator *ope_command = NULL; |
| ope_command = find_ope_command(msg_imsi, findOperator); |
| if(ope_command){ |
| memcpy(buf, ope_command->buf, strlen(ope_command->buf)); |
| buf[strlen(ope_command->buf)] = '\0'; |
| } |
| else{ |
| /*more*/ |
| char mccmnc[5] = {0}; |
| memcpy(buf, msg_imsi, 5); |
| buf[5] = '\0'; |
| /*more*/ |
| } |
| return token; |
| } |
| else{ |
| //msg->base.e = err; |
| const char *test = "please insert sim card"; |
| memcpy(buf, test, strlen(test)); |
| return token; |
| } |
| } |
| FindOperator findOperator[] = { |
| #include "operator.h" |
| }; |
| |
| static FindOperator*find_ope_command (char *name,FindOperator *Class){ |
| if(name == NULL || Class == NULL){ |
| return ((FindOperator *)NULL); |
| } |
| register int i; |
| for (i = 0; Class[i].MCCMCN; i++) |
| if (strncmp (name, Class[i].MCCMCN, 5) == 0) |
| return (&Class[i]); |
| return ((FindOperator *)NULL); |
| } |
| |
| #endif |