From 5a8f31a2b5194e2c3f2f5fe6534c44c14db26fd6 Mon Sep 17 00:00:00 2001
From: Chen Han <1433255094@qq.com>
Date: Tue, 21 Jun 2022 16:42:04 +0000
Subject: [PATCH 1/2] add linux board project
---
board/Linux_Posix/hello_world/CMakeLists.txt | 41 +++
board/Linux_Posix/hello_world/Makefile | 50 ++++
board/Linux_Posix/hello_world/inc/lwipopts.h | 236 ++++++++++++++++++
.../Linux_Posix/hello_world/inc/tos_config.h | 51 ++++
board/Linux_Posix/hello_world/readme.md | 36 +++
board/Linux_Posix/hello_world/src/main.c | 53 ++++
board/Linux_Posix/mqtt_demo/CMakeLists.txt | 57 +++++
board/Linux_Posix/mqtt_demo/Makefile | 58 +++++
board/Linux_Posix/mqtt_demo/inc/mqtt_config.h | 27 ++
.../mqtt_demo/inc/socket_wrapper.h | 8 +
board/Linux_Posix/mqtt_demo/inc/tos_config.h | 46 ++++
board/Linux_Posix/mqtt_demo/readme.md | 79 ++++++
board/Linux_Posix/mqtt_demo/src/main.c | 104 ++++++++
.../mqtt_demo/src/socket_wrapper.c | 143 +++++++++++
14 files changed, 989 insertions(+)
create mode 100644 board/Linux_Posix/hello_world/CMakeLists.txt
create mode 100644 board/Linux_Posix/hello_world/Makefile
create mode 100644 board/Linux_Posix/hello_world/inc/lwipopts.h
create mode 100644 board/Linux_Posix/hello_world/inc/tos_config.h
create mode 100644 board/Linux_Posix/hello_world/readme.md
create mode 100644 board/Linux_Posix/hello_world/src/main.c
create mode 100644 board/Linux_Posix/mqtt_demo/CMakeLists.txt
create mode 100644 board/Linux_Posix/mqtt_demo/Makefile
create mode 100644 board/Linux_Posix/mqtt_demo/inc/mqtt_config.h
create mode 100644 board/Linux_Posix/mqtt_demo/inc/socket_wrapper.h
create mode 100644 board/Linux_Posix/mqtt_demo/inc/tos_config.h
create mode 100644 board/Linux_Posix/mqtt_demo/readme.md
create mode 100644 board/Linux_Posix/mqtt_demo/src/main.c
create mode 100644 board/Linux_Posix/mqtt_demo/src/socket_wrapper.c
diff --git a/board/Linux_Posix/hello_world/CMakeLists.txt b/board/Linux_Posix/hello_world/CMakeLists.txt
new file mode 100644
index 00000000..87905723
--- /dev/null
+++ b/board/Linux_Posix/hello_world/CMakeLists.txt
@@ -0,0 +1,41 @@
+cmake_minimum_required(VERSION 3.8)
+
+project(hello_world)
+
+set(CMAKE_BUILD_TYPE "Debug")
+set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
+set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
+
+set(TINY_ROOT ../../../)
+
+include_directories(${TINY_ROOT}/osal/cmsis_os)
+include_directories(${TINY_ROOT}/kernel/core/include)
+include_directories(${TINY_ROOT}/kernel/evtdrv/include)
+include_directories(${TINY_ROOT}/kernel/hal/include)
+include_directories(${TINY_ROOT}/kernel/pm/include)
+
+set(CMSIS_SRCS ${TINY_ROOT}/osal/cmsis_os/cmsis_os.c)
+aux_source_directory(${TINY_ROOT}/kernel/core CORE_SRCS)
+aux_source_directory(${TINY_ROOT}/kernel/evtdrv EVTDRV_SRCS)
+aux_source_directory(${TINY_ROOT}/kernel/pm PM_SRCS)
+
+set(ARCH_ROOT ${TINY_ROOT}/arch/linux)
+
+include_directories(${ARCH_ROOT}/common/include)
+include_directories(${ARCH_ROOT}/posix/gcc)
+
+aux_source_directory(${ARCH_ROOT}/common ARCH_COMMON_SRCS)
+aux_source_directory(${ARCH_ROOT}/posix/gcc ARCH_POSIX_SRCS)
+
+set(ARCH_SRCS ${ARCH_COMMON_SRCS} ${ARCH_POSIX_SRCS})
+
+set(TINY_SRCS ${ARCH_SRCS} ${CMSIS_SRCS} ${EVTDRV_SRCS} ${PM_SRCS} ${CORE_SRCS} )
+
+include_directories(./)
+include_directories(./inc)
+
+set(APP_SRCS src/main.c)
+
+add_executable(hello_world ${APP_SRCS} ${TINY_SRCS})
+
+target_link_libraries(hello_world pthread)
\ No newline at end of file
diff --git a/board/Linux_Posix/hello_world/Makefile b/board/Linux_Posix/hello_world/Makefile
new file mode 100644
index 00000000..ab86992e
--- /dev/null
+++ b/board/Linux_Posix/hello_world/Makefile
@@ -0,0 +1,50 @@
+###################################################################
+#automatic detection QTOP and LOCALDIR
+CUR_DIR := $(patsubst %/,%,$(dir $(realpath $(firstword $(MAKEFILE_LIST)))))
+TRYQTOP := $(shell if [ -n "$$QTOP" ] ; then\
+ echo $$QTOP;\
+ else\
+ cd $(CUR_DIR); while /usr/bin/test ! -e qmk ; do \
+ dir=`cd ../;pwd`; \
+ if [ "$$dir" = "/" ] ; then \
+ echo Cannot find QTOP in $(firstword $(MAKEFILE_LIST)) 1>&2; \
+ exit 1; \
+ fi ; \
+ cd $$dir; \
+ done ; \
+ pwd; \
+ fi)
+QTOP ?= $(realpath ${TRYQTOP})
+
+ifeq ($(QTOP),)
+$(error Please run this in a tree)
+endif
+LOCALDIR = $(patsubst %/,%,$(subst $(realpath $(QTOP))/,,$(CUR_DIR)))
+export QTOP
+
+####################################################################
+
+
+export BP=Linux_Posix
+
+TREE_LIB_ENABLE=1
+lib=
+subdirs =
+
+
+all::
+ make -C ${QTOP}/arch BP=${BP}
+ make -C ${QTOP}/kernel BP=${BP}
+ make -C ${QTOP}/osal BP=${BP}
+ make -C ${QTOP}/net BP=${BP}
+ make -C ${QTOP}/devices BP=${BP}
+exec =
+LD_A_FILES += $(LIBDIR)/libarch.a
+LD_A_FILES += $(LIBDIR)/libkernel.a
+LD_A_FILES += $(LIBDIR)/libhello_world.a
+LD_A_FILES += $(LIBDIR)/libcmsis_os.a
+LDFLAGS += -lpthread
+
+include ${QTOP}/qmk/generic/Make.exec
+
+
diff --git a/board/Linux_Posix/hello_world/inc/lwipopts.h b/board/Linux_Posix/hello_world/inc/lwipopts.h
new file mode 100644
index 00000000..7e9e2522
--- /dev/null
+++ b/board/Linux_Posix/hello_world/inc/lwipopts.h
@@ -0,0 +1,236 @@
+/**
+ ******************************************************************************
+ * @file lwipopts.h
+ * @author MCD Application Team
+ * @version V1.1.0
+ * @date 31-July-2013
+ * @brief lwIP Options Configuration.
+ * This file is based on Utilities\lwip_v1.4.1\src\include\lwip\opt.h
+ * and contains the lwIP configuration for the STM32F4x7 demonstration.
+ ******************************************************************************
+ * @attention
+ *
+ *
© COPYRIGHT 2013 STMicroelectronics
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+#ifndef __LWIPOPTS_H__
+#define __LWIPOPTS_H__
+
+/**
+ * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
+ * critical regions during buffer allocation, deallocation and memory
+ * allocation and deallocation.
+ */
+#define SYS_LIGHTWEIGHT_PROT 1
+
+/**
+ * NO_SYS==1: Provides VERY minimal functionality. Otherwise,
+ * use lwIP facilities.
+ */
+#define NO_SYS 0
+
+/**
+ * NO_SYS_NO_TIMERS==1: Drop support for sys_timeout when NO_SYS==1
+ * Mainly for compatibility to old versions.
+ */
+#define NO_SYS_NO_TIMERS 0
+
+/* ---------- Memory options ---------- */
+/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
+ lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
+ byte alignment -> define MEM_ALIGNMENT to 2. */
+#define MEM_ALIGNMENT 4
+
+/* MEM_SIZE: the size of the heap memory. If the application will send
+a lot of data that needs to be copied, this should be set high. */
+#define MEM_SIZE (5 * 1024)
+
+/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
+ sends a lot of data out of ROM (or other static memory), this
+ should be set high. */
+#define MEMP_NUM_PBUF 25
+/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
+ per active UDP "connection". */
+#define MEMP_NUM_UDP_PCB 4
+/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
+ connections. */
+#define MEMP_NUM_TCP_PCB 6
+/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
+ connections. */
+#define MEMP_NUM_TCP_PCB_LISTEN 6
+/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
+ segments. */
+#define MEMP_NUM_TCP_SEG 150
+/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
+ timeouts. */
+#define MEMP_NUM_SYS_TIMEOUT 6
+
+/* ---------- Pbuf options ---------- */
+/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
+#define PBUF_POOL_SIZE 25
+/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
+#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS + 40 + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN)
+
+/* ---------- TCP options ---------- */
+#define LWIP_TCP 1
+#define TCP_TTL 255
+
+/* Controls if TCP should queue segments that arrive out of
+ order. Define to 0 if your device is low on memory. */
+#define TCP_QUEUE_OOSEQ 0
+
+/* TCP Maximum segment size. */
+#define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */
+
+/* TCP sender buffer space (bytes). */
+#define TCP_SND_BUF (7 * TCP_MSS)
+
+/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
+ as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */
+
+#define TCP_SND_QUEUELEN (8 * TCP_SND_BUF / TCP_MSS)
+
+/* TCP receive window. */
+#define TCP_WND (9 * TCP_MSS)
+
+/* ---------- ICMP options ---------- */
+#define LWIP_ICMP 1
+
+/* ---------- DHCP options ---------- */
+/* Define LWIP_DHCP to 1 if you want DHCP configuration of
+ interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
+ turning this on does currently not work. */
+#define LWIP_DHCP 1
+
+/* ---------- UDP options ---------- */
+#define LWIP_UDP 1
+#define UDP_TTL 255
+
+/* ---------- Statistics options ---------- */
+#define LWIP_STATS 0
+#define LWIP_PROVIDE_ERRNO 1
+
+/* ---------- link callback options ---------- */
+/* LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface
+ * whenever the link changes (i.e., link down)
+ */
+#define LWIP_NETIF_LINK_CALLBACK 0
+/*
+ --------------------------------------
+ ---------- Checksum options ----------
+ --------------------------------------
+*/
+
+/*
+The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums by hardware:
+ - To use this feature let the following define uncommented.
+ - To disable it and process by CPU comment the the checksum.
+*/
+#define CHECKSUM_BY_HARDWARE
+//#undef CHECKSUM_BY_HARDWARE
+
+#ifdef CHECKSUM_BY_HARDWARE
+/* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/
+#define CHECKSUM_GEN_IP 0
+/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/
+#define CHECKSUM_GEN_UDP 0
+/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/
+#define CHECKSUM_GEN_TCP 0
+/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/
+#define CHECKSUM_CHECK_IP 0
+/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/
+#define CHECKSUM_CHECK_UDP 0
+/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/
+#define CHECKSUM_CHECK_TCP 0
+/* CHECKSUM_CHECK_ICMP==0: Check checksums by hardware for incoming ICMP packets.*/
+#define CHECKSUM_GEN_ICMP 0
+#else
+/* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/
+#define CHECKSUM_GEN_IP 1
+/* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/
+#define CHECKSUM_GEN_UDP 1
+/* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/
+#define CHECKSUM_GEN_TCP 1
+/* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/
+#define CHECKSUM_CHECK_IP 1
+/* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/
+#define CHECKSUM_CHECK_UDP 1
+/* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/
+#define CHECKSUM_CHECK_TCP 1
+/* CHECKSUM_CHECK_ICMP==1: Check checksums by hardware for incoming ICMP packets.*/
+#define CHECKSUM_GEN_ICMP 1
+#endif
+
+#define LWIP_TCPIP_CORE_LOCKING 1
+
+/*
+ ----------------------------------------------
+ ---------- Sequential layer options ----------
+ ----------------------------------------------
+*/
+/**
+ * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)
+ */
+#define LWIP_NETCONN 1
+
+/*
+ ------------------------------------
+ ---------- Socket options ----------
+ ------------------------------------
+*/
+/**
+ * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)
+ */
+#define LWIP_SOCKET 1
+
+/*
+ ---------------------------------
+ ---------- OS options ----------
+ ---------------------------------
+*/
+
+#define DEFAULT_UDP_RECVMBOX_SIZE 10
+#define DEFAULT_TCP_RECVMBOX_SIZE 10
+#define DEFAULT_ACCEPTMBOX_SIZE 10
+#define DEFAULT_THREAD_STACKSIZE 1024 * 2
+
+#define TCPIP_THREAD_NAME "lwip"
+#define TCPIP_THREAD_STACKSIZE 1024
+#define TCPIP_MBOX_SIZE 10
+#define TCPIP_THREAD_PRIO 1
+
+#define LWIP_DNS_API_DECLARE_STRUCTS 1
+#define LWIP_DNS 1
+
+/** DNS server IP address */
+#ifndef DNS_SERVER_ADDRESS
+#define DNS_SERVER_ADDRESS(ipaddr) (ip4_addr_set_u32(ipaddr, ipaddr_addr("208.67.222.222"))) /* resolver1.opendns.com */
+#endif
+
+/*
+ ----------------------------------------
+ ---------- Lwip Debug options ----------
+ ----------------------------------------
+*/
+#define LWIP_DEBUG 0
+
+#define ethernet_with_mac 1
+
+#endif /* __LWIPOPTS_H__ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/board/Linux_Posix/hello_world/inc/tos_config.h b/board/Linux_Posix/hello_world/inc/tos_config.h
new file mode 100644
index 00000000..4c75d6e4
--- /dev/null
+++ b/board/Linux_Posix/hello_world/inc/tos_config.h
@@ -0,0 +1,51 @@
+#ifndef _TOS_CONFIG_H_
+#define _TOS_CONFIG_H_
+
+#include "stddef.h"
+#include "stdint.h"
+
+#define TOS_CFG_TASK_PRIO_MAX 10u // 配置TencentOS tiny默认支持的最大优先级数量
+
+#define TOS_CFG_ROUND_ROBIN_EN 1u // 配置TencentOS tiny的内核是否开启时间片轮转
+
+#define TOS_CFG_OBJECT_VERIFY_EN 1u // 配置TencentOS tiny是否校验指针合法
+
+#define TOS_CFG_EVENT_EN 1u // TencentOS tiny 事件模块功能宏
+
+#define TOS_CFG_MMHEAP_EN 1u // 配置TencentOS tiny是否开启动态内存模块
+
+#define TOS_CFG_MMHEAP_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小
+
+#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小
+
+#define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否开启互斥锁模块
+
+#define TOS_CFG_MESSAGE_QUEUE_EN 1u
+#define TOS_CFG_MAIL_QUEUE_EN 1u
+
+#define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN 1u
+
+#define TOS_CFG_PRIORITY_MAIL_QUEUE_EN 1u
+#define TOS_CFG_TIMER_EN 1u // 配置TencentOS tiny是否开启软件定时器模块
+
+#define TOS_CFG_SEM_EN 1u // 配置TencentOS tiny是否开启信号量模块
+
+#define TOS_CFG_MMBLK_EN 1u
+
+#if (TOS_CFG_QUEUE_EN > 0u)
+#define TOS_CFG_MSG_EN 1u
+#else
+#define TOS_CFG_MSG_EN 0u
+#endif
+
+#define TOS_CFG_MSG_POOL_SIZE 10u // 配置TencentOS tiny消息队列大小
+
+#define TOS_CFG_IDLE_TASK_STK_SIZE 256u // 配置TencentOS tiny空闲任务栈大小
+
+#define TOS_CFG_CPU_TICK_PER_SECOND 1000u // 配置TencentOS tiny的tick频率
+
+#define TOS_CFG_CPU_CLOCK 1000000u // 配置TencentOS tiny CPU频率
+
+#define TOS_CFG_TIMER_AS_PROC 1u // 配置是否将TIMER配置成函数模式
+
+#endif
diff --git a/board/Linux_Posix/hello_world/readme.md b/board/Linux_Posix/hello_world/readme.md
new file mode 100644
index 00000000..a35c15da
--- /dev/null
+++ b/board/Linux_Posix/hello_world/readme.md
@@ -0,0 +1,36 @@
+# How to run the demo in linux
+
+## step1
+make sure your develop environment.
++ `cmake` and version greater than 3.8.2
++ `gcc` `gdb` `make` is installed
+
+## step2
+make `build` directory and compile in `build`
+
+```bash
+mkdir build && cd build
+cmake ..
+make
+```
+
+## step3
+run program !!
+
+```bash
+# in build directory
+./hello_world
+```
+
+## other
+you can copy this demo to other path, but if you want do it,
+you need modify `CMakeLists.txt`. find line
+
+```cmake
+set(TINY_ROOT ../../../)
+```
+
+and modify `path-to-tinyos`
+```cmake
+set(TINY_ROOT path-to-tinyos)
+```
diff --git a/board/Linux_Posix/hello_world/src/main.c b/board/Linux_Posix/hello_world/src/main.c
new file mode 100644
index 00000000..ce858a11
--- /dev/null
+++ b/board/Linux_Posix/hello_world/src/main.c
@@ -0,0 +1,53 @@
+#include "cmsis_os.h"
+
+#define TASK1_STK_SIZE 512
+void task1(void *arg);
+osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);
+
+#define TASK2_STK_SIZE 512
+void task2(void *arg);
+osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);
+
+void task1(void *arg)
+{
+ int count = 1;
+ while (1) {
+ printf("###This is task1, %d\r\n", count++);
+ osDelay(2000);
+ }
+}
+
+void task2(void *arg)
+{
+ int count = 1;
+ while (1) {
+#if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0u
+ k_err_t rc;
+ int depth;
+
+ rc = tos_task_stack_draught_depth(K_NULL, &depth);
+ printf("%d %d\n", rc, depth);
+#endif
+
+ printf("***This is task2, %d\r\n", count++);
+ osDelay(1000);
+ }
+}
+
+void application_entry(void *arg)
+{
+ osThreadCreate(osThread(task1), NULL); // Create task1
+ osThreadCreate(osThread(task2), NULL); // Create task2
+}
+
+
+int main(void)
+{
+ osKernelInitialize(); //TOS Tiny kernel initialize
+ application_entry(NULL);
+ osKernelStart(); //Start TOS Tiny
+
+ while (1)
+ {
+ }
+}
diff --git a/board/Linux_Posix/mqtt_demo/CMakeLists.txt b/board/Linux_Posix/mqtt_demo/CMakeLists.txt
new file mode 100644
index 00000000..35c3b8b9
--- /dev/null
+++ b/board/Linux_Posix/mqtt_demo/CMakeLists.txt
@@ -0,0 +1,57 @@
+cmake_minimum_required(VERSION 3.8)
+
+project(mqtt_demo)
+
+set(CMAKE_BUILD_TYPE "Debug")
+set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
+set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
+
+set(TINY_ROOT ../../../)
+
+## kernel
+include_directories(${TINY_ROOT}/osal/cmsis_os)
+include_directories(${TINY_ROOT}/kernel/core/include)
+include_directories(${TINY_ROOT}/kernel/evtdrv/include)
+include_directories(${TINY_ROOT}/kernel/hal/include)
+include_directories(${TINY_ROOT}/kernel/pm/include)
+
+set(CMSIS_SRCS ${TINY_ROOT}/osal/cmsis_os/cmsis_os.c)
+aux_source_directory(${TINY_ROOT}/kernel/core CORE_SRCS)
+aux_source_directory(${TINY_ROOT}/kernel/evtdrv EVTDRV_SRCS)
+aux_source_directory(${TINY_ROOT}/kernel/pm PM_SRCS)
+
+set(KERNEL_SRCS ${CMSIS_SRCS} ${EVTDRV_SRCS} ${PM_SRCS} ${CORE_SRCS})
+
+## net
+include_directories(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/3rdparty/include)
+include_directories(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/wrapper/include)
+include_directories(${TINY_ROOT}/net/sal_module_wrapper)
+
+aux_source_directory(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src MQTT_3RD_SRCS)
+aux_source_directory(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/wrapper/src MQTT_SRCS)
+aux_source_directory(${TINY_ROOT}/net/sal_module_wrapper SAL_SRCS)
+
+set(NET_SRCS ${MQTT_3RD_SRCS} ${MQTT_SRCS} ${SAL_SRCS})
+
+## arch
+set(ARCH_ROOT ${TINY_ROOT}/arch/linux)
+
+include_directories(${ARCH_ROOT}/common/include)
+include_directories(${ARCH_ROOT}/posix/gcc)
+
+aux_source_directory(${ARCH_ROOT}/common ARCH_COMMON_SRCS)
+aux_source_directory(${ARCH_ROOT}/posix/gcc ARCH_POSIX_SRCS)
+
+set(ARCH_SRCS ${ARCH_COMMON_SRCS} ${ARCH_POSIX_SRCS})
+
+set(TINY_SRCS ${ARCH_SRCS} ${KERNEL_SRCS} ${NET_SRCS})
+
+## app
+include_directories(./)
+include_directories(./inc)
+
+aux_source_directory(./src APP_SRCS)
+
+add_executable(mqtt_demo ${APP_SRCS} ${TINY_SRCS})
+
+target_link_libraries(mqtt_demo pthread)
\ No newline at end of file
diff --git a/board/Linux_Posix/mqtt_demo/Makefile b/board/Linux_Posix/mqtt_demo/Makefile
new file mode 100644
index 00000000..180951cb
--- /dev/null
+++ b/board/Linux_Posix/mqtt_demo/Makefile
@@ -0,0 +1,58 @@
+###################################################################
+#automatic detection QTOP and LOCALDIR
+CUR_DIR := $(patsubst %/,%,$(dir $(realpath $(firstword $(MAKEFILE_LIST)))))
+TRYQTOP := $(shell if [ -n "$$QTOP" ] ; then\
+ echo $$QTOP;\
+ else\
+ cd $(CUR_DIR); while /usr/bin/test ! -e qmk ; do \
+ dir=`cd ../;pwd`; \
+ if [ "$$dir" = "/" ] ; then \
+ echo Cannot find QTOP in $(firstword $(MAKEFILE_LIST)) 1>&2; \
+ exit 1; \
+ fi ; \
+ cd $$dir; \
+ done ; \
+ pwd; \
+ fi)
+QTOP ?= $(realpath ${TRYQTOP})
+
+ifeq ($(QTOP),)
+$(error Please run this in a tree)
+endif
+LOCALDIR = $(patsubst %/,%,$(subst $(realpath $(QTOP))/,,$(CUR_DIR)))
+export QTOP
+
+####################################################################
+
+
+export BP=Linux_Posix
+
+TREE_LIB_ENABLE=1
+lib=
+subdirs =
+
+CFGFLAGS += -I$(CUR_DIR)/inc
+CFGFLAGS += -I$(QTOP)/net/sal_module_wrapper
+CFGFLAGS += -I$(QTOP)/components/connectivity/Eclipse-Paho-MQTT/wrapper/include
+CFGFLAGS += -I$(QTOP)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/include
+
+all::
+ make -C ${QTOP}/arch BP=Linux_Posix
+ make -C ${QTOP}/kernel
+ make -C ${QTOP}/osal
+ make -C ${QTOP}/net
+ make -C ${QTOP}/devices
+ make -C ${QTOP}/components/connectivity/Eclipse-Paho-MQTT
+
+exec =
+LD_A_FILES += $(LIBDIR)/libarch.a
+LD_A_FILES += $(LIBDIR)/libkernel.a
+LD_A_FILES += $(LIBDIR)/libhello_world.a
+LD_A_FILES += $(LIBDIR)/libcmsis_os.a
+LD_A_FILES += $(LIBDIR)/libEclipse-Paho-MQTT.a
+LD_A_FILES += $(LIBDIR)/libsal_module_wrapper.a
+LDFLAGS += -lpthread
+
+include ${QTOP}/qmk/generic/Make.exec
+
+
diff --git a/board/Linux_Posix/mqtt_demo/inc/mqtt_config.h b/board/Linux_Posix/mqtt_demo/inc/mqtt_config.h
new file mode 100644
index 00000000..a9342b76
--- /dev/null
+++ b/board/Linux_Posix/mqtt_demo/inc/mqtt_config.h
@@ -0,0 +1,27 @@
+#ifndef TOS_MQTT_CONFIG_H
+#define TOS_MQTT_CONFIG_H
+
+#define MQTT_SERVER_IP "111.230.189.156"
+#define MQTT_SERVER_PORT "1883"
+#define MQTT_PRODUCT_ID "$product"
+#define MQTT_DEV_NAME "$dev"
+#define MQTT_CLIENT_ID "$product$dev"
+#define MQTT_USR_NAME "$product$dev;21010406;12365;4294967295"
+#define MQTT_PASSWORD "$sign;hmacsha1"
+#define MQTT_SUBSCRIBE_TOPIC "$product/$dev/$sub"
+#define MQTT_PUBLISH_TOPIC "$product/$dev/$pub"
+
+//#error please replace yourself server configuration
+/**
+ * 1. run python tool
+ * ```
+ * cd tiny/tools/
+ * python3 mqtt_config_gen.py
+ * ```
+ * then input your server information
+ *
+ * 2. tool will generate `mqtt_config.h` file, copy to replace this file
+ */
+
+#endif
+
diff --git a/board/Linux_Posix/mqtt_demo/inc/socket_wrapper.h b/board/Linux_Posix/mqtt_demo/inc/socket_wrapper.h
new file mode 100644
index 00000000..0df6bc06
--- /dev/null
+++ b/board/Linux_Posix/mqtt_demo/inc/socket_wrapper.h
@@ -0,0 +1,8 @@
+#ifndef _SOCKET_WRAPPER_
+#define _SOCKET_WRAPPER_
+
+#include "sal_module_wrapper.h"
+
+sal_module_t *get_socket_module(void);
+
+#endif //_SOCKET_WRAPPER_
\ No newline at end of file
diff --git a/board/Linux_Posix/mqtt_demo/inc/tos_config.h b/board/Linux_Posix/mqtt_demo/inc/tos_config.h
new file mode 100644
index 00000000..7cd5e2a9
--- /dev/null
+++ b/board/Linux_Posix/mqtt_demo/inc/tos_config.h
@@ -0,0 +1,46 @@
+#ifndef _TOS_CONFIG_H_
+#define _TOS_CONFIG_H_
+
+#include "stddef.h"
+
+#define TOS_CFG_TASK_PRIO_MAX 10u // 配置TencentOS tiny默认支持的最大优先级数量
+
+#define TOS_CFG_ROUND_ROBIN_EN 1u // 配置TencentOS tiny的内核是否开启时间片轮转
+
+#define TOS_CFG_OBJECT_VERIFY 0u // 配置TencentOS tiny是否校验指针合法
+
+#define TOS_CFG_EVENT_EN 1u // TencentOS tiny 事件模块功能宏
+
+#define TOS_CFG_MMHEAP_EN 1u // 配置TencentOS tiny是否开启动态内存模块
+
+#define TOS_CFG_MMHEAP_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小
+
+#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小
+
+#define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否开启互斥锁模块
+
+#define TOS_CFG_QUEUE_EN 1u // 配置TencentOS tiny是否开启队列模块
+
+#define TOS_CFG_TIMER_EN 1u // 配置TencentOS tiny是否开启软件定时器模块
+
+#define TOS_CFG_SEM_EN 1u // 配置TencentOS tiny是否开启信号量模块
+
+#define TOS_CFG_MMBLK_EN 1u
+
+#if (TOS_CFG_QUEUE_EN > 0u)
+#define TOS_CFG_MSG_EN 1u
+#else
+#define TOS_CFG_MSG_EN 0u
+#endif
+
+#define TOS_CFG_MSG_POOL_SIZE 10u // 配置TencentOS tiny消息队列大小
+
+#define TOS_CFG_IDLE_TASK_STK_SIZE 256u // 配置TencentOS tiny空闲任务栈大小
+
+#define TOS_CFG_CPU_TICK_PER_SECOND 1000u // 配置TencentOS tiny的tick频率
+
+#define TOS_CFG_CPU_CLOCK 1000000u // 配置TencentOS tiny CPU频率
+
+#define TOS_CFG_TIMER_AS_PROC 1u // 配置是否将TIMER配置成函数模式
+
+#endif
\ No newline at end of file
diff --git a/board/Linux_Posix/mqtt_demo/readme.md b/board/Linux_Posix/mqtt_demo/readme.md
new file mode 100644
index 00000000..821f52a1
--- /dev/null
+++ b/board/Linux_Posix/mqtt_demo/readme.md
@@ -0,0 +1,79 @@
+# How to run the demo in linux
+
+## step1
+make sure your develop environment.
++ `cmake` and version greater than 3.8.2
++ `gcc` `gdb` `make` is installed
+
+## step2
+configure your server and add a transmit rule
+
+reference [tencent cloud IoT guide?](../../../doc/8.TencentOS-tiny对接腾讯云IoTHub开发指南.md)
+
+additional thing, add a rule for send a message to the demo
+1. select filter topic is the ${demo device}/event and
+SELECT * FROM ${demo device}/event
+2. select action type is Republish and topic is the ${demo device}/control
+
+the page like this
+_____________________________________________
+|规则引擎
+|--------------------------------------------
+|基本信息
+|规则名称 loop
+|规则描述 未填写
+|--------------------------------------------
+|筛选数据
+|字段 *
+|Topic ${demo device}/event
+|条件
+|当前SQL语句是:
+|SELECT * ${demo device}/event
+|--------------------------------------------
+|行为操作
+|行为类型 数据转发到另一个Topic ( Republish )
+|Topic ${demo device}/control
+| ...
+_____________________________________________
+
+
+## step3
+generate `mqtt_config.h` file to replace `./inc/mqtt_config.h`
+
+cd `tiny/tools/` directory, run python script
+```bash
+python3 mqtt_config_gen.py
+```
+
+then input your server configuration, generate `mqtt_config.h` file
+copy to `./inc/` replace old file
+
+## step4
+make `build` directory and compile in `build`
+
+```bash
+mkdir build && cd build
+cmake ..
+make
+```
+
+## step5
+run program !!
+
+```bash
+# in build directory
+./mqtt_demo
+```
+
+## other
+you can copy this demo to other path, but if you want do it,
+you need modify `CMakeLists.txt`. find line
+
+```cmake
+set(TINY_ROOT ../../../)
+```
+
+and modify `path-to-tinyos`
+```cmake
+set(TINY_ROOT path-to-tinyos)
+```
diff --git a/board/Linux_Posix/mqtt_demo/src/main.c b/board/Linux_Posix/mqtt_demo/src/main.c
new file mode 100644
index 00000000..b2c150cf
--- /dev/null
+++ b/board/Linux_Posix/mqtt_demo/src/main.c
@@ -0,0 +1,104 @@
+#include "cmsis_os.h"
+#include "socket_wrapper.h"
+#include "sal_module_wrapper.h"
+#include "mqtt_wrapper.h"
+#include "mqtt_config.h"
+
+#include
+
+int sock_id = 0;
+
+//mqtt_publisher
+#define MQTT_PUBLISHER_STK_SIZE 1024
+void mqtt_publisher(void *pdata);
+osThreadDef(mqtt_publisher, osPriorityNormal, 1, MQTT_PUBLISHER_STK_SIZE);
+
+//mqtt_reciever
+#define MQTT_RECIEVER_STK_SIZE 1024
+void mqtt_reciever(void *pdata);
+osThreadDef(mqtt_reciever, osPriorityNormal, 1, MQTT_RECIEVER_STK_SIZE);
+
+void mqtt_publisher(void *pdata)
+{
+ mqtt_con_opt_t con_param;
+ con_param.keep_alive_interval = 2000;
+ con_param.cleansession = 1;
+ con_param.username = MQTT_USR_NAME;
+ con_param.password = MQTT_PASSWORD;
+ con_param.client_id = MQTT_CLIENT_ID;
+
+ mqtt_pub_opt_t pub_param;
+ pub_param.dup = 0;
+ pub_param.qos = 0;
+ pub_param.retained = 0;
+ pub_param.id = 0;
+ pub_param.payload = "hello tencent cloud";
+ pub_param.payload_len = 20;
+ pub_param.topic = MQTT_PUBLISH_TOPIC;
+
+ mqtt_sub_opt_t sub_param;
+ sub_param.count = 1;
+ sub_param.dup = 0;
+ sub_param.id = 0;
+ sub_param.req_qos = 0;
+ sub_param.topic = MQTT_SUBSCRIBE_TOPIC;
+
+ printf("start connect\n");
+ tos_sal_module_register(get_socket_module());
+ tos_sal_module_init();
+
+ sock_id = tos_mqtt_connect(MQTT_SERVER_IP, MQTT_SERVER_PORT, &con_param);
+ if (sock_id == -1)
+ {
+ printf("connect failed!!!\n");
+ return -1; //to exit thread
+ }
+ printf("connect success\n");
+
+ if (tos_mqtt_subscribe(sock_id, &sub_param) != 0)
+ {
+ printf("subscribe failed!!!\n");
+ }else{
+ printf("subscribe success\n");
+ }
+
+ osThreadCreate(osThread(mqtt_reciever), NULL); // start receive
+
+ for (;;)
+ {
+ printf("\n");
+ printf("publish topic-->%s| data-->%s| \n", pub_param.topic, pub_param.payload);
+ if (tos_mqtt_publish(sock_id, &pub_param) != 0) {
+ printf("publish failed!!!\n");
+ }
+ osDelay(2000);
+ }
+}
+
+void mqtt_reciever(void *pdata)
+{
+ uint8_t read_data[100];
+ int8_t topic[30];
+ uint32_t read_len;
+
+ for (;;)
+ {
+ read_len = tos_mqtt_receive(topic, sizeof(topic), read_data, sizeof(read_data));
+ if (read_len >= 0)
+ {
+ printf("receive topic-->%s| data-->%s| \n", topic, read_data);
+ }
+ osDelay(100);
+ }
+}
+
+int main(void)
+{
+ osKernelInitialize(); //TOS Tiny kernel initialize
+ osThreadCreate(osThread(mqtt_publisher), NULL); // start connect and publish
+ osKernelStart(); //Start TOS Tiny
+
+ while (1)
+ {
+ }
+}
diff --git a/board/Linux_Posix/mqtt_demo/src/socket_wrapper.c b/board/Linux_Posix/mqtt_demo/src/socket_wrapper.c
new file mode 100644
index 00000000..8ee2b3cd
--- /dev/null
+++ b/board/Linux_Posix/mqtt_demo/src/socket_wrapper.c
@@ -0,0 +1,143 @@
+#include "socket_wrapper.h"
+#include "cmsis_os.h"
+
+#include
+#include
+#include
+#include
+#include
+
+static osMutexId socket_send_lock, socket_recv_lock;
+
+osMutexDef(socket_send_lock);
+osMutexDef(socket_recv_lock);
+
+static osSemaphoreId socket_recv_event;
+osSemaphoreDef(socket_recv_event);
+
+int socket_init(void)
+{
+ socket_send_lock = osMutexCreate(osMutex(socket_send_lock));
+ socket_recv_lock = osMutexCreate(osMutex(socket_recv_lock));
+ socket_recv_event = osSemaphoreCreate(osSemaphore(socket_recv_event),0);
+
+ return (
+ (socket_recv_event != NULL) &&
+ (socket_recv_lock != NULL) &&
+ (socket_send_lock != NULL)
+ );
+}
+
+void io_signal_handle(int signal)
+{
+ osSemaphoreRelease(socket_recv_event);
+}
+
+int socket_connect(const char *ip, const char *port, sal_proto_t proto)
+{
+ struct sockaddr_in addr = {
+ .sin_family = AF_INET,
+ .sin_port = htons(atoi(port))};
+ int socket_proto = 0;
+ struct sigaction sig_install;
+
+ inet_pton(AF_INET, ip, &addr.sin_addr);
+
+ if (TOS_SAL_PROTO_TCP == proto)
+ {
+ socket_proto = IPPROTO_TCP;
+ }
+ else if (TOS_SAL_PROTO_UDP == proto)
+ {
+ socket_proto = IPPROTO_UDP;
+ }
+ else
+ {
+ return -1;
+ }
+
+ int socket_id = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+ fcntl( socket_id, __F_SETOWN, getpid() );
+ fcntl( socket_id, __F_SETSIG, SIGIO );
+ fcntl( socket_id, F_SETFL, O_ASYNC );
+
+ sig_install.sa_flags = 0;
+ sig_install.sa_handler = io_signal_handle;
+ sigfillset( &sig_install.sa_mask );
+
+ if ( 0 != sigaction( SIGIO, &sig_install, NULL ) )
+ {
+ printf( "socket problem installing %d\n",SIGIO );
+ }
+
+ connect(socket_id, &addr, sizeof(addr));
+ return socket_id;
+}
+
+int socket_send(int sock, const void *buf, size_t len)
+{
+ ssize_t send_len = 0, state;
+ if (sock < 0)
+ return -1;
+ osMutexWait(socket_send_lock, TOS_TIME_FOREVER);
+ do
+ {
+ state = send(sock, (buf + send_len), (len - send_len), MSG_DONTWAIT);
+ if (state > 0)
+ {
+ send_len += state;
+ }
+ if (send_len != len)
+ {
+ osSemaphoreWait(socket_recv_event,100);
+ }
+ } while (len != send_len);
+ osMutexRelease(socket_send_lock);
+ return send_len;
+}
+
+int socket_recv(int sock, void *buf, size_t len)
+{
+ ssize_t recv_len = 0, state;
+ if (sock < 0)
+ return -1;
+ osMutexWait(socket_recv_lock, TOS_TIME_FOREVER);
+ do
+ {
+ state = recv(sock, (buf + recv_len), (len - recv_len), MSG_DONTWAIT);
+ if (state > 0)
+ {
+ recv_len += state;
+ }
+ if (recv_len != len)
+ {
+ osSemaphoreWait(socket_recv_event,100);
+ }
+ } while (len != recv_len);
+ osMutexRelease(socket_recv_lock);
+ return recv_len;
+}
+
+int socket_close(int sock)
+{
+ close(sock);
+}
+
+static sal_module_t linux_sal = {
+ .init = socket_init,
+ .connect = socket_connect,
+ .send = socket_send,
+ .recv = socket_recv,
+ .close = socket_close,
+ // .sendto = NULL,
+ // .recv_timeout = NULL,
+ // .recvfrom = NULL,
+ // .recvfrom_timeout = NULL,
+ // .parse_domain = NULL,
+};
+
+sal_module_t *get_socket_module(void)
+{
+ return (&linux_sal);
+}
From 4c4ac49b7654f614fb3487414bcbbe1d16cfb4d6 Mon Sep 17 00:00:00 2001
From: Chen Han <1433255094@qq.com>
Date: Tue, 21 Jun 2022 18:13:09 +0000
Subject: [PATCH 2/2] update demo mqtt to mqttclient
---
board/Linux_Posix/mqtt_demo/CMakeLists.txt | 41 ++++++--
board/Linux_Posix/mqtt_demo/src/main.c | 116 ++++++++++-----------
2 files changed, 88 insertions(+), 69 deletions(-)
diff --git a/board/Linux_Posix/mqtt_demo/CMakeLists.txt b/board/Linux_Posix/mqtt_demo/CMakeLists.txt
index 35c3b8b9..7c181711 100644
--- a/board/Linux_Posix/mqtt_demo/CMakeLists.txt
+++ b/board/Linux_Posix/mqtt_demo/CMakeLists.txt
@@ -8,6 +8,8 @@ set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
set(TINY_ROOT ../../../)
+add_definitions(-DMQTT_NETWORK_TYPE_NO_TLS -DMQTT_NETSOCKET_USING_AT)
+
## kernel
include_directories(${TINY_ROOT}/osal/cmsis_os)
include_directories(${TINY_ROOT}/kernel/core/include)
@@ -23,15 +25,37 @@ aux_source_directory(${TINY_ROOT}/kernel/pm PM_SRCS)
set(KERNEL_SRCS ${CMSIS_SRCS} ${EVTDRV_SRCS} ${PM_SRCS} ${CORE_SRCS})
## net
-include_directories(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/3rdparty/include)
-include_directories(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/wrapper/include)
include_directories(${TINY_ROOT}/net/sal_module_wrapper)
+include_directories(${TINY_ROOT}/components/connectivity/mqttclient/mqttclient)
-aux_source_directory(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src MQTT_3RD_SRCS)
-aux_source_directory(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/wrapper/src MQTT_SRCS)
aux_source_directory(${TINY_ROOT}/net/sal_module_wrapper SAL_SRCS)
-set(NET_SRCS ${MQTT_3RD_SRCS} ${MQTT_SRCS} ${SAL_SRCS})
+set(MQTT_ROOT ${TINY_ROOT}/components/connectivity/mqttclient)
+include_directories(${MQTT_ROOT}/common)
+include_directories(${MQTT_ROOT}/common/log)
+include_directories(${MQTT_ROOT}/mqtt)
+include_directories(${MQTT_ROOT}/mqttclient)
+include_directories(${MQTT_ROOT}/network)
+include_directories(${MQTT_ROOT}/platform/TencentOS-tiny)
+
+aux_source_directory(${MQTT_ROOT}/common MQTT_COMMON)
+aux_source_directory(${MQTT_ROOT}/common/log MQTT_COMMON_LOG)
+aux_source_directory(${MQTT_ROOT}/mqttclient MQTT_CLIENT)
+aux_source_directory(${MQTT_ROOT}/mqtt MQTT_CORE)
+aux_source_directory(${MQTT_ROOT}/network MQTT_NETWORK)
+aux_source_directory(${MQTT_ROOT}/platform/TencentOS-tiny MQTT_PLATFORM)
+
+set(MQTT_SRCS
+ ${MQTT_ROOT}/common/log/arch/tencentos-tiny/arch.c
+ ${MQTT_COMMON}
+ ${MQTT_COMMON_LOG}
+ ${MQTT_CLIENT}
+ ${MQTT_CORE}
+ ${MQTT_NETWORK}
+ ${MQTT_PLATFORM}
+)
+
+set(NET_SRCS ${MQTT_SRCS} ${SAL_SRCS})
## arch
set(ARCH_ROOT ${TINY_ROOT}/arch/linux)
@@ -44,7 +68,12 @@ aux_source_directory(${ARCH_ROOT}/posix/gcc ARCH_POSIX_SRCS)
set(ARCH_SRCS ${ARCH_COMMON_SRCS} ${ARCH_POSIX_SRCS})
-set(TINY_SRCS ${ARCH_SRCS} ${KERNEL_SRCS} ${NET_SRCS})
+
+include_directories(${TINY_ROOT}/components/utils/JSON/include)
+
+set(UTILS_SRCS ${TINY_ROOT}/components/utils/JSON/src/cJSON.c)
+
+set(TINY_SRCS ${ARCH_SRCS} ${KERNEL_SRCS} ${NET_SRCS} ${UTILS_SRCS})
## app
include_directories(./)
diff --git a/board/Linux_Posix/mqtt_demo/src/main.c b/board/Linux_Posix/mqtt_demo/src/main.c
index b2c150cf..a2e55108 100644
--- a/board/Linux_Posix/mqtt_demo/src/main.c
+++ b/board/Linux_Posix/mqtt_demo/src/main.c
@@ -1,8 +1,9 @@
#include "cmsis_os.h"
#include "socket_wrapper.h"
#include "sal_module_wrapper.h"
-#include "mqtt_wrapper.h"
+// #include "mqtt_wrapper.h"
#include "mqtt_config.h"
+#include "mqttclient.h"
#include
@@ -13,84 +14,73 @@ int sock_id = 0;
void mqtt_publisher(void *pdata);
osThreadDef(mqtt_publisher, osPriorityNormal, 1, MQTT_PUBLISHER_STK_SIZE);
-//mqtt_reciever
-#define MQTT_RECIEVER_STK_SIZE 1024
-void mqtt_reciever(void *pdata);
-osThreadDef(mqtt_reciever, osPriorityNormal, 1, MQTT_RECIEVER_STK_SIZE);
+static void tos_topic_handler(void* client, message_data_t* msg)
+{
+ (void)client;
+ MQTT_LOG_I("-----------------------------------------------------------------------------------");
+ MQTT_LOG_I("%s:%d %s()...\ntopic: %s, qos: %d. \nmessage:\n\t%s\n", __FILE__, __LINE__, __FUNCTION__,
+ msg->topic_name, msg->message->qos, (char *)msg->message->payload);
+ MQTT_LOG_I("-----------------------------------------------------------------------------------\n");
+}
void mqtt_publisher(void *pdata)
{
- mqtt_con_opt_t con_param;
- con_param.keep_alive_interval = 2000;
- con_param.cleansession = 1;
- con_param.username = MQTT_USR_NAME;
- con_param.password = MQTT_PASSWORD;
- con_param.client_id = MQTT_CLIENT_ID;
+ int error;
+ char buf[100] = {0};
+ mqtt_client_t *client = NULL;
+ mqtt_message_t msg;
- mqtt_pub_opt_t pub_param;
- pub_param.dup = 0;
- pub_param.qos = 0;
- pub_param.retained = 0;
- pub_param.id = 0;
- pub_param.payload = "hello tencent cloud";
- pub_param.payload_len = 20;
- pub_param.topic = MQTT_PUBLISH_TOPIC;
+ memset(&msg, 0, sizeof(msg));
- mqtt_sub_opt_t sub_param;
- sub_param.count = 1;
- sub_param.dup = 0;
- sub_param.id = 0;
- sub_param.req_qos = 0;
- sub_param.topic = MQTT_SUBSCRIBE_TOPIC;
+ mqtt_log_init();
+ client = mqtt_lease();
- printf("start connect\n");
- tos_sal_module_register(get_socket_module());
- tos_sal_module_init();
+ mqtt_set_port(client, MQTT_SERVER_PORT);
+ mqtt_set_host(client, MQTT_SERVER_IP);
+ mqtt_set_client_id(client, MQTT_CLIENT_ID);
+ mqtt_set_user_name(client, MQTT_USR_NAME);
+ mqtt_set_password(client, MQTT_PASSWORD);
+ mqtt_set_clean_session(client, 1);
- sock_id = tos_mqtt_connect(MQTT_SERVER_IP, MQTT_SERVER_PORT, &con_param);
- if (sock_id == -1)
- {
- printf("connect failed!!!\n");
- return -1; //to exit thread
- }
- printf("connect success\n");
+ error = mqtt_connect(client);
- if (tos_mqtt_subscribe(sock_id, &sub_param) != 0)
- {
- printf("subscribe failed!!!\n");
- }else{
- printf("subscribe success\n");
- }
+ MQTT_LOG_D("mqtt connect error is %#x", error);
- osThreadCreate(osThread(mqtt_reciever), NULL); // start receive
+ mqtt_subscribe(client, MQTT_SUBSCRIBE_TOPIC, QOS0, tos_topic_handler);
+
+ MQTT_LOG_D("mqtt subscribe error is %#x", error);
+
+ memset(&msg, 0, sizeof(msg));
for (;;)
{
- printf("\n");
- printf("publish topic-->%s| data-->%s| \n", pub_param.topic, pub_param.payload);
- if (tos_mqtt_publish(sock_id, &pub_param) != 0) {
- printf("publish failed!!!\n");
- }
- osDelay(2000);
+ sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number());
+
+ msg.qos = QOS0;
+ msg.payload = (void *)buf;
+
+ error = mqtt_publish(client, MQTT_PUBLISH_TOPIC, &msg);
+
+ osDelay(4000);
}
}
-void mqtt_reciever(void *pdata)
-{
- uint8_t read_data[100];
- int8_t topic[30];
- uint32_t read_len;
+// void mqtt_reciever(void *pdata)
+// {
+// uint8_t read_data[100];
+// int8_t topic[30];
+// uint32_t read_len;
- for (;;)
- {
- read_len = tos_mqtt_receive(topic, sizeof(topic), read_data, sizeof(read_data));
- if (read_len >= 0)
- {
- printf("receive topic-->%s| data-->%s| \n", topic, read_data);
- }
- osDelay(100);
- }
-}
+// for (;;)
+// {
+// read_len = tos_mqtt_receive(topic, sizeof(topic), read_data, sizeof(read_data));
+// if (read_len >= 0)
+// {
+// printf("receive topic-->%s| data-->%s| \n", topic, read_data);
+// }
+// osDelay(100);
+// }
+// }
int main(void)
{