blob: 90ded4baef794bbcbea7e972c21d2123fd9a1e0a [file] [log] [blame]
rjw7e50cd32022-01-18 18:30:37 +08001#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 <vendor-ril/telephony/ril.h>
rjw4a5a78d2022-03-10 11:04:24 +080012#include <vendor-ril/telephony/mtk_ril_sp.h>
rjw7e50cd32022-01-18 18:30:37 +080013
14#include "lynq_network.h"
15#include "liblog/lynq_deflog.h"
16#define LYNQ_SERVICE_PORT 8088
17#define LYNQ_URC_SERVICE_PORT 8086
18#define LYNQ_URC_ADDRESS "0.0.0.0"
19#define LYNQ_ADDRESS "127.0.0.1"
20#define LYNQ_REQUEST_PARAM_BUF 8192
21#define LYNQ_REC_BUF 8192
22#define LYNQ_RESP_BUF 128
23#define LYNQ_TYPE_BUF 10
24#define USER_LOG_TAG "LYNQ_NETWORK"
25
26
27using ::android::Parcel;
28
29
30typedef struct{
31 int uToken;
32 int request;
33 int paramLen;
34 char param[LYNQ_REQUEST_PARAM_BUF];
35}lynq_client_t;
36
37typedef struct{
38 int resp_type;
39 int request;
40 int slot_id;
41 int error;
42}lynq_resp_t;
43
44lynq_client_t client_t;
45lynq_resp_t response;
rjwbc8a05f2022-03-02 15:23:11 +080046
47int network_len_addr_serv;
48int network_len_urc_addr_serv;
49struct sockaddr_in network_addr_serv;
50struct sockaddr_in network_urc_addr_serv;
51static int network_sock_fd = 0;
52int network_urc_sock_fd = 0;
53int network_Global_uToken = 0;
54int network_slot_id = -1;
55int network_urc_slot_id = -1;
56int network_urc_status = 1;
57int network_wait_urc_id = 0;
58signalStrength_t network_urc_solSigStren;
rjw22947c22022-03-15 09:21:29 +080059/**g_lynq_network_init_flag
60* @brief mark network initialization state
61* 0:deinit status
62* 1:init state
63*/
64static int g_lynq_network_init_flag = 0;
rjw7e50cd32022-01-18 18:30:37 +080065
rjwbc8a05f2022-03-02 15:23:11 +080066static pthread_mutex_t signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
67static pthread_cond_t signal_state_change_cond = PTHREAD_COND_INITIALIZER;
rjw7e50cd32022-01-18 18:30:37 +080068
rjw9c301f82022-05-25 09:10:33 +080069/**g_lynq_network_sendto_mutex
70* @brief mark network send request mutex
71*/
72static pthread_mutex_t g_lynq_network_sendto_mutex;
73
74//static pthread_mutex_t g_lynq_network_recv_mutex;
75
rjw7e50cd32022-01-18 18:30:37 +080076typedef enum{
77 LYNQ_E_CARDSTATE_ERROR=8000,
78 /* The voice service state is out of service*/
79 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
80 /* The voice service state is EMERGENCY_ONLY*/
81 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
82 /* The radio power is power off*/
83 LYNQ_E_STATE_POWER_OFF=8003,
84 LYNQ_E_TIME_OUT=8004,
85 /*create or open sms DB fail */
86 LYNQ_E_SMS_DB_FAIL=8005,
87 /*Failed to execute sql statement*/
88 LYNQ_E_SMS_SQL_FAIL = 8006,
89 LYNQ_E_SMS_NOT_FIND = 8007,
90 /* The logic conflict*/
91 LYNQ_E_CONFLICT=9000,
92 /*Null anomaly*/
93 LYNQ_E_NULL_ANONALY=9001
94}LYNQ_E;
95
rjwbc8a05f2022-03-02 15:23:11 +080096int wait_signal_changes()
97{
98 int ret = 0;
99 pthread_mutex_lock(&signal_state_change_mutex);
100 ret = pthread_cond_wait(&signal_state_change_cond,&signal_state_change_mutex);
101 pthread_mutex_unlock(&signal_state_change_mutex);
102 return 0;
103}
104
105void send_signal_changes()
106{
107 pthread_mutex_lock(&signal_state_change_mutex);
108 pthread_cond_signal(&signal_state_change_cond);
109 pthread_mutex_unlock(&signal_state_change_mutex);
110 return;
111}
112
rjw7e50cd32022-01-18 18:30:37 +0800113void *thread_urc_recv(void *p)
114{
115 Parcel *urc_p =NULL;
116 char urc_data[LYNQ_REC_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800117 int resp_type = -1;
118 int urc_id = -1;
119 int res = 0;
120 int none = 0;
121 int NR_sum = 0;
rjw7e50cd32022-01-18 18:30:37 +0800122 int urc_LTE_signalstrength = 0;
123 int urc_WCDMA_signalstrength = 0;
rjw7e50cd32022-01-18 18:30:37 +0800124 LYINFLOG("urc thread is running");
rjwbc8a05f2022-03-02 15:23:11 +0800125 while(network_urc_status)
rjw7e50cd32022-01-18 18:30:37 +0800126 {
127 bzero(urc_data,LYNQ_REC_BUF);
rjwbc8a05f2022-03-02 15:23:11 +0800128 res = recvfrom(network_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&network_urc_addr_serv,(socklen_t*)&network_len_urc_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800129 if(res<=0)
130 {
131 LYERRLOG("thread_urc_recv step2 fail:");
132 break;
133 }
134 urc_p = new Parcel();
135 urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
136 urc_p->setDataPosition(0);
137 if(urc_p->dataAvail()>0)
138 {
139 urc_p->readInt32(&resp_type);
140 urc_p->readInt32(&urc_id);
rjwbc8a05f2022-03-02 15:23:11 +0800141 urc_p->readInt32(&network_urc_slot_id);
rjw7e50cd32022-01-18 18:30:37 +0800142 switch(urc_id)
143 {
144 case 1002: //RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED
145 {
rjwbc8a05f2022-03-02 15:23:11 +0800146 network_wait_urc_id = urc_id;
147 LYINFLOG("slot_id = %d",network_urc_slot_id);
148 send_signal_changes();
rjw7e50cd32022-01-18 18:30:37 +0800149 }
150 case 1009: //RIL_UNSOL_SIGNAL_STRENGTH
151 {
rjwbc8a05f2022-03-02 15:23:11 +0800152 urc_p->readInt32(&network_urc_solSigStren.rssi);
153 if((network_urc_solSigStren.rssi!=99)&&(network_urc_solSigStren.rssi!=0))
rjw7e50cd32022-01-18 18:30:37 +0800154 {
rjwbc8a05f2022-03-02 15:23:11 +0800155 network_urc_solSigStren.gw_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800156 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800157 network_urc_solSigStren.gw_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800158 }
rjwbc8a05f2022-03-02 15:23:11 +0800159 if(network_urc_solSigStren.gw_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800160 {
rjwbc8a05f2022-03-02 15:23:11 +0800161 LYINFLOG("urc_GSM_signalstrength:%d",network_urc_solSigStren.rssi);
rjw78d04502022-02-24 13:37:11 +0800162 }
rjw7e50cd32022-01-18 18:30:37 +0800163 urc_p->readInt32(&none);
164 urc_p->readInt32(&none);
165 urc_p->readInt32(&none);
166 urc_p->readInt32(&none);
167 urc_p->readInt32(&none);
168 urc_p->readInt32(&none);
169 urc_p->readInt32(&none);
170 urc_p->readInt32(&urc_LTE_signalstrength);
171 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
rjwbc8a05f2022-03-02 15:23:11 +0800172 urc_p->readInt32(&network_urc_solSigStren.rsrp);
173 urc_p->readInt32(&network_urc_solSigStren.rsrq);
174 urc_p->readInt32(&network_urc_solSigStren.rssnr);
rjw7e50cd32022-01-18 18:30:37 +0800175 if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))
176 {
rjwbc8a05f2022-03-02 15:23:11 +0800177 network_urc_solSigStren.lte_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800178 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800179 network_urc_solSigStren.lte_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800180 }
rjwbc8a05f2022-03-02 15:23:11 +0800181 if(network_urc_solSigStren.lte_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800182 {
183 LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);
184 }
rjw7e50cd32022-01-18 18:30:37 +0800185 urc_p->readInt32(&none);
186 urc_p->readInt32(&none);
187 urc_p->readInt32(&none);
188 urc_p->readInt32(&none);
189 urc_p->readInt32(&none);
190 urc_p->readInt32(&urc_WCDMA_signalstrength);
191 urc_p->readInt32(&none);
rjwbc8a05f2022-03-02 15:23:11 +0800192 urc_p->readInt32(&network_urc_solSigStren.rscp);
193 urc_p->readInt32(&network_urc_solSigStren.ecno);
rjw7e50cd32022-01-18 18:30:37 +0800194 if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))
195 {
rjwbc8a05f2022-03-02 15:23:11 +0800196 network_urc_solSigStren.wcdma_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800197 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800198 network_urc_solSigStren.wcdma_sig_valid = 0;
rjw78d04502022-02-24 13:37:11 +0800199 }
rjwbc8a05f2022-03-02 15:23:11 +0800200 if(network_urc_solSigStren.wcdma_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800201 {
202 LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);
rjw7e50cd32022-01-18 18:30:37 +0800203 }
rjwbc8a05f2022-03-02 15:23:11 +0800204 urc_p->readInt32(&network_urc_solSigStren.ssRsrp);
205 urc_p->readInt32(&network_urc_solSigStren.ssRsrq);
206 urc_p->readInt32(&network_urc_solSigStren.ssSinr);
207 urc_p->readInt32(&network_urc_solSigStren.csiRsrp);
208 urc_p->readInt32(&network_urc_solSigStren.csiRsrq);
209 urc_p->readInt32(&network_urc_solSigStren.csiSinr);
210 NR_sum = (network_urc_solSigStren.ssRsrp) + (network_urc_solSigStren.ssRsrq) + (network_urc_solSigStren.ssSinr) + (network_urc_solSigStren.csiRsrp)+\
211 (network_urc_solSigStren.csiRsrq) + (network_urc_solSigStren.csiSinr);
rjw7e50cd32022-01-18 18:30:37 +0800212 if(NR_sum != 0)
213 {
rjwbc8a05f2022-03-02 15:23:11 +0800214 network_urc_solSigStren.nr_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800215 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800216 network_urc_solSigStren.nr_sig_valid = 0;
rjw78d04502022-02-24 13:37:11 +0800217 }
rjwbc8a05f2022-03-02 15:23:11 +0800218 if(network_urc_solSigStren.nr_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800219 {
220 LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\
rjwbc8a05f2022-03-02 15:23:11 +0800221 network_urc_solSigStren.ssRsrp,network_urc_solSigStren.ssRsrq,network_urc_solSigStren.ssSinr, \
222 network_urc_solSigStren.csiRsrp,network_urc_solSigStren.csiRsrq,network_urc_solSigStren.csiSinr);
rjw7e50cd32022-01-18 18:30:37 +0800223 }
rjwbc8a05f2022-03-02 15:23:11 +0800224 network_wait_urc_id = urc_id;
225 send_signal_changes();
rjw7e50cd32022-01-18 18:30:37 +0800226 }
227 }
228 }
229 }
230}
231
232
233int lynq_server_socket_start()
234{
rjwbc8a05f2022-03-02 15:23:11 +0800235 network_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
236 if(-1 == network_sock_fd)
rjw7e50cd32022-01-18 18:30:37 +0800237 {
238 LYERRLOG("socket open error");
239 return -1;
240 }
rjwbc8a05f2022-03-02 15:23:11 +0800241 LYINFLOG("network_sock_fd = %d",network_sock_fd);
rjw7e50cd32022-01-18 18:30:37 +0800242
rjwbc8a05f2022-03-02 15:23:11 +0800243 memset(&network_addr_serv, 0, sizeof(network_addr_serv));
244 network_addr_serv.sin_family = AF_INET;
245 network_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);
246 network_addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);
247 network_len_addr_serv = sizeof(network_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800248 return 0;
249}
250
251int lynq_urc_socket_start()
252{
253 pthread_t tid;
254 pthread_attr_t attr;
255 int on = 1;
rjwbc8a05f2022-03-02 15:23:11 +0800256 network_urc_sock_fd = -1;
rjw7e50cd32022-01-18 18:30:37 +0800257 int ret = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800258 network_len_urc_addr_serv = sizeof(sockaddr_in);
259 network_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
260 if (network_urc_sock_fd <0){
rjw7e50cd32022-01-18 18:30:37 +0800261 LYERRLOG("urc socket error");
262 ret = -1;
263 }
rjwbc8a05f2022-03-02 15:23:11 +0800264 network_urc_addr_serv.sin_family = AF_INET;
265 network_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
266 network_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
rjw7e50cd32022-01-18 18:30:37 +0800267 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
rjwbc8a05f2022-03-02 15:23:11 +0800268 ret = setsockopt(network_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
rjw7e50cd32022-01-18 18:30:37 +0800269 if(ret <0)
270 {
271 LYERRLOG("urc socket set error");
272 return -1;
273 }
rjwbc8a05f2022-03-02 15:23:11 +0800274 ret = bind(network_urc_sock_fd ,(struct sockaddr*)&network_urc_addr_serv, sizeof(network_urc_addr_serv));
rjw7e50cd32022-01-18 18:30:37 +0800275 if(ret <0)
276 {
277 LYERRLOG("urc socket bind error");
278 return -1;
279 }
280 pthread_attr_init(&attr);
281 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
rjwbc8a05f2022-03-02 15:23:11 +0800282 ret = pthread_create(&tid,&attr,thread_urc_recv,(void *)network_urc_sock_fd);
rjw7e50cd32022-01-18 18:30:37 +0800283 if(ret <0)
284 {
285 LYERRLOG("urc pthread create error");
286 return -1;
287 }
288 LYINFLOG("urc start success");
289 return 0;
290}
291
292int lynq_network_init(int utoken){
rjw22947c22022-03-15 09:21:29 +0800293 if(g_lynq_network_init_flag == 1)
294 {
295 LYERRLOG("init twice is not allowed");
296 return -1;
297 }
298 g_lynq_network_init_flag = 1;
rjw7e50cd32022-01-18 18:30:37 +0800299 if(utoken <0){
300 LYERRLOG("init err");
301 return -1;
302 }
rjwbc8a05f2022-03-02 15:23:11 +0800303 network_urc_status = 1;
304 network_Global_uToken = utoken;
rjw7e50cd32022-01-18 18:30:37 +0800305 LYLOGSET(LOG_INFO);
306 LYLOGEINIT(USER_LOG_TAG);
307 int ret = 0;
308
309 ret = lynq_server_socket_start();
310 if(ret !=0)
311 {
312 LYERRLOG("init socket client fail!!!");
313 return -1;
314 }
315 ret = lynq_urc_socket_start();
316 if(ret != 0)
317 {
318 LYERRLOG("init socket urc fail!!!");
319 return -1;
320 }
rjw9c301f82022-05-25 09:10:33 +0800321 pthread_mutex_init(&g_lynq_network_sendto_mutex, NULL);
rjw7e50cd32022-01-18 18:30:37 +0800322 return 0;
323}
324
325int strUpper(char * str)
326{
327 int i=0;
328 while(1)
329 {
330 if(str[i]=='\0')
331 {
332 break;
333 }
334 if(str[i]>='a'&&str[i]<='z')
335 {
336 str[i]=str[i]-32;
337 }
338 i++;
339 }
340 return 0;
341}
342
rjw62a60152022-06-09 17:43:01 +0800343int copyCellInfoList(Parcel &p,uint64_t *cellinfo,int *tac,int *earfcn)
rjw7e50cd32022-01-18 18:30:37 +0800344{
345 int32_t v=0;
346 int64_t v6=0;
347 if(NULL == cellinfo)
348 {
349 LYERRLOG("*cellinfo error");
350 }
351
352 int nothing = 0;
rjw62a60152022-06-09 17:43:01 +0800353 int tmp_uint64 = 0;
rjw7e50cd32022-01-18 18:30:37 +0800354 p.readInt32(&v);
355 RIL_CellInfoType cellinfoType = RIL_CellInfoType(v);
356 p.readInt32(&nothing);
357 // cellinfo->cellinfo.cellInfoType = RIL_CellInfoType(v);
358 // p.readInt32(&cellinfo->cellinfo.registered);
359 p.readInt32(&v);
360 // cellinfo->cellinfo.timeStampType = RIL_TimeStampType(v);
361 p.readInt64(&v6);
362 // cellinfo->cellinfo.timeStamp = v6;
363 switch(cellinfoType) {
364 case RIL_CELL_INFO_TYPE_GSM: {
365 p.readInt32(&nothing);
366 p.readInt32(&nothing);
367 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800368 p.readInt32(&tmp_uint64);
rjw7e50cd32022-01-18 18:30:37 +0800369 p.readInt32(&nothing);
370 p.readInt32(&nothing);
371 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800372 *cellinfo = (uint64_t)tmp_uint64;
rjw61974852022-05-17 16:30:32 +0800373 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800374 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800375 break;
376 }
377 case RIL_CELL_INFO_TYPE_WCDMA: {
378 p.readInt32(&nothing);
379 p.readInt32(&nothing);
380 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800381 p.readInt32(&tmp_uint64);
rjw7e50cd32022-01-18 18:30:37 +0800382 p.readInt32(&nothing);
383 p.readInt32(&nothing);
384 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800385 *cellinfo = (uint64_t)tmp_uint64;
rjw4200a082022-05-17 17:58:35 +0800386 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800387 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800388 break;
389 }
390 case RIL_CELL_INFO_TYPE_CDMA: {
391 p.readInt32(&nothing);
392 p.readInt32(&nothing);
393 p.readInt32(&nothing);
394 p.readInt32(&nothing);
395 p.readInt32(&nothing);
396 p.readInt32(&nothing);
397 p.readInt32(&nothing);
398 p.readInt32(&nothing);
399 p.readInt32(&nothing);
400 p.readInt32(&nothing);
401 cellinfo = 0;
rjw61974852022-05-17 16:30:32 +0800402 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800403 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800404 break;
405 }
406 case RIL_CELL_INFO_TYPE_LTE: {
407 p.readInt32(&nothing);
408 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800409 p.readInt32(&tmp_uint64);
rjw7e50cd32022-01-18 18:30:37 +0800410 p.readInt32(&nothing);
rjw61974852022-05-17 16:30:32 +0800411 p.readInt32(tac);
rjwa8011682022-05-31 17:31:28 +0800412 p.readInt32(earfcn);
rjw7e50cd32022-01-18 18:30:37 +0800413 p.readInt32(&nothing);
414 p.readInt32(&nothing);
415 p.readInt32(&nothing);
416 p.readInt32(&nothing);
417 p.readInt32(&nothing);
418 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800419 *cellinfo = (uint64_t)tmp_uint64;
rjw7e50cd32022-01-18 18:30:37 +0800420 break;
421 }
422 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
423 p.readInt32(&nothing);
424 p.readInt32(&nothing);
425 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800426 p.readInt32(&tmp_uint64);
rjw7e50cd32022-01-18 18:30:37 +0800427 p.readInt32(&nothing);
428 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800429 *cellinfo = (uint64_t)tmp_uint64;
rjwa8011682022-05-31 17:31:28 +0800430 tac = &nothing;
431 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800432 break;
433 }
434 case RIL_CELL_INFO_TYPE_NR: {
435 p.readInt32(&nothing);
436 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800437 p.readUint64(cellinfo);
rjw7e50cd32022-01-18 18:30:37 +0800438 p.readInt32(&nothing);
rjw61974852022-05-17 16:30:32 +0800439 p.readInt32(tac);
rjwa8011682022-05-31 17:31:28 +0800440 p.readInt32(earfcn);
rjw7e50cd32022-01-18 18:30:37 +0800441 p.readInt32(&nothing);
442 p.readInt32(&nothing);
443 p.readInt32(&nothing);
444 p.readInt32(&nothing);
445 p.readInt32(&nothing);
446 p.readInt32(&nothing);
447 break;
448 }
449 }
rjw62a60152022-06-09 17:43:01 +0800450 LYINFLOG("CID in fUNC :%llu",*cellinfo);
rjwa8011682022-05-31 17:31:28 +0800451 LYINFLOG("tac in fUNC :%d",*tac);
452 LYINFLOG("earfcn in fUNC :%d",*earfcn);
rjw7e50cd32022-01-18 18:30:37 +0800453 return 0;
454}
455
456int lynq_network_deinit(void){
rjw22947c22022-03-15 09:21:29 +0800457 if (g_lynq_network_init_flag == 0)
458 {
459 LYERRLOG("deinit twice is not allowed");
460 return -1;
461 }
462 if (network_sock_fd > 0)
463 {
464 close(network_sock_fd);
465 }
466 g_lynq_network_init_flag = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800467 network_urc_status = 0;
rjw7e50cd32022-01-18 18:30:37 +0800468 return 0;
469}
470
471static char * lynqStrdupReadString(Parcel &p) {
472 size_t stringlen;
473 const char16_t *s16;
474
475 s16 = p.readString16Inplace(&stringlen);
476 return strndup16to8(s16, stringlen);
477}
478
479int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc)
480{
481 int ret = -1;
482 if(NULL == OperatorFN||NULL == OperatorSH|| NULL == MccMnc)
483 return ret;
484 int send_num = 0;
485 int recv_num = 0;
486 int num = 0;
487 lynq_client_t client_t;
488 char res_data[LYNQ_REQUEST_PARAM_BUF] = {0};
rjw02a50422022-01-25 14:57:53 +0800489 char *resp[LYNQ_RESP_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800490 memset(&client_t,0,sizeof(client_t));
491 client_t.request = RIL_REQUEST_OPERATOR;
492 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800493 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800494 memset(client_t.param,0,sizeof(client_t.param));
495
rjw9c301f82022-05-25 09:10:33 +0800496 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800497 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800498 if(send_num<0)
499 {
500 LYERRLOG("sendto error:");
501 return ret;
502 }
503
504 //get data
rjwbc8a05f2022-03-02 15:23:11 +0800505 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +0800506 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +0800507 if(recv_num == 0 ||recv_num <0)
508 {
509 LYERRLOG("recvfrom error");
510 return -1;
511 }
512 Parcel p;
513 p.setData((uint8_t *)res_data,sizeof(res_data));
514 p.setDataPosition(0);
515 if(p.dataAvail() > 0)
516 {
517 p.readInt32(&response.resp_type);
518 p.readInt32(&response.request);
519 p.readInt32(&response.slot_id);
520 p.readInt32(&response.error);
521 if(response.error != 0)
522 {
523 LYERRLOG("response return error");
524 return response.error;
525 }
526 p.readInt32(&num);
527 if(num == 0)
528 {
529 LYERRLOG("no paramters");
530 }else{
531 for(int i = 0; i<num;i++)
532 {
533 resp[i] = lynqStrdupReadString(p);
534 }
535 if(NULL != resp[0])
536 {
rjw02a50422022-01-25 14:57:53 +0800537 strcpy(OperatorFN,resp[0]);
rjw7e50cd32022-01-18 18:30:37 +0800538 }
539 if(NULL != resp[1])
540 {
rjw02a50422022-01-25 14:57:53 +0800541 strcpy(OperatorSH,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +0800542 }
543 if(NULL != resp[2])
544 {
rjw02a50422022-01-25 14:57:53 +0800545 strcpy(MccMnc,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +0800546 }
547 }
548 }
549 return response.error;
550}
551
552int lynq_query_network_selection_mode(int *netselMode)
553{
554 int ret = -1;
555 if(NULL == netselMode)
556 return ret;
557 int send_num = 0;
558 int recv_num = 0;
559 int readnum = 0;
560 lynq_client_t client_t;
561 char res_data[LYNQ_REC_BUF] = {0};
562 memset(&client_t,0,sizeof(client_t));
563 client_t.request = RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE;
564 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800565 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800566
567 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +0800568 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800569 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800570 if(send_num<0)
571 {
572 LYERRLOG("sendto error:");
573 return -1;
574 }
575
576 //get data
rjwbc8a05f2022-03-02 15:23:11 +0800577 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +0800578 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +0800579 if(recv_num == 0 ||recv_num <0)
580 {
581 LYERRLOG("recvfrom error");
582 return -1;
583 }
584 Parcel p;
585 p.setData((uint8_t *)res_data,sizeof(res_data));
586 p.setDataPosition(0);
587 if(p.dataAvail() > 0)
588 {
589 p.readInt32(&response.resp_type);
590 p.readInt32(&response.request);
591 p.readInt32(&response.slot_id);
592 p.readInt32(&response.error);
593 if(response.error != 0)
594 {
595 LYERRLOG("response return error");
596 return response.error;
597 }
598 p.readInt32(&readnum);
599 p.readInt32(netselMode);
600 }
601 return response.error;
602}
603
604int lynq_set_network_selection_mode(const char *mode,const char* mccmnc)
605{
606 int ret = -1;
rjw78d04502022-02-24 13:37:11 +0800607 if(NULL == mode)
rjw7e50cd32022-01-18 18:30:37 +0800608 return ret;
rjw78d04502022-02-24 13:37:11 +0800609 if(strlen(mode) == 0)
610 {
611 return ret;
612 }
rjw7e50cd32022-01-18 18:30:37 +0800613 int send_num = 0;
614 lynq_client_t client_t;
615 int recv_num = 0;
616 char res_data[LYNQ_REC_BUF] = {0};
617 memset(&client_t,0,sizeof(client_t));
618 if(!strcmp(mode,"Auto"))
619 {
620 client_t.request = RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC;
621 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800622 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800623 memset(client_t.param,0,sizeof(client_t.param));
624 }else if(!strcmp(mode,"Manual")){
rjw78d04502022-02-24 13:37:11 +0800625 if(mccmnc == NULL)
626 {
627 LYERRLOG("mccmnc is NULL!!!");
628 return ret;
629 }
630 if(strlen(mccmnc) == 0)
631 {
632 LYERRLOG("mccmnc strlen is 0!!!");
633 return ret;
634 }
rjw7e50cd32022-01-18 18:30:37 +0800635 client_t.request = RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL;
636 client_t.paramLen = 1;
rjwbc8a05f2022-03-02 15:23:11 +0800637 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800638 sprintf(client_t.param,"%s",mccmnc);
rjwcdd83ae2022-01-22 14:10:42 +0800639 }else{
640 LYERRLOG("request error");
641 return ret;
rjw7e50cd32022-01-18 18:30:37 +0800642 }
643
rjw9c301f82022-05-25 09:10:33 +0800644 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800645 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800646 if(send_num<0)
647 {
648 LYERRLOG("sendto error:");
649 return ret;
650 }
651
rjwbc8a05f2022-03-02 15:23:11 +0800652 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +0800653 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +0800654 if(recv_num == 0 ||recv_num <0)
655 {
656 LYERRLOG("recvfrom error");
657 return -1;
658 }
659
660 Parcel p;
661 p.setData((uint8_t *)res_data,sizeof(res_data));
662 p.setDataPosition(0);
663 if(p.dataAvail() > 0)
664 {
665 p.readInt32(&response.resp_type);
666 p.readInt32(&response.request);
667 p.readInt32(&response.slot_id);
668 p.readInt32(&response.error);
669 }
670 return response.error;
671}
672
673int lynq_query_available_network(char *OperatorFN,char *OperatorSH,char *MccMnc,char * NetStatus)
674{
675 int ret = -1;
676 if(NULL == OperatorFN||NULL == OperatorSH||NULL == MccMnc||NULL == NetStatus)
677 return ret;
678 int send_num = 0;
679 int recv_num = 0;
680 char res_data[LYNQ_REC_BUF] = {0};
681 char *resp[128];
682 lynq_client_t client_t;
683 memset(&client_t,0,sizeof(client_t));
684 client_t.request = RIL_REQUEST_QUERY_AVAILABLE_NETWORKS;
685 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800686 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800687 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +0800688 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800689 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800690 if(send_num<0)
691 {
692 LYERRLOG("sendto error:");
693 return ret;
694 }
695
696 //get data
rjwbc8a05f2022-03-02 15:23:11 +0800697 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +0800698 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +0800699 if(recv_num == 0 ||recv_num <0)
700 {
701 LYERRLOG("recvfrom error");
702 return -1;
703 }
704 Parcel p;
705 p.setData((uint8_t *)res_data,sizeof(res_data));
706 p.setDataPosition(0);
707 if(p.dataAvail() > 0)
708 {
709 p.readInt32(&response.resp_type);
710 p.readInt32(&response.request);
711 p.readInt32(&response.slot_id);
712 p.readInt32(&response.error);
713 if(response.error != 0)
714 {
715 LYERRLOG("response return error");
716 return response.error;
717 }
718 int num =p.readInt32();
719 if(num == 0)
720 {
721 LYERRLOG("no paramters");
722 }else{
723 for(int i = 0; i<num;i++)
724 {
725 resp[i] = lynqStrdupReadString(p);
726 }
727 if(NULL != resp[0])
728 {
rjw02a50422022-01-25 14:57:53 +0800729 strcpy(OperatorFN,resp[0]);
rjw7e50cd32022-01-18 18:30:37 +0800730 }
731 if(NULL != resp[1])
732 {
rjw02a50422022-01-25 14:57:53 +0800733 strcpy(OperatorSH,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +0800734 }
735 if(NULL != resp[2])
736 {
rjw02a50422022-01-25 14:57:53 +0800737 strcpy(MccMnc,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +0800738 }
739 if(NULL != resp[3])
740 {
rjw02a50422022-01-25 14:57:53 +0800741 strcpy(NetStatus,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +0800742 }
743 }
744 }
745 return response.error;
746}
747
rjw4544e132022-04-01 15:00:26 +0800748int lynq_query_registration_state(const char *type,int* regState,int* imsRegState,char * LAC,char * CID,int *netType,int *radioTechFam,int *netRejected)
rjw7e50cd32022-01-18 18:30:37 +0800749{
750 int ret = -1;
rjwd98d5872022-04-09 13:50:58 +0800751 if(NULL == type || NULL ==regState ||NULL ==imsRegState ||NULL ==LAC ||NULL ==CID ||NULL ==netType ||NULL ==radioTechFam || NULL == netRejected)
rjw7e50cd32022-01-18 18:30:37 +0800752 return ret;
753 int send_num = 0;
754 int recv_num = 0;
755 int num = 0;
756 char str[LYNQ_TYPE_BUF];
757 char res_data[LYNQ_REC_BUF] = {0};
rjwcdd83ae2022-01-22 14:10:42 +0800758 char *resp[LYNQ_RESP_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800759 lynq_client_t client_t;
760 memset(&client_t,0,sizeof(client_t));
761 if(strlen(type)>LYNQ_TYPE_BUF)
762 {
763 LYERRLOG("[%s]the parameter is inavaliable !",__FUNCTION__);
764 }
765 memcpy(str,type,strlen(type)+1);
766 strUpper(str);
767 if(!strcmp(str,"VOICE"))
768 {
769 client_t.request = RIL_REQUEST_VOICE_REGISTRATION_STATE;
770 }else if(!strcmp(str,"DATA")){
771 client_t.request = RIL_REQUEST_DATA_REGISTRATION_STATE;
772 }else if(!strcmp(str,"IMS")){
773 client_t.request = RIL_REQUEST_IMS_REGISTRATION_STATE;
774 }else{
775 LYERRLOG("request error");
776 return ret;
777 }
778 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800779 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800780 memset(client_t.param,0,sizeof(client_t.param));
781
rjw9c301f82022-05-25 09:10:33 +0800782 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800783 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800784 if(send_num<0)
785 {
786 LYERRLOG("sendto error:");
787 return ret;
788 }
789
790 //get data
rjwbc8a05f2022-03-02 15:23:11 +0800791 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +0800792 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +0800793 if(recv_num == 0 ||recv_num <0)
794 {
795 LYERRLOG("recvfrom error");
796 return -1;
797 }
798 Parcel p;
799 p.setData((uint8_t *)res_data,sizeof(res_data));
800 p.setDataPosition(0);
801 if(p.dataAvail() > 0)
802 {
803 p.readInt32(&response.resp_type);
804 p.readInt32(&response.request);
805 p.readInt32(&response.slot_id);
806 p.readInt32(&response.error);
807 if(response.error != 0)
808 {
809 LYERRLOG("response return error");
810 return response.error;
811 }
812 if(!strcmp(str,"VOICE"))
813 {
814 p.readInt32(&num);
815 if(num == 15)
816 {
817 *regState = atoi(lynqStrdupReadString(p));
818 lynqStrdupReadString(p);
819 lynqStrdupReadString(p);
820 *netType = atoi(lynqStrdupReadString(p));
rjw4544e132022-04-01 15:00:26 +0800821 lynqStrdupReadString(p);
822 lynqStrdupReadString(p);
823 lynqStrdupReadString(p);
824 lynqStrdupReadString(p);
825 lynqStrdupReadString(p);
826 lynqStrdupReadString(p);
827 lynqStrdupReadString(p);
828 lynqStrdupReadString(p);
829 lynqStrdupReadString(p);
830 lynqStrdupReadString(p);
831 *netRejected = atoi(lynqStrdupReadString(p));
rjw7e50cd32022-01-18 18:30:37 +0800832 }
833 }else if(!strcmp(str,"DATA")){
834 p.readInt32(&num);
835 if(num == 11)
836 {
837 *regState = atoi(lynqStrdupReadString(p));
rjwcdd83ae2022-01-22 14:10:42 +0800838 resp[0] = lynqStrdupReadString(p);
rjw02a50422022-01-25 14:57:53 +0800839 strcpy(LAC,resp[0]);
rjwcdd83ae2022-01-22 14:10:42 +0800840
841 resp[1] = lynqStrdupReadString(p);
rjw02a50422022-01-25 14:57:53 +0800842 strcpy(CID,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +0800843 *netType = atoi(lynqStrdupReadString(p));
844 }
845
846 }else if(!strcmp(str,"IMS")){
847 p.readInt32(&num);
848 if(num == 2)
849 {
850 p.readInt32(imsRegState);
851 p.readInt32(radioTechFam);
852 }
853 }else{
854 LYERRLOG("request error");
855 return ret;
856 }
857 }
858 return response.error;
859}
860
861int lynq_query_prefferred_networktype(int *preNetType)
862{
863 int ret = -1;
864 int send_num = 0;
865 int recv_num = 0;
866 int num = 0;
867 char res_data[LYNQ_REC_BUF] = {0};
868 lynq_client_t client_t;
869 memset(&client_t,0,sizeof(client_t));
870 client_t.request = RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE;
871 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800872 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800873 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +0800874 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800875 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800876 if(send_num<0)
877 {
878 LYERRLOG("sendto error:");
879 return ret;
880 }
881
882 //get data
rjwbc8a05f2022-03-02 15:23:11 +0800883 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +0800884 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +0800885 if(recv_num == 0 ||recv_num <0)
886 {
887 LYERRLOG("recvfrom error");
888 return -1;
889 }
890 Parcel p;
891 p.setData((uint8_t *)res_data,sizeof(res_data));
892 p.setDataPosition(0);
893 if(p.dataAvail() > 0)
894 {
895 p.readInt32(&response.resp_type);
896 p.readInt32(&response.request);
897 p.readInt32(&response.slot_id);
898 p.readInt32(&response.error);
899 if(response.error != 0)
900 {
901 LYERRLOG("response return error");
902 return response.error;
903 }
904 p.readInt32(&num);
905 p.readInt32(preNetType);
906 }
907 return response.error;
908}
909
910int lynq_set_prefferred_networktype(const int preffertype)
911{
912 int ret = -1;
913 if(preffertype < 0||preffertype >33)
914 return ret;
915 int send_num = 0;
916 lynq_client_t client_t;
917 int recv_num = 0;
918 char res_data[LYNQ_REC_BUF] = {0};
919 memset(&client_t,0,sizeof(client_t));
920 client_t.request = RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE;
921 client_t.paramLen = 1;
rjwbc8a05f2022-03-02 15:23:11 +0800922 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800923 sprintf(client_t.param,"%d",preffertype);
rjw9c301f82022-05-25 09:10:33 +0800924 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800925 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800926 if(send_num<0)
927 {
928 LYERRLOG("sendto error:");
929 return ret;
930 }
931
rjwbc8a05f2022-03-02 15:23:11 +0800932 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +0800933 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +0800934 if(recv_num == 0 ||recv_num <0)
935 {
936 LYERRLOG("recvfrom error");
937 return -1;
938 }
939
940 Parcel p;
941 p.setData((uint8_t *)res_data,sizeof(res_data));
942 p.setDataPosition(0);
943 if(p.dataAvail() > 0)
944 {
945 p.readInt32(&response.resp_type);
946 p.readInt32(&response.request);
947 p.readInt32(&response.slot_id);
948 p.readInt32(&response.error);
949 }
950
951 return response.error;
952
953}
954
rjw62a60152022-06-09 17:43:01 +0800955int lynq_query_cell_info(uint64_t cellinfo[CELLINFO_MAX_NUM],int tac[CELLINFO_MAX_NUM],int earfcn[CELLINFO_MAX_NUM],int * realNum)
rjw7e50cd32022-01-18 18:30:37 +0800956{
957 int ret = -1;
958 if(NULL == realNum)
959 return ret;
960 int send_num = 0;
961 int recv_num = 0;
962 int num = 0;
963 char res_data[LYNQ_REC_BUF] = {0};
964 lynq_client_t client_t;
965 memset(&client_t,0,sizeof(client_t));
966 client_t.request = RIL_REQUEST_GET_CELL_INFO_LIST;
967 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800968 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800969 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +0800970 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800971 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800972 if(send_num<0)
973 {
974 LYERRLOG("sendto error:");
975 return ret;
976 }
977
978 //get data
rjwbc8a05f2022-03-02 15:23:11 +0800979 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +0800980 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +0800981 if(recv_num == 0 ||recv_num <0)
982 {
983 LYERRLOG("recvfrom error");
984 return -1;
985 }
986 Parcel p;
987 p.setData((uint8_t *)res_data,sizeof(res_data));
988 p.setDataPosition(0);
989 if(p.dataAvail() > 0)
990 {
991 p.readInt32(&response.resp_type);
992 p.readInt32(&response.request);
993 p.readInt32(&response.slot_id);
994 p.readInt32(&response.error);
995 if(response.error != 0)
996 {
997 LYERRLOG("response return error");
998 return response.error;
999 }
1000 p.readInt32(&num);
1001 LYINFLOG("cell info num:%d",num);
1002 *realNum = num;
1003 for(int i = 0;i<num;i++)
1004 {
rjwa8011682022-05-31 17:31:28 +08001005 copyCellInfoList(p,&cellinfo[i],&tac[i],&earfcn[i]);
rjw7e50cd32022-01-18 18:30:37 +08001006 }
1007 }
1008 return response.error;
1009
1010}
1011
1012int lynq_set_unsol_cell_info_listrate(const int rate)
1013{
1014 int ret = -1;
1015 int send_num = 0;
1016 int recv_num = 0;
1017 char res_data[LYNQ_REC_BUF] = {0};
1018 lynq_client_t client_t;
1019 memset(&client_t,0,sizeof(client_t));
1020 client_t.request = RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE;
1021 client_t.paramLen = 1;
rjwbc8a05f2022-03-02 15:23:11 +08001022 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001023 sprintf(client_t.param,"%d",rate);
rjw9c301f82022-05-25 09:10:33 +08001024 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001025 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001026 if(send_num<0)
1027 {
1028 LYERRLOG("sendto error:");
1029 return ret;
1030 }
1031
rjw9c301f82022-05-25 09:10:33 +08001032
rjwbc8a05f2022-03-02 15:23:11 +08001033 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +08001034 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +08001035 if(recv_num == 0 ||recv_num <0)
1036 {
1037 LYERRLOG("recvfrom error");
1038 return -1;
1039 }
1040
1041 Parcel p;
1042 p.setData((uint8_t *)res_data,sizeof(res_data));
1043 p.setDataPosition(0);
1044 if(p.dataAvail() > 0)
1045 {
1046 p.readInt32(&response.resp_type);
1047 p.readInt32(&response.request);
1048 p.readInt32(&response.slot_id);
1049 p.readInt32(&response.error);
1050 }
1051
1052 return response.error;
1053}
1054
1055int lynq_set_band_mode(const int bandmode)
1056{
1057 int ret = -1;
1058 int send_num = 0;
1059 int recv_num = 0;
1060 char res_data[LYNQ_REC_BUF] = {0};
1061 lynq_client_t client_t;
1062 memset(&client_t,0,sizeof(client_t));
1063 client_t.request = RIL_REQUEST_SET_BAND_MODE;
1064 client_t.paramLen = 1;
rjwbc8a05f2022-03-02 15:23:11 +08001065 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001066 sprintf(client_t.param,"%d",bandmode);
rjw9c301f82022-05-25 09:10:33 +08001067 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001068 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001069 if(send_num<0)
1070 {
1071 LYERRLOG("sendto error:");
1072 return ret;
1073 }
1074
rjwbc8a05f2022-03-02 15:23:11 +08001075 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +08001076 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +08001077 if(recv_num == 0 ||recv_num <0)
1078 {
1079 LYERRLOG("recvfrom error");
1080 return -1;
1081 }
1082
1083 Parcel p;
1084 p.setData((uint8_t *)res_data,sizeof(res_data));
1085 p.setDataPosition(0);
1086 if(p.dataAvail() > 0)
1087 {
1088 p.readInt32(&response.resp_type);
1089 p.readInt32(&response.request);
1090 p.readInt32(&response.slot_id);
1091 p.readInt32(&response.error);
1092 }
1093
1094 return response.error;
1095}
1096
1097int lynq_query_available_bandmode(int availBanMode[])
1098{
1099 int ret = -1;
1100 if(NULL == availBanMode)
1101 return ret;
1102 int send_num = 0;
1103 int recv_num = 0;
1104 int num = 0;
1105 int res = 0;
1106 char res_data[LYNQ_REC_BUF] = {0};
1107 lynq_client_t client_t;
1108 memset(&client_t,0,sizeof(client_t));
1109 client_t.request = RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE;
1110 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +08001111 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001112 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +08001113 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001114 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001115 if(send_num<0)
1116 {
1117 LYERRLOG("sendto error:");
1118 return ret;
1119 }
1120
1121 //get data
rjwbc8a05f2022-03-02 15:23:11 +08001122 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +08001123 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +08001124 if(recv_num == 0 ||recv_num <0)
1125 {
1126 LYERRLOG("recvfrom error");
1127 return -1;
1128 }
rjw78d04502022-02-24 13:37:11 +08001129 for(int i = 0;i<10;i++)
rjw7e50cd32022-01-18 18:30:37 +08001130 {
1131 availBanMode[i]=0;
1132 }
1133 Parcel p;
1134 p.setData((uint8_t *)res_data,sizeof(res_data));
1135 p.setDataPosition(0);
1136
1137 if(p.dataAvail() > 0)
1138 {
1139 p.readInt32(&response.resp_type);
1140 p.readInt32(&response.request);
1141 p.readInt32(&response.slot_id);
1142 p.readInt32(&response.error);
1143 if(response.error != 0)
1144 {
1145 LYERRLOG("response return error");
1146 return response.error;
1147 }
1148 p.readInt32(&num);
1149 LYINFLOG("num = %d",num);
1150 availBanMode[0] = num;
1151 for(int i=1 ;i<=num;i++)
1152 {
1153 p.readInt32(&res);
1154 availBanMode[i]=res;
1155 }
1156 }
1157
1158 return response.error;
1159}
1160
1161int lynq_radio_on(const int data)
1162{
1163 int ret = -1;
1164 if(data < 0)
1165 return ret;
1166 int send_num = 0;
1167 char res_data[LYNQ_REC_BUF] = {0};
1168 int recv_num = 0;
1169 lynq_client_t client_t;
1170 memset(&client_t,0,sizeof(client_t));
1171 client_t.request = RIL_REQUEST_RADIO_POWER;
1172 client_t.paramLen = 1;
rjwbc8a05f2022-03-02 15:23:11 +08001173 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001174 sprintf(client_t.param,"%d",data);
rjw9c301f82022-05-25 09:10:33 +08001175 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001176 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001177 if(send_num<0)
1178 {
1179 LYERRLOG("sendto error:");
1180 return ret;
1181 }
1182
rjwbc8a05f2022-03-02 15:23:11 +08001183 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +08001184 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +08001185 if(recv_num == 0 ||recv_num <0)
1186 {
1187 LYERRLOG("recvfrom error");
1188 return -1;
1189 }
1190
1191 Parcel p;
1192 p.setData((uint8_t *)res_data,sizeof(res_data));
1193 p.setDataPosition(0);
1194 if(p.dataAvail() > 0)
1195 {
1196 p.readInt32(&response.resp_type);
1197 p.readInt32(&response.request);
1198 p.readInt32(&response.slot_id);
1199 p.readInt32(&response.error);
1200 }
1201
1202 return response.error;
1203}
1204
1205int lynq_query_radio_tech(int* radioTech)
1206{
1207 int ret = -1;
1208 if(NULL == radioTech)
1209 return ret;
1210 int send_num = 0;
1211 int recv_num = 0;
1212 int num = 0;
1213 char res_data[LYNQ_REC_BUF] = {0};
1214 lynq_client_t client_t;
1215 memset(&client_t,0,sizeof(client_t));
1216 client_t.request = RIL_REQUEST_VOICE_RADIO_TECH;
1217 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +08001218 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001219 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +08001220 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001221 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001222 if(send_num<0)
1223 {
1224 LYERRLOG("sendto error:");
1225 return ret;
1226 }
1227
rjwbc8a05f2022-03-02 15:23:11 +08001228 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +08001229 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +08001230 if(recv_num == 0 ||recv_num <0)
1231 {
1232 LYERRLOG("recvfrom error");
1233 return -1;
1234 }
1235 Parcel p;
1236 p.setData((uint8_t *)res_data,sizeof(res_data));
1237 p.setDataPosition(0);
1238
1239 if(p.dataAvail() > 0)
1240 {
1241 p.readInt32(&response.resp_type);
1242 p.readInt32(&response.request);
1243 p.readInt32(&response.slot_id);
1244 p.readInt32(&response.error);
1245 if(response.error != 0)
1246 {
1247 LYERRLOG("response return error");
1248 return response.error;
1249 }
1250 p.readInt32(&num);
1251 p.readInt32(radioTech);
1252 }
1253 return response.error;
1254}
1255
1256int lynq_solicited_signal_strength(signalStrength_t *solSigStren)
1257{
1258 int ret = -1;
1259 if(NULL == solSigStren)
1260 return ret;
1261 int send_num = 0;
1262 int recv_num = 0;
1263 int sum = 0;
1264 int LTE_signalstrength = 0;
1265 int WCDMA_signalstrength = 0;
1266 int none = 0;
1267
1268 char res_data[LYNQ_REC_BUF] = {0};
1269 lynq_client_t client_t;
1270 memset(&client_t,0,sizeof(client_t));
1271 client_t.request = RIL_REQUEST_SIGNAL_STRENGTH;
1272 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +08001273 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001274 memset(client_t.param,0,sizeof(client_t.param));
1275
rjw9c301f82022-05-25 09:10:33 +08001276 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001277 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001278 if(send_num<0)
1279 {
1280 LYERRLOG("sendto error:");
1281 return ret;
1282 }
1283
1284 //get data
rjwbc8a05f2022-03-02 15:23:11 +08001285 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +08001286 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw7e50cd32022-01-18 18:30:37 +08001287 if(recv_num == 0 ||recv_num <0)
1288 {
1289 LYERRLOG("recvfrom error");
1290 return -1;
1291 }
1292 Parcel p;
1293 p.setData((uint8_t *)res_data,sizeof(res_data));
1294 p.setDataPosition(0);
1295
1296 if(p.dataAvail() > 0)
1297 {
1298 p.readInt32(&response.resp_type);
1299 p.readInt32(&response.request);
1300 p.readInt32(&response.slot_id);
1301 p.readInt32(&response.error);
1302 if(response.error != 0)
1303 {
1304 LYERRLOG("response return error");
1305 return response.error;
1306 }
1307
1308 p.readInt32(&solSigStren->rssi);
1309 if((solSigStren->rssi!=99)&&(solSigStren->rssi!=0))
1310 {
1311 solSigStren->gw_sig_valid = 1;
1312 }else{
1313 solSigStren->gw_sig_valid = 0;
1314 }
1315
1316 p.readInt32(&none);
1317 p.readInt32(&none);
1318 p.readInt32(&none);
1319 p.readInt32(&none);
1320 p.readInt32(&none);
1321 p.readInt32(&none);
1322 p.readInt32(&none);
1323 p.readInt32(&LTE_signalstrength);
1324 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
1325 p.readInt32(&solSigStren->rsrp);
1326 p.readInt32(&solSigStren->rsrq);
1327 p.readInt32(&solSigStren->rssnr);
1328 LYINFLOG("LTE_signalstrength:%d",LTE_signalstrength);
1329 if((LTE_signalstrength!=99)&&(LTE_signalstrength!=0))
1330 {
1331 solSigStren->lte_sig_valid = 1;
1332 }else{
1333 solSigStren->lte_sig_valid = 0;
1334 }
1335
1336 p.readInt32(&none);
1337 p.readInt32(&none);
1338 p.readInt32(&none);
1339 p.readInt32(&none);
1340 p.readInt32(&none);
1341 p.readInt32(&WCDMA_signalstrength);
1342 p.readInt32(&none);
1343 p.readInt32(&solSigStren->rscp);
1344 p.readInt32(&solSigStren->ecno);
1345 LYINFLOG("WCDMA_signalstrength:%d",WCDMA_signalstrength);
1346 if((WCDMA_signalstrength!=99)&&(WCDMA_signalstrength!=0))
1347 {
rjwcdd83ae2022-01-22 14:10:42 +08001348 solSigStren->wcdma_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +08001349 }else{
rjwcdd83ae2022-01-22 14:10:42 +08001350 solSigStren->wcdma_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +08001351 }
rjwcdd83ae2022-01-22 14:10:42 +08001352 /*bug fix*/
rjw7e50cd32022-01-18 18:30:37 +08001353 p.readInt32(&solSigStren->ssRsrp);
1354 p.readInt32(&solSigStren->ssRsrq);
1355 p.readInt32(&solSigStren->ssSinr);
1356 p.readInt32(&solSigStren->csiRsrp);
1357 p.readInt32(&solSigStren->csiRsrq);
1358 p.readInt32(&solSigStren->csiSinr);
1359 sum = (solSigStren->ssRsrp) + (solSigStren->ssRsrq) + (solSigStren->ssSinr) + (solSigStren->csiRsrp)+\
1360 (solSigStren->csiRsrq) + (solSigStren->csiSinr);
1361 if(sum != 0)
1362 {
1363 solSigStren->nr_sig_valid = 1;
1364 }else{
1365 LYERRLOG("None of NR signal info");
1366 }
1367 }
1368 return response.error;
1369}
rjwbc8a05f2022-03-02 15:23:11 +08001370
rjw4a5a78d2022-03-10 11:04:24 +08001371int lynq_set_ims(const int ims_mode)
1372{
1373 int ret = -1;
1374 if (ims_mode < 0 || ims_mode > 1)
1375 {
1376 LYERRLOG("incoming ims_mode error");
1377 return ret;
1378 }
1379 int send_num = 0;
1380 char res_data[LYNQ_REC_BUF] = {0};
1381 int recv_num = 0;
1382 lynq_client_t client_t;
1383
1384 memset(&client_t,0,sizeof(client_t));
1385 client_t.request = RIL_REQUEST_SET_IMS_ENABLE;
1386 client_t.paramLen = 1;
1387 client_t.uToken = network_Global_uToken;
1388 sprintf(client_t.param,"%d",ims_mode);
rjw9c301f82022-05-25 09:10:33 +08001389 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjw4a5a78d2022-03-10 11:04:24 +08001390 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
1391 if (send_num<0)
1392 {
1393 LYERRLOG("sendto error:");
1394 return ret;
1395 }
1396
1397 recv_num = recvfrom(network_sock_fd,res_data,sizeof(res_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
rjw9c301f82022-05-25 09:10:33 +08001398 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw4a5a78d2022-03-10 11:04:24 +08001399 if (recv_num == 0 || recv_num < 0)
1400 {
1401 LYERRLOG("recvfrom error");
1402 return -1;
1403 }
1404
1405 Parcel p;
1406 p.setData((uint8_t *)res_data,sizeof(res_data));
1407 p.setDataPosition(0);
1408 if (p.dataAvail() > 0)
1409 {
1410 p.readInt32(&response.resp_type);
1411 p.readInt32(&response.request);
1412 p.readInt32(&response.slot_id);
1413 p.readInt32(&response.error);
1414 }
1415
1416 return response.error;
1417}
1418
1419
rjwbc8a05f2022-03-02 15:23:11 +08001420/*Used to wait for an update signal*/
1421int lynq_wait_signalchanges(int *handle)
1422{
1423 LYDBGLOG("start wait signalchanges info");
1424 if(NULL == handle)
1425 {
1426 LYERRLOG("illegal input");
1427 return -1;
1428 }
1429 wait_signal_changes();
1430 LYDBGLOG("get signalchanges");
1431 *handle = network_wait_urc_id;
1432 return 0;
1433}
1434/*Used to get urc info*/
1435int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)
1436{
1437 LYDBGLOG("start get urc info");
1438 if(handle != 1002&&handle != 1009)
1439 {
1440 LYINFLOG("invalid handle!!!");
1441 return -1;
1442 }
1443 if(NULL == solSigStren && NULL == slot_id)
1444 {
1445 LYINFLOG("incoming solSigStren or slot_id is NULL!!!");
1446 return -1;
1447 }
1448 switch(handle)
1449 {
1450 case 1002: //RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED
1451 {
1452 LYDBGLOG("get state update to VOICE");
1453 *slot_id = network_urc_slot_id;
1454 LYINFLOG("slot_id = %d",network_urc_slot_id);
1455 }
1456 case 1009: //RIL_UNSOL_SIGNAL_STRENGTH
1457 {
1458 LYDBGLOG("get state update to signal info");
1459 solSigStren->gw_sig_valid = network_urc_solSigStren.gw_sig_valid;
1460 solSigStren->rssi = network_urc_solSigStren.rssi;
1461 solSigStren->wcdma_sig_valid = network_urc_solSigStren.wcdma_sig_valid;
1462 solSigStren->rscp = network_urc_solSigStren.rscp;
1463 solSigStren->ecno = network_urc_solSigStren.ecno;
1464 solSigStren->lte_sig_valid = network_urc_solSigStren.lte_sig_valid;
1465 solSigStren->rsrp = network_urc_solSigStren.rsrp;
1466 solSigStren->rsrq = network_urc_solSigStren.rsrq;
1467 solSigStren->rssnr = network_urc_solSigStren.rssnr;
1468 solSigStren->nr_sig_valid = network_urc_solSigStren.nr_sig_valid;
1469 solSigStren->ssRsrp = network_urc_solSigStren.ssRsrp;
1470 solSigStren->ssRsrq = network_urc_solSigStren.ssRsrq;
1471 solSigStren->ssSinr = network_urc_solSigStren.ssSinr;
1472 solSigStren->csiRsrp = network_urc_solSigStren.csiRsrp;
1473 solSigStren->csiRsrq = network_urc_solSigStren.csiRsrq;
1474 solSigStren->csiSinr = network_urc_solSigStren.csiSinr;
1475 }
1476 }
1477 return 0;
rjw4200a082022-05-17 17:58:35 +08001478}