blob: a7c6b2e64ca670c5910ab1f3c50113f02a067c89 [file] [log] [blame]
lld164b022022-03-29 14:01:01 +08001#include<sys/types.h>
2#include<sys/socket.h>
3#include<unistd.h>
4#include<arpa/inet.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <signal.h>
8#include <string.h>
9#include <log/log.h>
ll39957ea2022-03-30 16:33:45 +080010#include <pthread.h>
lld164b022022-03-29 14:01:01 +080011#include "liblog/lynq_deflog.h"
12#include "include/lib_at/lynq_at.h"
13
14#define LYNQ_AT_SERVICE_PORT 8087
15#define OUT_MAX_SIZE 1024
16#define USER_LOG_TAG "LYNQ_AT"
17
ll3b460632022-05-24 16:53:00 +080018typedef enum
19{
20 A_SUCCESS = 0,
21 A_ERROR = -1
22}LYNQ_AT_E;
23
24/*lei add : maybe sento/revc error*/
25int result = A_SUCCESS;
26/*lei add : maybe sento/revc error*/
lld164b022022-03-29 14:01:01 +080027int sockfd = 0;
28char *output = NULL;
ll39957ea2022-03-30 16:33:45 +080029char buffer_at[OUT_MAX_SIZE] = {0};
lld164b022022-03-29 14:01:01 +080030struct sockaddr_in addr_serv;
31socklen_t len;
ll39957ea2022-03-30 16:33:45 +080032LYNQ_AT_CALLBACK tmp = NULL;
lld164b022022-03-29 14:01:01 +080033
34/**
ll39957ea2022-03-30 16:33:45 +080035 * @brief Catch exceptions and free malloc's memory
36 *
37 * @param signum Type:[IN] signal
lld164b022022-03-29 14:01:01 +080038 */
ll39957ea2022-03-30 16:33:45 +080039static void signal_handler(int signum)
lld164b022022-03-29 14:01:01 +080040{
ll39957ea2022-03-30 16:33:45 +080041 switch(signum)
42 {
43 case SIGABRT:
44 LYDBGLOG("recv SIGABRT\n");
45 break;
46 case SIGBUS:
47 LYDBGLOG("recv SIGBUS\n");
48 break;
49 case SIGFPE:
50 LYDBGLOG("recv SIGFPE\n");
51 break;
52 case SIGILL:
53 LYDBGLOG("recv SIGILL\n");
54 break;
55 case SIGSEGV:
56 LYDBGLOG("recv SIGSEGV\n");
57 break;
58 default:
59 LYDBGLOG("recv unknown signal\n");
60 break;
61 }
62 if(NULL != output)
63 {
64 free(output);
65 output = NULL;
66 }
67}
68
69/**
70 * @brief send third cmd to service and receive input,then send output to service
71 *
72 * @param parm
73 * @return void*
74 */
75void *thread_recv(void *parm)
76{
77 signal(SIGPIPE, signal_handler);
78 signal(SIGABRT, signal_handler);
79 signal(SIGBUS, signal_handler);
80 signal(SIGFPE, signal_handler);
81 signal(SIGILL, signal_handler);
82 signal(SIGSEGV, signal_handler);
83 int recv = 0;
84 int send = 0;
ll39957ea2022-03-30 16:33:45 +080085 char at_cmd[100] = {0};
lld164b022022-03-29 14:01:01 +080086 sockfd=socket(AF_INET,SOCK_DGRAM,0);
87 memset(&addr_serv, 0, sizeof(addr_serv));
88 addr_serv.sin_family =AF_INET;
89 addr_serv.sin_port =htons(LYNQ_AT_SERVICE_PORT);
90 addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);
91 len=sizeof(addr_serv);
ll39957ea2022-03-30 16:33:45 +080092 int len_buf = strlen(buffer_at);
93 send = sendto(sockfd, buffer_at, len_buf,0,(struct sockaddr*)&addr_serv,len);
lld164b022022-03-29 14:01:01 +080094 if(send < 0)
95 {
ll39957ea2022-03-30 16:33:45 +080096 LYDBGLOG("thread_recv send fail\n");
ll3b460632022-05-24 16:53:00 +080097 result = send;
ll39957ea2022-03-30 16:33:45 +080098 return NULL;
lld164b022022-03-29 14:01:01 +080099 }
100 char *input = NULL;
101 output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE);
102 if(NULL == output)
103 {
ll39957ea2022-03-30 16:33:45 +0800104 LYDBGLOG("thread_recv malloc fail\n");
ll3b460632022-05-24 16:53:00 +0800105 result = A_ERROR;
ll39957ea2022-03-30 16:33:45 +0800106 return NULL;
lld164b022022-03-29 14:01:01 +0800107 }
108 while (1)
109 {
110 /*receive at cmd*/
111 LYDBGLOG("lynq_reg_third_at receive at cmd\n");
ll39957ea2022-03-30 16:33:45 +0800112 recv = recvfrom(sockfd,at_cmd,sizeof(at_cmd),0,(struct sockaddr*)&addr_serv,&len);
lld164b022022-03-29 14:01:01 +0800113 if(recv < 0)
114 {
ll39957ea2022-03-30 16:33:45 +0800115 LYDBGLOG("thread_recv recv fail\n");
116 continue;
lld164b022022-03-29 14:01:01 +0800117 }
118 input = at_cmd;
ll39957ea2022-03-30 16:33:45 +0800119 //begin deal with callback
120 tmp(input, output, OUT_MAX_SIZE);
lld164b022022-03-29 14:01:01 +0800121 LYDBGLOG("lynq_reg_third_at send output to service\n");
ll39957ea2022-03-30 16:33:45 +0800122 send = sendto(sockfd, output, strlen(output),0,(struct sockaddr*)&addr_serv,len);
lld164b022022-03-29 14:01:01 +0800123 if(send < 0)
124 {
ll39957ea2022-03-30 16:33:45 +0800125 LYDBGLOG("thread_recv send fail\n");
lld164b022022-03-29 14:01:01 +0800126 continue;
127 }
128 }
ll39957ea2022-03-30 16:33:45 +0800129 free(output);
130 output = NULL;
lld164b022022-03-29 14:01:01 +0800131 if(sockfd != 0)
132 {
133 close(sockfd);
134 }
ll39957ea2022-03-30 16:33:45 +0800135 return NULL;
136}
137
138/**
139 * @brief Threads are created to communicate with the server
140 *
141 * @return int
142 */
143int lynq_connect_service_start(void)
144{
145 pthread_t lynq_at_tid = -1;
146 int rt = pthread_create(&lynq_at_tid, NULL, thread_recv, NULL);
147 if(rt < 0)
148 {
149 LYERRLOG("urc loop failure!!!\n");
150 return -1;
151 }
152 return 0;
153}
154
155/**
156 * @brief Type:[IN] send third at cmd to service
157 * @param ext_at Type:[IN] input at cmd
158 * @param callback Type:[IN]
159 * @return int
160 */
161int lynq_reg_third_at(const char *ext_at, LYNQ_AT_CALLBACK callback)
162{
163 if(NULL == ext_at || NULL == callback)
164 {
ll3b460632022-05-24 16:53:00 +0800165 return A_ERROR;
ll39957ea2022-03-30 16:33:45 +0800166 }
167 memcpy(buffer_at, ext_at, strlen(ext_at));
168 tmp = callback;
169 LYLOGSET(LOG_INFO);
170 LYLOGEINIT(USER_LOG_TAG);
171 LYDBGLOG("lynq_reg_third_at start\n");
172 int ret = lynq_connect_service_start();
173 if(ret != 0)
174 {
175 LYDBGLOG("lynq_connect_service_start start failed\n");
ll3b460632022-05-24 16:53:00 +0800176 return A_ERROR;
ll39957ea2022-03-30 16:33:45 +0800177 }
ll3b460632022-05-24 16:53:00 +0800178 return result;
lld164b022022-03-29 14:01:01 +0800179}
180