blob: 80c658832892756cb32e51bddded7709cf904ad7 [file] [log] [blame]
Hong_Liuf8e1c032022-12-21 06:02:57 -08001#include <sys/types.h>
2#include <sys/socket.h>
3#include <sys/un.h>
4#include <unistd.h>
5#include <arpa/inet.h>
lld164b022022-03-29 14:01:01 +08006#include <stdio.h>
7#include <stdlib.h>
8#include <signal.h>
9#include <string.h>
10#include <log/log.h>
ll39957ea2022-03-30 16:33:45 +080011#include <pthread.h>
Hong_Liuf8e1c032022-12-21 06:02:57 -080012#include <errno.h>
lld164b022022-03-29 14:01:01 +080013#include "liblog/lynq_deflog.h"
14#include "include/lib_at/lynq_at.h"
15
16#define LYNQ_AT_SERVICE_PORT 8087
17#define OUT_MAX_SIZE 1024
18#define USER_LOG_TAG "LYNQ_AT"
Hong_Liuf8e1c032022-12-21 06:02:57 -080019#define AT_EXTERSION_SOCKET_NAME "/dev/socket/lynq_atsvc_socket_1"
20#define LINE __LINE__
21#define FUNC __FUNCTION__
22static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
ll3b460632022-05-24 16:53:00 +080023typedef enum
24{
25 A_SUCCESS = 0,
26 A_ERROR = -1
27}LYNQ_AT_E;
28
29/*lei add : maybe sento/revc error*/
30int result = A_SUCCESS;
31/*lei add : maybe sento/revc error*/
lld164b022022-03-29 14:01:01 +080032int sockfd = 0;
33char *output = NULL;
ll39957ea2022-03-30 16:33:45 +080034char buffer_at[OUT_MAX_SIZE] = {0};
lld164b022022-03-29 14:01:01 +080035struct sockaddr_in addr_serv;
Hong_Liuf8e1c032022-12-21 06:02:57 -080036struct sockaddr_un addr_server;
37
38
lld164b022022-03-29 14:01:01 +080039socklen_t len;
ll39957ea2022-03-30 16:33:45 +080040LYNQ_AT_CALLBACK tmp = NULL;
Hong_Liuf8e1c032022-12-21 06:02:57 -080041bool connect_state = false;
42#define SOCKET_ZERO 0
43#define SOCKET_SUCC 1
44#define SOCKET_FAIL -1
lld164b022022-03-29 14:01:01 +080045
46/**
ll39957ea2022-03-30 16:33:45 +080047 * @brief Catch exceptions and free malloc's memory
48 *
49 * @param signum Type:[IN] signal
lld164b022022-03-29 14:01:01 +080050 */
ll39957ea2022-03-30 16:33:45 +080051static void signal_handler(int signum)
lld164b022022-03-29 14:01:01 +080052{
ll39957ea2022-03-30 16:33:45 +080053 switch(signum)
54 {
55 case SIGABRT:
56 LYDBGLOG("recv SIGABRT\n");
57 break;
58 case SIGBUS:
59 LYDBGLOG("recv SIGBUS\n");
60 break;
61 case SIGFPE:
62 LYDBGLOG("recv SIGFPE\n");
63 break;
64 case SIGILL:
65 LYDBGLOG("recv SIGILL\n");
66 break;
67 case SIGSEGV:
68 LYDBGLOG("recv SIGSEGV\n");
69 break;
70 default:
71 LYDBGLOG("recv unknown signal\n");
72 break;
73 }
74 if(NULL != output)
75 {
76 free(output);
77 output = NULL;
78 }
79}
80
Hong_Liuf8e1c032022-12-21 06:02:57 -080081
82int socket_local_client (char* name) {
83 //struct sockaddr_un server;
84 //int fd = 0;
85 LYINFLOG("[%d][%s] enter",LINE,FUNC);
86 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
87 if (sockfd < 0)
88 {
89 LYDBGLOG("Can't open stream socket (%s)", name);
90 return -1;
91 }
92 addr_server.sun_family = AF_UNIX;
93 memset(addr_server.sun_path, '\0', sizeof(addr_server.sun_path));
94 strncpy(addr_server.sun_path, name, sizeof(addr_server.sun_path) - 1);
95 if (connect(sockfd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)
96 {
97 close(sockfd);
lle9469072023-02-28 19:02:50 +080098 LYDBGLOG("Can't connect to server side, path: %s, %s", name, strerror(errno));
Hong_Liuf8e1c032022-12-21 06:02:57 -080099 return -1;
100 }
101 LYINFLOG("[%d][%s] connect %s success",LINE,FUNC,name);
102 return sockfd;
103}
104bool send_msg_to_service(int fd,char *msg,int size)
105{
106 LYDBGLOG("[%d][%s] enter",LINE,FUNC);
107 if (fd < 0)
108 {
109 LYDBGLOG("fd invalid when send to atci service. errno = %d", errno);
110 return false;
111 }
112 if(NULL == msg)
113 {
114 LYDBGLOG("atcmd is null.");
115 return false;
116 }
117 int sendLen = send(fd, msg, size, 0);
118 if (sendLen != size)
119 {
120 LYDBGLOG("lose data when send to atci service. errno = %d", errno);
121 return false;
122 }
ll60743bb2023-02-28 16:09:00 +0800123 LYDBGLOG("client send to app demo: %s", msg);
Hong_Liuf8e1c032022-12-21 06:02:57 -0800124 return true;
125}
126
127int atsvc_cmd_recv(int fd, char *buf, int len)
128{
ll60743bb2023-02-28 16:09:00 +0800129 LYINFLOG("[%d][%s] enter",LINE,FUNC);
Hong_Liuf8e1c032022-12-21 06:02:57 -0800130 int ret = 0;
ll60743bb2023-02-28 16:09:00 +0800131 // fd_set rfds;
132 // //FD_CLR(fd, &rfds);
133 // FD_SET(fd, &rfds);
134 // ret = select(fd + 1, &rfds, NULL, NULL, NULL);
135 // if (ret <= 0)
136 // {
137 // LYDBGLOG("acti_cmd_recv client select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
138 // return SOCKET_FAIL;
139 // }
140 // if (FD_ISSET(fd, &rfds))
141 // {
142 LYDBGLOG("[%d][%s] recv before",LINE,FUNC);
Hong_Liuf8e1c032022-12-21 06:02:57 -0800143 ret = recv(fd, buf, len, 0);
ll60743bb2023-02-28 16:09:00 +0800144 LYDBGLOG("[%d][%s] recv after",LINE,FUNC);
Hong_Liuf8e1c032022-12-21 06:02:57 -0800145 if (ret < 0)
146 {
ll60743bb2023-02-28 16:09:00 +0800147 LYDBGLOG("acti_cmd_recv client select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
Hong_Liuf8e1c032022-12-21 06:02:57 -0800148 return SOCKET_FAIL;
149 }
150 else if(ret == 0)
151 {
ll60743bb2023-02-28 16:09:00 +0800152 LYDBGLOG("acti_cmd_recv client recv error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
Hong_Liuf8e1c032022-12-21 06:02:57 -0800153 return SOCKET_ZERO;
154 }
ll60743bb2023-02-28 16:09:00 +0800155 // else
156 // {
157 // //buf[ret] = '\0';
158 // }
159// }
Hong_Liuf8e1c032022-12-21 06:02:57 -0800160 return SOCKET_SUCC;
161}
ll39957ea2022-03-30 16:33:45 +0800162/**
163 * @brief send third cmd to service and receive input,then send output to service
164 *
165 * @param parm
166 * @return void*
167 */
168void *thread_recv(void *parm)
169{
Hong_Liuf8e1c032022-12-21 06:02:57 -0800170 //signal(SIGPIPE, signal_handler);
171 //signal(SIGABRT, signal_handler);
172 //signal(SIGBUS, signal_handler);
173 //signal(SIGFPE, signal_handler);
174 //signal(SIGILL, signal_handler);
175 //signal(SIGSEGV, signal_handler);
176 LYINFLOG("[%d][%s] enter",LINE,FUNC);
ll39957ea2022-03-30 16:33:45 +0800177 int recv = 0;
178 int send = 0;
ll39957ea2022-03-30 16:33:45 +0800179 char at_cmd[100] = {0};
Hong_Liuf8e1c032022-12-21 06:02:57 -0800180 int fd = -1;
181 int ret = 0;
182 fd = socket_local_client(AT_EXTERSION_SOCKET_NAME);
183 if(fd <= 0)
lld164b022022-03-29 14:01:01 +0800184 {
ll60743bb2023-02-28 16:09:00 +0800185 LYDBGLOG("socket_local_client fail\n");
Hong_Liuf8e1c032022-12-21 06:02:57 -0800186 connect_state = false;
187 pthread_mutex_unlock(&s_startupMutex);
ll39957ea2022-03-30 16:33:45 +0800188 return NULL;
lld164b022022-03-29 14:01:01 +0800189 }
Hong_Liuf8e1c032022-12-21 06:02:57 -0800190 int len_buf = strlen(buffer_at);
191 if(!send_msg_to_service(fd,buffer_at,len_buf))
192 {
ll60743bb2023-02-28 16:09:00 +0800193 LYDBGLOG("send_msg_to_service fail\n");
Hong_Liuf8e1c032022-12-21 06:02:57 -0800194 connect_state = false;
195 pthread_mutex_unlock(&s_startupMutex);
196 return NULL;
197 }
198 connect_state = true;
199 pthread_mutex_unlock(&s_startupMutex);
lld164b022022-03-29 14:01:01 +0800200 char *input = NULL;
201 output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE);
202 if(NULL == output)
203 {
ll39957ea2022-03-30 16:33:45 +0800204 LYDBGLOG("thread_recv malloc fail\n");
205 return NULL;
lld164b022022-03-29 14:01:01 +0800206 }
Hong_Liuf8e1c032022-12-21 06:02:57 -0800207 TryNewLink:
208 if(connect_state == false)
209 {
210 if (connect(fd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)
211 {
212 close(fd);
213 LYDBGLOG("Can't connect to server side, path: %s, errno:%d", AT_EXTERSION_SOCKET_NAME, errno);
214 return NULL;
215 }
216 connect_state = true;
217 }
lld164b022022-03-29 14:01:01 +0800218 while (1)
219 {
220 /*receive at cmd*/
Hong_Liuf8e1c032022-12-21 06:02:57 -0800221 memset(at_cmd, 0, sizeof(at_cmd));
222 ret = atsvc_cmd_recv(fd, at_cmd,sizeof(at_cmd));
223 if (ret < 0)
lld164b022022-03-29 14:01:01 +0800224 {
Hong_Liuf8e1c032022-12-21 06:02:57 -0800225 LYDBGLOG("[%d][%s]receive CMD error",LINE,FUNC);
ll39957ea2022-03-30 16:33:45 +0800226 continue;
lld164b022022-03-29 14:01:01 +0800227 }
Hong_Liuf8e1c032022-12-21 06:02:57 -0800228 else if(ret == SOCKET_ZERO)
229 {
230 ALOGE("maybe client socket closed 1. retry new link!");
231 connect_state = false;
232 goto TryNewLink;
233 }
lld164b022022-03-29 14:01:01 +0800234 input = at_cmd;
ll39957ea2022-03-30 16:33:45 +0800235 //begin deal with callback
236 tmp(input, output, OUT_MAX_SIZE);
lld164b022022-03-29 14:01:01 +0800237 LYDBGLOG("lynq_reg_third_at send output to service\n");
Hong_Liuf8e1c032022-12-21 06:02:57 -0800238 if(!send_msg_to_service(fd,output, strlen(output)))
lld164b022022-03-29 14:01:01 +0800239 {
ll39957ea2022-03-30 16:33:45 +0800240 LYDBGLOG("thread_recv send fail\n");
lld164b022022-03-29 14:01:01 +0800241 continue;
242 }
243 }
ll39957ea2022-03-30 16:33:45 +0800244 free(output);
245 output = NULL;
Hong_Liuf8e1c032022-12-21 06:02:57 -0800246 if(fd != 0)
lld164b022022-03-29 14:01:01 +0800247 {
Hong_Liuf8e1c032022-12-21 06:02:57 -0800248 close(fd);
lld164b022022-03-29 14:01:01 +0800249 }
ll39957ea2022-03-30 16:33:45 +0800250 return NULL;
251}
252
253/**
254 * @brief Threads are created to communicate with the server
255 *
256 * @return int
257 */
258int lynq_connect_service_start(void)
259{
Hong_Liuf8e1c032022-12-21 06:02:57 -0800260 LYINFLOG("[%d][%s] enter",LINE,FUNC);
ll39957ea2022-03-30 16:33:45 +0800261 pthread_t lynq_at_tid = -1;
262 int rt = pthread_create(&lynq_at_tid, NULL, thread_recv, NULL);
Hong_Liuf8e1c032022-12-21 06:02:57 -0800263 pthread_mutex_lock(&s_startupMutex);
264 LYINFLOG("[%d][%s] pthread mutex unlock",LINE,FUNC);
265 LYINFLOG(",rt:%d,connect state:%d\n",rt,connect_state);
266 if((connect_state != true) && rt < 0)
ll39957ea2022-03-30 16:33:45 +0800267 {
Hong_Liuf8e1c032022-12-21 06:02:57 -0800268 LYERRLOG("connect fail,rt:%d,connect state:%d\n",rt,connect_state);
ll39957ea2022-03-30 16:33:45 +0800269 return -1;
270 }
271 return 0;
272}
273
274/**
275 * @brief Type:[IN] send third at cmd to service
276 * @param ext_at Type:[IN] input at cmd
277 * @param callback Type:[IN]
278 * @return int
279 */
280int lynq_reg_third_at(const char *ext_at, LYNQ_AT_CALLBACK callback)
281{
282 if(NULL == ext_at || NULL == callback)
283 {
ll3b460632022-05-24 16:53:00 +0800284 return A_ERROR;
ll39957ea2022-03-30 16:33:45 +0800285 }
286 memcpy(buffer_at, ext_at, strlen(ext_at));
287 tmp = callback;
Hong_Liuf8e1c032022-12-21 06:02:57 -0800288 LYLOGSET(LOG_DEBUG);
ll39957ea2022-03-30 16:33:45 +0800289 LYLOGEINIT(USER_LOG_TAG);
290 LYDBGLOG("lynq_reg_third_at start\n");
291 int ret = lynq_connect_service_start();
Hong_Liuf8e1c032022-12-21 06:02:57 -0800292
ll39957ea2022-03-30 16:33:45 +0800293 if(ret != 0)
294 {
295 LYDBGLOG("lynq_connect_service_start start failed\n");
ll3b460632022-05-24 16:53:00 +0800296 return A_ERROR;
ll39957ea2022-03-30 16:33:45 +0800297 }
Hong_Liuf8e1c032022-12-21 06:02:57 -0800298 LYDBGLOG("lynq_connect_service_start success ret:%d\n",ret);
299 return A_SUCCESS;
lld164b022022-03-29 14:01:01 +0800300}
301