[feature]liblynq-at-extension.so and demo app
Change-Id: I6a66b590774054d29b19352b126de2c24561c43e
diff --git a/lib/liblynq-at-extension/LICENSE b/lib/liblynq-at-extension/LICENSE
new file mode 100755
index 0000000..77f59ed
--- /dev/null
+++ b/lib/liblynq-at-extension/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/lib/liblynq-at-extension/include/lib_at/lynq_at.h b/lib/liblynq-at-extension/include/lib_at/lynq_at.h
new file mode 100755
index 0000000..1a17fe9
--- /dev/null
+++ b/lib/liblynq-at-extension/include/lib_at/lynq_at.h
@@ -0,0 +1,38 @@
+
+/*=============================================================================
+# FileName: lynq_at.h
+# Desc: about AT_EXTENSION_API
+# Author:lei
+# Version: V1.0
+# LastChange: 2022-03-28
+# History:
+=============================================================================*/
+
+#ifndef __LYNQ_AT__
+#define __LYNQ_AT__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief
+ * @param input type:in
+ * @param output type:out
+ * @param out_max_size type:in
+ */
+typedef void (*LYNQ_AT_CALLBACK)(char input[], char output[], int out_max_size);
+
+/**
+ * @brief Register the AT command to the server and print the function execution finger on the AT port
+ *
+ * @param ext_at type:in at command
+ * @param callback type:in callback
+ * @return int
+ */
+int lynq_reg_third_at(const char *ext_at, LYNQ_AT_CALLBACK callback);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/lib/liblynq-at-extension/lynq_at.cpp b/lib/liblynq-at-extension/lynq_at.cpp
new file mode 100755
index 0000000..7440c99
--- /dev/null
+++ b/lib/liblynq-at-extension/lynq_at.cpp
@@ -0,0 +1,88 @@
+#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 "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;
+struct sockaddr_in addr_serv;
+socklen_t len;
+
+/**
+ * @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)
+{
+ LYDBGLOG("lynq_reg_third_at start\n");
+ 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(ext_at);
+ int send = sendto(sockfd, ext_at, len_buf,0,(struct sockaddr*)&addr_serv,len);
+ if(send < 0)
+ {
+ LYDBGLOG("send fail\n");
+ return -1;
+ }
+ char *input = NULL;
+ output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE);
+ if(NULL == output)
+ {
+ LYDBGLOG("malloc fail\n");
+ return -1;
+ }
+ while (1)
+ {
+ /*receive at cmd*/
+ LYDBGLOG("lynq_reg_third_at receive at cmd\n");
+ char at_cmd[100] = {0};
+ int recv = recvfrom(sockfd,at_cmd,sizeof(at_cmd),0,(struct sockaddr*)&addr_serv,&len);
+ if(recv < 0)
+ {
+ LYDBGLOG("recv fail\n");
+ return -1;
+ }
+ input = at_cmd;
+ callback(input, output, OUT_MAX_SIZE);
+ if(NULL == output)
+ {
+ LYDBGLOG("output = null\n");
+ return -1;
+ }
+ LYDBGLOG("lynq_reg_third_at send output to service\n");
+ int send = sendto(sockfd, output, strlen(output),0,(struct sockaddr*)&addr_serv,len);
+ if(send < 0)
+ {
+ LYDBGLOG("send fail\n");
+ continue;
+ }
+ }
+ if(output != NULL)
+ {
+ free(output);
+ output = NULL;
+ }
+ if(sockfd != 0)
+ {
+ close(sockfd);
+ }
+ return 0;
+}
+
diff --git a/lib/liblynq-at-extension/makefile b/lib/liblynq-at-extension/makefile
new file mode 100755
index 0000000..0a6c2d3
--- /dev/null
+++ b/lib/liblynq-at-extension/makefile
@@ -0,0 +1,67 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -std=gnu++14 \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -fPIC \
+ -DKEEP_ALIVE \
+ -DECALL_SUPPORT \
+ -fpermissive \
+
+
+
+$(warning ################# lynq at demo ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH)/include/lib_at \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/liblog \
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llog \
+ -lpthread \
+ -llynq-log \
+
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-at-extension.so
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+
+.PHONY: build clean install pack_rootfs
+all: build
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build: $(EXECUTABLE)
+ $(warning ########## build $(EXECUTABLE) ##########)
+install:
+ mkdir -p $(ROOT)$(base_libdir)/
+ install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+ mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
+pack_rootfs:
+ mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+ cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+ $(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+ mkdir -p $(PACK_TO)$(base_libdir)/
+ cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+ $(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
+ -find . -name "*.o" -delete