|  | #include<sys/types.h> | 
|  | #include<sys/socket.h> | 
|  | #include<unistd.h> | 
|  | #include<arpa/inet.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <signal.h> | 
|  | #include <string.h> | 
|  | #include <log/log.h> | 
|  | #include <pthread.h> | 
|  | #include "liblog/lynq_deflog.h" | 
|  | #include "include/lib_at/lynq_at.h" | 
|  |  | 
|  | #define LYNQ_AT_SERVICE_PORT 8087 | 
|  | #define OUT_MAX_SIZE 1024 | 
|  | #define USER_LOG_TAG "LYNQ_AT" | 
|  |  | 
|  | int sockfd = 0; | 
|  | char *output = NULL; | 
|  | char buffer_at[OUT_MAX_SIZE] = {0}; | 
|  | struct sockaddr_in addr_serv; | 
|  | socklen_t len; | 
|  | LYNQ_AT_CALLBACK tmp = NULL; | 
|  |  | 
|  | /** | 
|  | * @brief Catch exceptions and free malloc's memory | 
|  | * | 
|  | * @param signum Type:[IN] signal | 
|  | */ | 
|  | static void signal_handler(int signum) | 
|  | { | 
|  | switch(signum) | 
|  | { | 
|  | case SIGABRT: | 
|  | LYDBGLOG("recv SIGABRT\n"); | 
|  | break; | 
|  | case SIGBUS: | 
|  | LYDBGLOG("recv SIGBUS\n"); | 
|  | break; | 
|  | case SIGFPE: | 
|  | LYDBGLOG("recv SIGFPE\n"); | 
|  | break; | 
|  | case SIGILL: | 
|  | LYDBGLOG("recv SIGILL\n"); | 
|  | break; | 
|  | case SIGSEGV: | 
|  | LYDBGLOG("recv SIGSEGV\n"); | 
|  | break; | 
|  | default: | 
|  | LYDBGLOG("recv unknown signal\n"); | 
|  | break; | 
|  | } | 
|  | if(NULL != output) | 
|  | { | 
|  | free(output); | 
|  | output = NULL; | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief send third cmd to service and receive input,then send output to service | 
|  | * | 
|  | * @param parm | 
|  | * @return void* | 
|  | */ | 
|  | void *thread_recv(void *parm) | 
|  | { | 
|  | signal(SIGPIPE, signal_handler); | 
|  | signal(SIGABRT, signal_handler); | 
|  | signal(SIGBUS, signal_handler); | 
|  | signal(SIGFPE, signal_handler); | 
|  | signal(SIGILL, signal_handler); | 
|  | signal(SIGSEGV, signal_handler); | 
|  | int recv = 0; | 
|  | int send = 0; | 
|  | int result = 0; | 
|  | char at_cmd[100] = {0}; | 
|  | sockfd=socket(AF_INET,SOCK_DGRAM,0); | 
|  | memset(&addr_serv, 0, sizeof(addr_serv)); | 
|  | addr_serv.sin_family =AF_INET; | 
|  | addr_serv.sin_port =htons(LYNQ_AT_SERVICE_PORT); | 
|  | addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); | 
|  | len=sizeof(addr_serv); | 
|  | int len_buf = strlen(buffer_at); | 
|  | send = sendto(sockfd, buffer_at, len_buf,0,(struct sockaddr*)&addr_serv,len); | 
|  | if(send < 0) | 
|  | { | 
|  | LYDBGLOG("thread_recv send fail\n"); | 
|  | return NULL; | 
|  | } | 
|  | char *input = NULL; | 
|  | output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE); | 
|  | if(NULL == output) | 
|  | { | 
|  | LYDBGLOG("thread_recv malloc fail\n"); | 
|  | return NULL; | 
|  | } | 
|  | while (1) | 
|  | { | 
|  | /*receive at cmd*/ | 
|  | LYDBGLOG("lynq_reg_third_at receive at cmd\n"); | 
|  | recv = recvfrom(sockfd,at_cmd,sizeof(at_cmd),0,(struct sockaddr*)&addr_serv,&len); | 
|  | if(recv < 0) | 
|  | { | 
|  | LYDBGLOG("thread_recv recv fail\n"); | 
|  | continue; | 
|  | } | 
|  | input = at_cmd; | 
|  | //begin deal with callback | 
|  | tmp(input, output, OUT_MAX_SIZE); | 
|  | LYDBGLOG("lynq_reg_third_at send output to service\n"); | 
|  | send = sendto(sockfd, output, strlen(output),0,(struct sockaddr*)&addr_serv,len); | 
|  | if(send < 0) | 
|  | { | 
|  | LYDBGLOG("thread_recv send fail\n"); | 
|  | continue; | 
|  | } | 
|  | } | 
|  | free(output); | 
|  | output = NULL; | 
|  | if(sockfd != 0) | 
|  | { | 
|  | close(sockfd); | 
|  | } | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Threads are created to communicate with the server | 
|  | * | 
|  | * @return int | 
|  | */ | 
|  | int lynq_connect_service_start(void) | 
|  | { | 
|  | pthread_t lynq_at_tid = -1; | 
|  | int rt = pthread_create(&lynq_at_tid, NULL, thread_recv, NULL); | 
|  | if(rt < 0) | 
|  | { | 
|  | LYERRLOG("urc loop failure!!!\n"); | 
|  | return -1; | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Type:[IN] send third at cmd to service | 
|  | * @param ext_at Type:[IN] input at cmd | 
|  | * @param callback Type:[IN] | 
|  | * @return int | 
|  | */ | 
|  | int lynq_reg_third_at(const char *ext_at, LYNQ_AT_CALLBACK callback) | 
|  | { | 
|  | if(NULL == ext_at || NULL == callback) | 
|  | { | 
|  | return -1; | 
|  | } | 
|  | memcpy(buffer_at, ext_at, strlen(ext_at)); | 
|  | tmp = callback; | 
|  | LYLOGSET(LOG_INFO); | 
|  | LYLOGEINIT(USER_LOG_TAG); | 
|  | LYDBGLOG("lynq_reg_third_at start\n"); | 
|  | int ret = lynq_connect_service_start(); | 
|  | if(ret != 0) | 
|  | { | 
|  | LYDBGLOG("lynq_connect_service_start start failed\n"); | 
|  | return -1; | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  |