From 3509b6dfaad073c2b7887031c917c12b8ed5caa1 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Mon, 19 Nov 2018 23:01:46 +0800
Subject: [PATCH] Add iotd program
---
src/nbiotd/iotd.c | 249 +++++++++++++++++
src/nbiotd/mqtt/makefile | 82 +++++
src/nbiotd/mqtt/mqtt_api.c | 0
src/nbiotd/core/iotd_conf.c | 0
src/nbiotd/core/makefile | 82 +++++
src/nbiotd/makefile | 176 ++++++++++++
src/nbiotd/lora/lora_api.c | 0
src/nbiotd/nbiot/makefile | 82 +++++
src/nbiotd/nbiot/nbiot_api.c | 0
src/nbiotd/lora/makefile | 82 +++++
src/nbiotd/etc/iotd.conf | 32 ++
11 files changed, 785 insertions(+), 0 deletions(-)
diff --git a/src/nbiotd/core/iotd_conf.c b/src/nbiotd/core/iotd_conf.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/nbiotd/core/iotd_conf.c
diff --git a/src/nbiotd/core/makefile b/src/nbiotd/core/makefile
new file mode 100644
index 0000000..6283f73
--- /dev/null
+++ b/src/nbiotd/core/makefile
@@ -0,0 +1,82 @@
+#*********************************************************************************
+# Copyright: (C) 2012 CoherentPlus Sdn. Bhd.
+# All rights reserved.
+#
+# Filename: Makefile
+# Description: This is the common subdir Makefile which to compile all the C
+# source code to object files and then generate the shared or
+# static library named lib$(FOLDER_NAME).a orlib $(FOLDER_NAME).so,
+# which depends on the variable $LINK_MODE.
+#
+# Version: 1.0.0(10/08/2011~)
+# Author: Guo Wenxue <guowenxue@gmail.com>
+# ChangeLog: 1, Release initial version on "10/08/2011 01:29:33 AM"
+#
+#********************************************************************************/
+
+PWD=$(shell pwd)
+#TOP_COMPILE=YES
+
+#If wanna compile in the subdir, not called by top makefile, uncomment it
+ifneq (${TOP_COMPILE}, YES)
+LOCAL_COMPILE=YES
+endif
+
+LIBNAME=$(shell basename ${PWD})
+STALIB=lib${LIBNAME}.a
+DYNLIB=lib${LIBNAME}.so
+
+VPATH= .
+SRCS = $(wildcard ${VPATH}/*.c)
+OBJS = $(patsubst %.c,%.o,$(SRCS))
+
+#======================================================
+# ---> Doesn't call by top makefile, compile by local
+#======================================================
+CROSS_COMPILE?=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
+
+PRJDIR?=$(shell dirname ${PWD})
+CFLAGS+=-I${PRJDIR}
+CC = ${CROSS_COMPILE}gcc
+AR = ${CROSS_COMPILE}ar
+
+
+ifeq ("${LINK_MODE}", "STATIC")
+ LIBS = ${STALIB}
+else
+ LIBS=${DYNLIB}
+endif
+
+all: entry ${LIBS} install
+
+entry:
+ @echo " ";
+ @echo " =========================================================";
+ @echo " ** Compile subdir ${LIBNAME} for ${ARCH} ";
+ @echo " =========================================================";
+
+#$(LD) -g --relocatable $(OBJS) -o lib${LIBNAME}.o
+${STALIB}: $(OBJS)
+ $(AR) -rcu $@ $(OBJS)
+
+${DYNLIB}: $(OBJS)
+ $(CC) -fPIC -shared -o $@ $(OBJS)
+
+%.o : %.c
+ $(CC) -c $< $(CFLAGS)
+
+install:
+ @if [ ! -z "${LIBS_PATH}" ] ; then \
+ mkdir -p ${LIBS_PATH} ; \
+ cp ${LIBS} ${LIBS_PATH}; \
+ fi;
+
+
+clean:
+ @rm -f *.o
+ @rm -rf *.gdb *.a *.so
+
+distclean: clean
+ @rm -f tags cscope*
+
+.PHONY: clean entry
diff --git a/src/nbiotd/etc/iotd.conf b/src/nbiotd/etc/iotd.conf
new file mode 100644
index 0000000..43376f0
--- /dev/null
+++ b/src/nbiotd/etc/iotd.conf
@@ -0,0 +1,32 @@
+# uited program configure file
+[log]
+file=/var/log/nbiotd.log
+
+#Loglevel: 0:Disable 1:Fatal 2:ERROR 3:warnning 4:Normal 5:Debug 6:Infor 7:Trace
+level=5
+
+#Unit Kib
+size=1024
+
+[nbiot]
+enable=1
+comport="/dev/ttyUSB0"
+baudrate=9600
+
+#Settings format is: Databit[8/7],Parity[O/E/S/N],StopBit[1/0],FlowControl[S/H/N]
+settings="8N1N"
+
+[lora]
+enable=0
+comport="/dev/ttyS1"
+baudrate=115200
+
+#Settings format is: Databit[8/7],Parity[O/E/S/N],StopBit[1/0],FlowControl[S/H/N]
+settings="8N1N"
+
+[mqtt]
+enable=1
+hostname=master.iot-yun.com
+port=8107
+
+
diff --git a/src/nbiotd/iotd.c b/src/nbiotd/iotd.c
new file mode 100644
index 0000000..d901ab4
--- /dev/null
+++ b/src/nbiotd/iotd.c
@@ -0,0 +1,249 @@
+/*********************************************************************************
+ * Copyright: (C) 2018 LingYun IoT Studio
+ * All rights reserved.
+ * Filename: iotd_main.c
+ * Description: This file is iotd (Internet of Things daemon) program main() entry point,
+ *
+ * Version: 1.0.0(2018/11/19)
+ * Author: Guo Wenxue <guowenxue@aliyun.com>
+ * ChangeLog: 1, Release initial version on "2018/11/19 22:05:56 CST"
+ *
+ ********************************************************************************/
+#include <stdio.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <linux/input.h>
+#include <linux/kd.h>
+#include <linux/keyboard.h>
+#include <linux/watchdog.h>
+#include <libgen.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "cp_logger.h"
+#include "cp_proc.h"
+
+#define DEF_LOG_FILE "/var/log/iotd.log"
+#define DEF_LOG_LEVEL LOG_LEVEL_NRML
+
+void *watchdog_worker(void *arg);
+
+
+
+typedef struct iotd_conf_s
+{
+ cp_logger logger;
+
+} iotd_conf_t;
+
+
+typedef struct iotd_ctx_s
+{
+ iotd_conf_t conf;
+} iotd_ctx_t;
+
+
+void banner(const char *program)
+{
+ printf("Copyright (C) 2018 LingYun IoT Studio.\n");
+ printf("%s Version 1.0.0 Build on @ %s %s\n", program, __DATE__, __TIME__);
+}
+
+static void program_usage(const char *progname)
+{
+ banner(progname);
+
+ printf("Usage: %s [OPTION]...\n", progname);
+ printf(" %s is a daemon program running on the device, which used to \n", progname);
+ printf("receive date from serial and transfer the data to remote server by socket\n");
+
+ printf("\nMandatory arguments to long options are mandatory for short options too:\n");
+ printf(" -d[debug ] Running in debug mode\n");
+ printf(" -l[level ] Set the log level as [0..%d]\n", LOG_LEVEL_MAX-1);
+ printf(" -h[help ] Display this help information\n");
+ printf(" -v[version ] Display the program version\n");
+
+ return;
+}
+
+int main(int argc, char **argv)
+{
+ int opt;
+ int i = 0;
+ int rv = 0;
+ int debug = 0;
+ const char *progname=NULL;
+
+ char pid_file[64] = { 0 }; /* The file used to record the PID */
+ char *conf_file = "iotd.conf";
+ char *log_file = DEF_LOG_FILE;
+ int log_level = DEF_LOG_LEVEL;
+ iotd_ctx_t iotd_ctx;
+
+ pthread_t tid;
+ iotd_conf_t *conf;
+ cp_logger *logger;
+
+ memset(&iotd_ctx, 0, sizeof(iotd_ctx));
+ conf = &iotd_ctx.conf;
+ logger = &conf->logger;
+
+ struct option long_options[] = {
+ {"conf", required_argument, NULL, 'c'},
+ {"debug", no_argument, NULL, 'd'},
+ {"level", required_argument, NULL, 'l'},
+ {"version", no_argument, NULL, 'v'},
+ {"help", no_argument, NULL, 'h'},
+ {NULL, 0, NULL, 0}
+ };
+
+ progname = basename(argv[0]);
+ /* Parser the command line parameters */
+ while ((opt = getopt_long(argc, argv, "c:dl:vh", long_options, NULL)) != -1)
+ {
+ switch (opt)
+ {
+ case 'c': /* Set configure file */
+ conf_file = optarg;
+ break;
+
+ case 'd': /* Set debug running */
+ debug = 1;
+ log_file = DBG_LOG_FILE;
+ break;
+
+ case 'l': /* Set the log level */
+ i = atoi(optarg);
+ log_level = i>LOG_LEVEL_MAX ? LOG_LEVEL_MAX-1 : i;
+ logger->flag |= CP_LOGGER_LEVEL_OPT;
+ break;
+
+ case 'v': /* Get software version */
+ banner(progname); /* Defined in version.h */
+ return EXIT_SUCCESS;
+
+ case 'h': /* Get help information */
+ program_usage(progname);
+ return 0;
+
+ default:
+ break;
+ } /* end of "switch(opt)" */
+ }
+
+ snprintf(pid_file, sizeof(pid_file), "/var/run/%s.pid", progname);
+ if( !debug )
+ {
+ if( check_daemon_running(pid_file) )
+ {
+ printf("Programe already running, exit now.\n");
+ return -1;
+ }
+ }
+
+ if ( !cp_log_init(logger, log_file, log_level, 1024/*KB*/) || cp_log_open() )
+ {
+ printf("Logger initialize failure with file: %s\n", logger->file);
+ return -1;
+ }
+
+ /* Parser configure file and start the initialize log */
+ rv = parser_iotd_conf(conf_file, conf);
+ if(rv < 0)
+ {
+ log_fatal("Parse configure file %s failure, rv=%d\n", conf_file, rv);
+ goto CleanUp;
+ }
+
+ /* If configure file logger is not same as default one, then reopen the logger system */
+ if( !debug && strncmp(logger->file, DEF_LOG_FILE, strlen(DEF_LOG_FILE)) )
+ {
+ log_warn("Reinitiase logger to [%s]\n", logger->file);
+ cp_log_close();
+
+ if( cp_log_open() )
+ {
+ printf("Logger reopen failure with file: %s\n", logger->file);
+ return -1;
+ }
+ printf("Open logger ok\n");
+ }
+
+ if( !debug )
+ {
+ if( set_daemon_running(pid_file) )
+ {
+ log_fatal("Set program \"%s\" running as daemon failure.\n", progname);
+ goto CleanUp;
+ }
+ }
+
+ cp_install_proc_signal();
+
+ /* start watchdog thread worker */
+ thread_start(&tid, watchdog_worker, NULL);
+
+ /* Start MQTT thread worker */
+ log_nrml("start MQTT socket process thread\n");
+ //thread_start(&tid, mqtt_worker, (void *)&iotd_ctx );
+
+ /* Start NB-IoT thread worker */
+ log_nrml("start NB-IoT process thread\n");
+ //thread_start(&tid, nbiot_worker, (void *)&iotd_ctx );
+
+ /* Start LoRa thread worker */
+ log_nrml("start LoRa AP process thread\n");
+ //thread_start(&tid, nbiot_worker, (void *)&iotd_ctx );
+
+ while( !g_cp_signal.stop )
+ {
+ sleep(1);
+ }
+
+CleanUp:
+ log_warn("Terminate main program \"%s\".\n", progname);
+ unlink(pid_file);
+ cp_log_term();
+ return rv;
+}
+
+
+#define WTD_DEV "/dev/watchdog"
+void *watchdog_worker(void *arg)
+{
+ int wtd_fd = -1;
+ int timeout = 120; /* 2 minutes */
+ int times = 0;
+
+ log_nrml("start watchdog thread\n");
+
+ if( (wtd_fd=open(WTD_DEV, O_RDWR)) < 0 )
+ {
+ log_err("Open watchdog '%s' failure: %s\n", WTD_DEV, strerror(errno));
+ return NULL;
+ }
+
+ ioctl(wtd_fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD);
+ ioctl(wtd_fd, WDIOC_SETTIMEOUT, &timeout);
+ log_nrml("Start watchdog on timeout %d seconds\n", timeout);
+
+ while( !g_cp_signal.stop )
+ {
+ if( times++ > 20 )
+ {
+ log_dbg("start feed watchdog now\n");
+ ioctl(wtd_fd, WDIOC_KEEPALIVE, NULL);
+ times = 0;
+ }
+
+ sleep(1);
+ }
+
+ close(wtd_fd);
+ printf("watchdog thread worker exit\n");
+
+ return NULL;
+}
diff --git a/src/nbiotd/lora/lora_api.c b/src/nbiotd/lora/lora_api.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/nbiotd/lora/lora_api.c
diff --git a/src/nbiotd/lora/makefile b/src/nbiotd/lora/makefile
new file mode 100644
index 0000000..6283f73
--- /dev/null
+++ b/src/nbiotd/lora/makefile
@@ -0,0 +1,82 @@
+#*********************************************************************************
+# Copyright: (C) 2012 CoherentPlus Sdn. Bhd.
+# All rights reserved.
+#
+# Filename: Makefile
+# Description: This is the common subdir Makefile which to compile all the C
+# source code to object files and then generate the shared or
+# static library named lib$(FOLDER_NAME).a orlib $(FOLDER_NAME).so,
+# which depends on the variable $LINK_MODE.
+#
+# Version: 1.0.0(10/08/2011~)
+# Author: Guo Wenxue <guowenxue@gmail.com>
+# ChangeLog: 1, Release initial version on "10/08/2011 01:29:33 AM"
+#
+#********************************************************************************/
+
+PWD=$(shell pwd)
+#TOP_COMPILE=YES
+
+#If wanna compile in the subdir, not called by top makefile, uncomment it
+ifneq (${TOP_COMPILE}, YES)
+LOCAL_COMPILE=YES
+endif
+
+LIBNAME=$(shell basename ${PWD})
+STALIB=lib${LIBNAME}.a
+DYNLIB=lib${LIBNAME}.so
+
+VPATH= .
+SRCS = $(wildcard ${VPATH}/*.c)
+OBJS = $(patsubst %.c,%.o,$(SRCS))
+
+#======================================================
+# ---> Doesn't call by top makefile, compile by local
+#======================================================
+CROSS_COMPILE?=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
+
+PRJDIR?=$(shell dirname ${PWD})
+CFLAGS+=-I${PRJDIR}
+CC = ${CROSS_COMPILE}gcc
+AR = ${CROSS_COMPILE}ar
+
+
+ifeq ("${LINK_MODE}", "STATIC")
+ LIBS = ${STALIB}
+else
+ LIBS=${DYNLIB}
+endif
+
+all: entry ${LIBS} install
+
+entry:
+ @echo " ";
+ @echo " =========================================================";
+ @echo " ** Compile subdir ${LIBNAME} for ${ARCH} ";
+ @echo " =========================================================";
+
+#$(LD) -g --relocatable $(OBJS) -o lib${LIBNAME}.o
+${STALIB}: $(OBJS)
+ $(AR) -rcu $@ $(OBJS)
+
+${DYNLIB}: $(OBJS)
+ $(CC) -fPIC -shared -o $@ $(OBJS)
+
+%.o : %.c
+ $(CC) -c $< $(CFLAGS)
+
+install:
+ @if [ ! -z "${LIBS_PATH}" ] ; then \
+ mkdir -p ${LIBS_PATH} ; \
+ cp ${LIBS} ${LIBS_PATH}; \
+ fi;
+
+
+clean:
+ @rm -f *.o
+ @rm -rf *.gdb *.a *.so
+
+distclean: clean
+ @rm -f tags cscope*
+
+.PHONY: clean entry
diff --git a/src/nbiotd/makefile b/src/nbiotd/makefile
new file mode 100644
index 0000000..d570f3c
--- /dev/null
+++ b/src/nbiotd/makefile
@@ -0,0 +1,176 @@
+#*********************************************************************************
+# Copyright: (C) 2012 CoherentPlus Sdn. Bhd.
+# All rights reserved.
+#
+# Filename: Makefile
+# Description: This is the common top Makefile which used to call function to
+# Cross compile the subdir source code and link all the libs to
+# excutable binary file.
+#
+# Version: 1.0.0(10/08/2011~)
+# Author: Guo Wenxue <guowenxue@gmail.com>
+# ChangeLog: 1, Release initial version on "10/08/2011 01:29:33 AM"
+#
+#********************************************************************************/
+
+APP_BINARY_NAME=iotd
+INST_PATH=/tftp
+TOP_PATH=$(shell pwd)
+LIBS_PATH=${TOP_PATH}/.libs
+
+#Excutable binary file runs on platform
+ARCH?=arm
+#ARCH?=i386
+
+#Static linked or Dynamic link
+LINK_MODE=STATIC
+
+CFLAGS+=-Werror -Wall
+
+ifeq ("${LINK_MODE}", "STATIC")
+ CFLAGS+=--static
+ LDFLAGS+=-static
+else
+ LDFLAGS+=-ldl
+endif
+
+# ==================================
+# ** Cross Compiler Setting **
+# ==================================
+
+export CROSS_COMPILE=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
+
+# Get alll the source code folder, all the source code in the subdir will be compiled and
+# archive to a static library, named lib${subdir_name}.a
+OBJFILES = $(patsubst %.c,%,$(wildcard *.c))
+SUBSRCS = $(shell find . -follow -maxdepth 1 -type d|sed -n 's/.\///p'|grep -v 'libs' \
+ |grep -v 'etc' | grep -v '.svn'|grep -v '.git'|grep -v 'include'|grep -v 'bin')
+
+# Add the subdir compiled static library into LDFLAGS
+#LDFLAGS+=$(patsubst %,-L%,$(SUBSRCS))
+#LDFLAGS+=$(patsubst %,-l%,$(SUBSRCS))
+
+LDFLAGS+=-L${LIBS_PATH}
+LDFLAGS+=$(patsubst %,-l%,$(SUBSRCS))
+LIBS=$(patsubst %,${LIBS_PATH}/lib%.a,$(SUBSRCS))
+LDFLAGS+=-Xlinker "-(" $(LIBS) -Xlinker "-)"
+
+CFLAGS+=$(patsubst %,-I${TOP_PATH}/%,$(SUBSRCS))
+CFLAGS+=-I$(TOP_PATH)
+LDFLAGS+=-lpthread
+
+export CC=${CROSS_COMPILE}gcc
+export CXX=${CROSS_COMPILE}gcc
+export AR=${CROSS_COMPILE}ar
+export AS=${CROSS_COMPILE}as
+export LD=${CROSS_COMPILE}ld
+export RANLIB=${CROSS_COMPILE}ranlib
+export STRIP=${CROSS_COMPILE}strip
+export CFLAGS
+export LDFLAGS
+export ARCH
+export LINK_MODE
+export LIBS_PATH
+
+#A function used to goes into the sub-folder to compile
+MAKEFUNC = @MakeSubDir() \
+ { \
+ for DIR in ${SUBSRCS}; do \
+ if [ -d $${DIR} ] ; then \
+ cd $${DIR}; \
+ MakeSubDir; \
+ if [ -f makefile -o -f Makefile ]; then \
+ pwd; \
+ make $(1); \
+ if [ "$$?" != "0" ]; then \
+ exit 1; \
+ fi; \
+ fi; \
+ cd ..; \
+ fi; \
+ done; \
+ if [ -f makefile -o -f Makefile ]; then \
+ make $(1); \
+ if [ "$$?" != "0" ]; then \
+ exit 1; \
+ fi; \
+ fi; \
+ }; \
+
+MAKEME = cd $(2); MakeSubDir $(1); cd ..;
+LOOPMAKEFUNC = $(MAKEFUNC) $(foreach dir,$(SUBSRCS),$(call MAKEME,$(1),$(dir)))
+
+.PHONY: all
+
+all: entry version prepare binary install
+
+prepare:
+ @if [ ! -L cp_library ] ; then \
+ ln -s ../cp_library; \
+ fi
+
+entry:
+ @echo $(SUBSRCS)
+ @echo " ";
+ @echo " =========================================================";
+ @echo " ** Come into compile ${APP_BINARY_NAME} for ARCH $(ARCH) ";
+ @echo " =========================================================";
+ @echo " ";
+ @make clean
+
+version:
+ @echo "/* Generated by makefile, don't Edit it by hand */" > version.h
+ @echo '#define DATE "$(COMPILE_DATE)"' >> version.h
+ @echo "#define MAJOR 1" >>version.h
+ @echo "#define MINOR 0" >>version.h
+ @echo "#define REVER 0" >>version.h
+ @if [ -f .svn/entries ] ; then \
+ echo "#define SVNVER `sed -n -e 4p .svn/entries`" >>version.h; \
+ else \
+ echo "#define SVNVER 0" >>version.h; \
+ fi;
+ @echo "" >> version.h
+ @echo '#define version(progname) printf("%s Version %d.%d.%d Build @%05d (%s)\\n", progname, MAJOR, MINOR, REVER,SVNVER, DATE)' >> version.h
+ @echo '#define copyright() printf("Copyright (C) 2012 CoherentPlus Sdn. Bhd.\\n")' >>version.h
+ @echo '#define banner(progname) {version(progname); copyright(); printf("\\n");}' >>version.h
+ @echo "" >> version.h
+
+subdir:
+ @$(call LOOPMAKEFUNC,all)
+ @echo " ";
+ @echo " =========================================================";
+ @echo " ** Compile and linking ${APP_BINARY_NAME} for ${ARCH} now";
+ @echo " =========================================================";
+
+%: %.c
+ $(CC) $< $(CFLAGS) -c -o $@.o
+
+binary: subdir $(OBJFILES)
+ $(CC) $(CFLAGS) -o $(APP_BINARY_NAME) *.o $(LDFLAGS)
+ $(STRIP) $(APP_BINARY_NAME)
+
+tag:
+ @cscope -Rbq
+ @ctags --c-kinds=+defglmnstuvx --langmap=c:.c.h.ho.hem.het.hec.hev.him.hit.hic.hiv -R .
+
+install:
+ cp $(APP_BINARY_NAME) ${INST_PATH}
+
+uninstall:
+ rm -f ${INST_PATH}/$(APP_BINARY_NAME)
+
+clean:
+ @$(call LOOPMAKEFUNC,clean)
+ @rm -rf ${LIBS_PATH}
+ @rm -f version.h
+ @rm -f *.o $(APP_BINARY_NAME)
+ @rm -f *.elf*
+ @rm -f *.gdb
+ @rm -f cp_library
+
+distclean: clean
+ @$(call LOOPMAKEFUNC,distclean)
+
+clear: distclean
+ @rm -f tags cscope*
+
diff --git a/src/nbiotd/mqtt/makefile b/src/nbiotd/mqtt/makefile
new file mode 100644
index 0000000..6283f73
--- /dev/null
+++ b/src/nbiotd/mqtt/makefile
@@ -0,0 +1,82 @@
+#*********************************************************************************
+# Copyright: (C) 2012 CoherentPlus Sdn. Bhd.
+# All rights reserved.
+#
+# Filename: Makefile
+# Description: This is the common subdir Makefile which to compile all the C
+# source code to object files and then generate the shared or
+# static library named lib$(FOLDER_NAME).a orlib $(FOLDER_NAME).so,
+# which depends on the variable $LINK_MODE.
+#
+# Version: 1.0.0(10/08/2011~)
+# Author: Guo Wenxue <guowenxue@gmail.com>
+# ChangeLog: 1, Release initial version on "10/08/2011 01:29:33 AM"
+#
+#********************************************************************************/
+
+PWD=$(shell pwd)
+#TOP_COMPILE=YES
+
+#If wanna compile in the subdir, not called by top makefile, uncomment it
+ifneq (${TOP_COMPILE}, YES)
+LOCAL_COMPILE=YES
+endif
+
+LIBNAME=$(shell basename ${PWD})
+STALIB=lib${LIBNAME}.a
+DYNLIB=lib${LIBNAME}.so
+
+VPATH= .
+SRCS = $(wildcard ${VPATH}/*.c)
+OBJS = $(patsubst %.c,%.o,$(SRCS))
+
+#======================================================
+# ---> Doesn't call by top makefile, compile by local
+#======================================================
+CROSS_COMPILE?=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
+
+PRJDIR?=$(shell dirname ${PWD})
+CFLAGS+=-I${PRJDIR}
+CC = ${CROSS_COMPILE}gcc
+AR = ${CROSS_COMPILE}ar
+
+
+ifeq ("${LINK_MODE}", "STATIC")
+ LIBS = ${STALIB}
+else
+ LIBS=${DYNLIB}
+endif
+
+all: entry ${LIBS} install
+
+entry:
+ @echo " ";
+ @echo " =========================================================";
+ @echo " ** Compile subdir ${LIBNAME} for ${ARCH} ";
+ @echo " =========================================================";
+
+#$(LD) -g --relocatable $(OBJS) -o lib${LIBNAME}.o
+${STALIB}: $(OBJS)
+ $(AR) -rcu $@ $(OBJS)
+
+${DYNLIB}: $(OBJS)
+ $(CC) -fPIC -shared -o $@ $(OBJS)
+
+%.o : %.c
+ $(CC) -c $< $(CFLAGS)
+
+install:
+ @if [ ! -z "${LIBS_PATH}" ] ; then \
+ mkdir -p ${LIBS_PATH} ; \
+ cp ${LIBS} ${LIBS_PATH}; \
+ fi;
+
+
+clean:
+ @rm -f *.o
+ @rm -rf *.gdb *.a *.so
+
+distclean: clean
+ @rm -f tags cscope*
+
+.PHONY: clean entry
diff --git a/src/nbiotd/mqtt/mqtt_api.c b/src/nbiotd/mqtt/mqtt_api.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/nbiotd/mqtt/mqtt_api.c
diff --git a/src/nbiotd/nbiot/makefile b/src/nbiotd/nbiot/makefile
new file mode 100644
index 0000000..6283f73
--- /dev/null
+++ b/src/nbiotd/nbiot/makefile
@@ -0,0 +1,82 @@
+#*********************************************************************************
+# Copyright: (C) 2012 CoherentPlus Sdn. Bhd.
+# All rights reserved.
+#
+# Filename: Makefile
+# Description: This is the common subdir Makefile which to compile all the C
+# source code to object files and then generate the shared or
+# static library named lib$(FOLDER_NAME).a orlib $(FOLDER_NAME).so,
+# which depends on the variable $LINK_MODE.
+#
+# Version: 1.0.0(10/08/2011~)
+# Author: Guo Wenxue <guowenxue@gmail.com>
+# ChangeLog: 1, Release initial version on "10/08/2011 01:29:33 AM"
+#
+#********************************************************************************/
+
+PWD=$(shell pwd)
+#TOP_COMPILE=YES
+
+#If wanna compile in the subdir, not called by top makefile, uncomment it
+ifneq (${TOP_COMPILE}, YES)
+LOCAL_COMPILE=YES
+endif
+
+LIBNAME=$(shell basename ${PWD})
+STALIB=lib${LIBNAME}.a
+DYNLIB=lib${LIBNAME}.so
+
+VPATH= .
+SRCS = $(wildcard ${VPATH}/*.c)
+OBJS = $(patsubst %.c,%.o,$(SRCS))
+
+#======================================================
+# ---> Doesn't call by top makefile, compile by local
+#======================================================
+CROSS_COMPILE?=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
+
+PRJDIR?=$(shell dirname ${PWD})
+CFLAGS+=-I${PRJDIR}
+CC = ${CROSS_COMPILE}gcc
+AR = ${CROSS_COMPILE}ar
+
+
+ifeq ("${LINK_MODE}", "STATIC")
+ LIBS = ${STALIB}
+else
+ LIBS=${DYNLIB}
+endif
+
+all: entry ${LIBS} install
+
+entry:
+ @echo " ";
+ @echo " =========================================================";
+ @echo " ** Compile subdir ${LIBNAME} for ${ARCH} ";
+ @echo " =========================================================";
+
+#$(LD) -g --relocatable $(OBJS) -o lib${LIBNAME}.o
+${STALIB}: $(OBJS)
+ $(AR) -rcu $@ $(OBJS)
+
+${DYNLIB}: $(OBJS)
+ $(CC) -fPIC -shared -o $@ $(OBJS)
+
+%.o : %.c
+ $(CC) -c $< $(CFLAGS)
+
+install:
+ @if [ ! -z "${LIBS_PATH}" ] ; then \
+ mkdir -p ${LIBS_PATH} ; \
+ cp ${LIBS} ${LIBS_PATH}; \
+ fi;
+
+
+clean:
+ @rm -f *.o
+ @rm -rf *.gdb *.a *.so
+
+distclean: clean
+ @rm -f tags cscope*
+
+.PHONY: clean entry
diff --git a/src/nbiotd/nbiot/nbiot_api.c b/src/nbiotd/nbiot/nbiot_api.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/nbiotd/nbiot/nbiot_api.c
--
Gitblit v1.9.1