blob: 7af2ae3f06c8e465aff0d8d8a8d8ed6c5cb334e8 [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
18int sockfd = 0;
19char *output = NULL;
ll39957ea2022-03-30 16:33:45 +080020char buffer_at[OUT_MAX_SIZE] = {0};
lld164b022022-03-29 14:01:01 +080021struct sockaddr_in addr_serv;
22socklen_t len;
ll39957ea2022-03-30 16:33:45 +080023LYNQ_AT_CALLBACK tmp = NULL;
lld164b022022-03-29 14:01:01 +080024
25/**
ll39957ea2022-03-30 16:33:45 +080026 * @brief Catch exceptions and free malloc's memory
27 *
28 * @param signum Type:[IN] signal
lld164b022022-03-29 14:01:01 +080029 */
ll39957ea2022-03-30 16:33:45 +080030static void signal_handler(int signum)
lld164b022022-03-29 14:01:01 +080031{
ll39957ea2022-03-30 16:33:45 +080032 switch(signum)
33 {
34 case SIGABRT:
35 LYDBGLOG("recv SIGABRT\n");
36 break;
37 case SIGBUS:
38 LYDBGLOG("recv SIGBUS\n");
39 break;
40 case SIGFPE:
41 LYDBGLOG("recv SIGFPE\n");
42 break;
43 case SIGILL:
44 LYDBGLOG("recv SIGILL\n");
45 break;
46 case SIGSEGV:
47 LYDBGLOG("recv SIGSEGV\n");
48 break;
49 default:
50 LYDBGLOG("recv unknown signal\n");
51 break;
52 }
53 if(NULL != output)
54 {
55 free(output);
56 output = NULL;
57 }
58}
59
60/**
61 * @brief send third cmd to service and receive input,then send output to service
62 *
63 * @param parm
64 * @return void*
65 */
66void *thread_recv(void *parm)
67{
68 signal(SIGPIPE, signal_handler);
69 signal(SIGABRT, signal_handler);
70 signal(SIGBUS, signal_handler);
71 signal(SIGFPE, signal_handler);
72 signal(SIGILL, signal_handler);
73 signal(SIGSEGV, signal_handler);
74 int recv = 0;
75 int send = 0;
76 int result = 0;
77 char at_cmd[100] = {0};
lld164b022022-03-29 14:01:01 +080078 sockfd=socket(AF_INET,SOCK_DGRAM,0);
79 memset(&addr_serv, 0, sizeof(addr_serv));
80 addr_serv.sin_family =AF_INET;
81 addr_serv.sin_port =htons(LYNQ_AT_SERVICE_PORT);
82 addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);
83 len=sizeof(addr_serv);
ll39957ea2022-03-30 16:33:45 +080084 int len_buf = strlen(buffer_at);
85 send = sendto(sockfd, buffer_at, len_buf,0,(struct sockaddr*)&addr_serv,len);
lld164b022022-03-29 14:01:01 +080086 if(send < 0)
87 {
ll39957ea2022-03-30 16:33:45 +080088 LYDBGLOG("thread_recv send fail\n");
89 return NULL;
lld164b022022-03-29 14:01:01 +080090 }
91 char *input = NULL;
92 output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE);
93 if(NULL == output)
94 {
ll39957ea2022-03-30 16:33:45 +080095 LYDBGLOG("thread_recv malloc fail\n");
96 return NULL;
lld164b022022-03-29 14:01:01 +080097 }
98 while (1)
99 {
100 /*receive at cmd*/
101 LYDBGLOG("lynq_reg_third_at receive at cmd\n");
ll39957ea2022-03-30 16:33:45 +0800102 recv = recvfrom(sockfd,at_cmd,sizeof(at_cmd),0,(struct sockaddr*)&addr_serv,&len);
lld164b022022-03-29 14:01:01 +0800103 if(recv < 0)
104 {
ll39957ea2022-03-30 16:33:45 +0800105 LYDBGLOG("thread_recv recv fail\n");
106 continue;
lld164b022022-03-29 14:01:01 +0800107 }
108 input = at_cmd;
ll39957ea2022-03-30 16:33:45 +0800109 //begin deal with callback
110 tmp(input, output, OUT_MAX_SIZE);
lld164b022022-03-29 14:01:01 +0800111 LYDBGLOG("lynq_reg_third_at send output to service\n");
ll39957ea2022-03-30 16:33:45 +0800112 send = sendto(sockfd, output, strlen(output),0,(struct sockaddr*)&addr_serv,len);
lld164b022022-03-29 14:01:01 +0800113 if(send < 0)
114 {
ll39957ea2022-03-30 16:33:45 +0800115 LYDBGLOG("thread_recv send fail\n");
lld164b022022-03-29 14:01:01 +0800116 continue;
117 }
118 }
ll39957ea2022-03-30 16:33:45 +0800119 free(output);
120 output = NULL;
lld164b022022-03-29 14:01:01 +0800121 if(sockfd != 0)
122 {
123 close(sockfd);
124 }
ll39957ea2022-03-30 16:33:45 +0800125 return NULL;
126}
127
128/**
129 * @brief Threads are created to communicate with the server
130 *
131 * @return int
132 */
133int lynq_connect_service_start(void)
134{
135 pthread_t lynq_at_tid = -1;
136 int rt = pthread_create(&lynq_at_tid, NULL, thread_recv, NULL);
137 if(rt < 0)
138 {
139 LYERRLOG("urc loop failure!!!\n");
140 return -1;
141 }
142 return 0;
143}
144
145/**
146 * @brief Type:[IN] send third at cmd to service
147 * @param ext_at Type:[IN] input at cmd
148 * @param callback Type:[IN]
149 * @return int
150 */
151int lynq_reg_third_at(const char *ext_at, LYNQ_AT_CALLBACK callback)
152{
153 if(NULL == ext_at || NULL == callback)
154 {
155 return -1;
156 }
157 memcpy(buffer_at, ext_at, strlen(ext_at));
158 tmp = callback;
159 LYLOGSET(LOG_INFO);
160 LYLOGEINIT(USER_LOG_TAG);
161 LYDBGLOG("lynq_reg_third_at start\n");
162 int ret = lynq_connect_service_start();
163 if(ret != 0)
164 {
165 LYDBGLOG("lynq_connect_service_start start failed\n");
166 return -1;
167 }
lld164b022022-03-29 14:01:01 +0800168 return 0;
169}
170