blob: 194462403161503644d57e7f8a7e967b39fe95b9 [file] [log] [blame]
llb52a49f2022-09-05 00:23:18 -07001#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <arpa/inet.h>
5#include <string.h>
6#include <unistd.h>
7#include <binder/Parcel.h>
8#include <log/log.h>
9#include <cutils/jstring.h>
10#include <pthread.h>
11#include <sys/socket.h>
12#include <netinet/in.h>
13#include <arpa/inet.h>
14#include <errno.h>
15#include "lynq_timer.h"
16
17#define DEST_PORT 8088
18#define DSET_IP_ADDRESS "127.0.0.1"
19#define RIL_REQUEST_GET_IMSI 11
20#define MAX_LEN 1024
21#define TIMER 30
22
23using ::android::Parcel;
24
25static pthread_mutex_t g_lynq_sim_sendto_mutex;
26
27typedef struct{
28 int uToken;
29 int request;
30 int paramLen;
31 char param[MAX_LEN];
32}lynq_client_t;
33
34static int get_md_sta(void)
35{
36 FILE *fp;
37 char buffer[64]={};
38 fp = popen("cat /sys/kernel/ccci/boot","r");
39 if(fp == NULL)
40 {
41 RLOGD("function fp is null\n", __FUNCTION__);
42 return 0;
43 }
44 fgets(buffer,sizeof(buffer),fp);
45 if(buffer[4] == '4')
46 {
47 pclose(fp);
48 return 1;
49 }
50 pclose(fp);
51 return 0;
52}
53
54static int check_service(const char *service)
55{
56 FILE *fp;
57 char buffer[1024]={};
58 if(!strcmp(service, "/usr/sbin/mtkfusionrild"))
59 {
60 fp = popen("ps -ef|grep rild","r");
61 }
62 else if(!strcmp(service, "lynq-ril-service"))
63 {
64 fp = popen("ps -ef|grep ril-service","r");
65 }
66 if(fp == NULL)
67 {
68 RLOGD("function fp is null\n", __FUNCTION__);
69 return 0;
70 }
71 while(NULL != fgets(buffer,sizeof(buffer),fp))
72 {
73 if(strstr(buffer,service))
74 {
75 pclose(fp);
76 printf("check_service 1\n");
77 return 1;
78 }
79 }
80 printf("check_service 0\n");
81 pclose(fp);
82 return 0;
83}
84
85/**
86 * @brief 30s request imei
87 *
88 * @param arg
89 * @return void*
90 */
91void * timer_request_imei(void * arg)
92{
93 int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
94 if (-1 == sock_fd)
95 {
96 RLOGD("__FUNCTION__ %s create sock_fd failed %s\n", __FUNCTION__, strerror(errno));
97 /*set uci*/
98 /*socket abnormal*/
99 system("uci set lynq_uci.sdk_ready='3'");
100 /*set uci*/
101 return NULL;
102 }
103 struct timeval timeOut;
104 timeOut.tv_sec = 3;//timeout time 3s
105 timeOut.tv_usec = 0;
106 if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
107 {
108 RLOGD("__FUNCTION__ %s time out setting failed %s\n", __FUNCTION__, strerror(errno));
109 /*set uci*/
110 /*socket abnormal*/
111 system("uci set lynq_uci.sdk_ready='3'");
112 /*set uci*/
113 return NULL;
114 }
115 struct sockaddr_in addr_serv;
116 memset(&addr_serv, 0, sizeof(addr_serv));
117 addr_serv.sin_family = AF_INET;
118 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
119 addr_serv.sin_port = htons(DEST_PORT);
120 int len_addr_serv = sizeof(addr_serv);
121 int send_num = -1;
122 int recv_num = -1;
123 int resp_type = -1;
124 int request = -1;
125 int slot_id = -1;
126 int res_error = -1;
127 lynq_client_t client_t;
128 char res_data[MAX_LEN] = {0};
129 client_t.request = RIL_REQUEST_GET_IMSI;
130 client_t.paramLen = 0;
131 client_t.uToken = 999;
132 memset(client_t.param, 0, sizeof(client_t.param));
133 while (1)
134 {
135 sleep(5);
136 bzero(res_data, MAX_LEN);
137 pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
138 send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
139 printf("send_num %d\n", send_num);
140 if(send_num == 0)
141 {
142 RLOGD("__FUNCTION__ %s Close to end %s\n", __FUNCTION__, strerror(errno));
143 //unknow
144 system("uci set lynq_uci.sdk_ready='4'");
145 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
146 continue;
147 }
148 if(send_num < 0)
149 {
150 RLOGD("__FUNCTION__ %s sendto error %s\n", __FUNCTION__, strerror(errno));
151 //unknow
152 system("uci set lynq_uci.sdk_ready='4'");
153 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
154 continue;
155 }
156 //get data msg
157 recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
158 printf("recv_num %d\n", recv_num);
159 if(recv_num == 0)
160 {
161 RLOGD("__FUNCTION__ %s Close to end\n", __FUNCTION__);
162 //unknow
163 system("uci set lynq_uci.sdk_ready='4'");
164 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
165 continue;;
166 }
167 if(recv_num == -1 && errno == EAGAIN)
168 {
169 RLOGD("__FUNCTION__ %srecvfrom fail because timeout\n", __FUNCTION__);
170 /*set uci*/
171 if(!get_md_sta())
172 {
173 system("uci set lynq_uci.sdk_ready='1'");
174 }
175 else
176 {
177 if(check_service("/usr/sbin/mtkfusionrild"))//rild work
178 {
179 if(!check_service("lynq-ril-service"))//not find,must be socket error
180 {
181 system("uci set lynq_uci.sdk_ready='3'");
182 }
183 else
184 {
185 //unknow error
186 system("uci set lynq_uci.sdk_ready='4'");
187 }
188
189 }
190 else//rild no work
191 {
192 //unknow
193 system("uci set lynq_uci.sdk_ready='4'");
194 }
195 }
196 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
197 continue;;
198 }
199 if(recv_num < 0)
200 {
201 RLOGD("__FUNCTION__ %srecvfrom fail %s\n", __FUNCTION__, strerror(errno));
202 //unknow
203 system("uci set lynq_uci.sdk_ready='4'");
204 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
205 continue;;
206 }
207 Parcel p;
208 p.setData((uint8_t *)res_data,sizeof(char)*recv_num);
209 p.setDataPosition(0);
210 if(p.dataAvail() > 0)
211 {
212 p.readInt32(&resp_type);
213 p.readInt32(&request);
214 p.readInt32(&slot_id);
215 p.readInt32(&res_error);
216 }
217 /*judge the res_error*/
218 if(!res_error)
219 {
220 system("uci set lynq_uci.sdk_ready='2'");//Md configurations are inconsistent with AP configurations
221 }
222 else
223 {
224 system("uci set lynq_uci.sdk_ready='0'");
225 }
226 RLOGD("__FUNCTION__ %s res_error %d\n", __FUNCTION__, res_error);
227 /*judge the res_error*/
228 pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
229 sleep(TIMER-5);
230 }
231 return NULL;
232}
233
234
235void start_timer_request(void)
236{
237 pthread_t thid;
238 pthread_attr_t a;
239 pthread_attr_init(&a);
240 pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);
241 int ret = pthread_create(&thid, &a, timer_request_imei, NULL);
242 if(ret != 0){
243 RLOGD("pthread_create error!!!");
244 return;
245 }
246 return;
247}
248