Skip to content

Commit

Permalink
v3.2.0
Browse files Browse the repository at this point in the history
1. 合并mtmc分支代码,支持多设备连接,优化多线程接口
2. 修复一些潜在的内存泄漏及越界问题,以及跨平台编译运行问题
2. 使用clang-format格式化代码,引入代码检查工具clang-tidy及cpplint
  • Loading branch information
spikelin committed Apr 30, 2020
1 parent af25f2e commit 33118e9
Show file tree
Hide file tree
Showing 163 changed files with 7,932 additions and 7,323 deletions.
9 changes: 9 additions & 0 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
BasedOnStyle: Google
BreakBeforeBraces: Linux
AlignConsecutiveDeclarations: true
AlignConsecutiveMacros: true
AlignConsecutiveAssignments: true
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: false
IndentWidth: 4
ColumnLimit: 120
21 changes: 11 additions & 10 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ set(FEATURE_MQTT_COMM_ENABLED ON)
set(FEATURE_MQTT_DEVICE_SHADOW ON)

# 是否打开CoAP通道的总开关
set(FEATURE_COAP_COMM_ENABLED ON)
set(FEATURE_COAP_COMM_ENABLED OFF)

# 是否打开MQTT通道网关功能
set(FEATURE_GATEWAY_ENABLED ON)
Expand All @@ -42,8 +42,11 @@ set(FEATURE_AUTH_MODE "KEY")
# 接入认证是否不使用TLS,证书方式必须选择使用TLS,密钥认证可选择不使用TLS
set(FEATURE_AUTH_WITH_NOTLS OFF)

# 是否打开多线程功能支持
set(FEATURE_MULTITHREAD_ENABLED ON)

# 是否使能设备动态注册
set(FEATURE_DEV_DYN_REG_ENABLED OFF)
set(FEATURE_DEV_DYN_REG_ENABLED ON)

# 是否打开日志上报云端功能
set(FEATURE_LOG_UPLOAD_ENABLED OFF)
Expand All @@ -54,27 +57,24 @@ set(FEATURE_DEBUG_DEV_INFO_USED OFF)
# 是否打开获取iot后台时间功能
set(FEATURE_SYSTEM_COMM_ENABLED ON)

# 是否使用HTTPS下载固件
set(FEATURE_OTA_USE_HTTPS ON)

# 是否打开AT模组TCP功能
set(FEATURE_AT_TCP_ENABLED OFF)

# 设置AT模组设备(目前只支持esp8266)
set(AT_DEVICE_NAME "esp8266")

# 是否打开AT模组中断接收功能
set(FEATURE_AT_UART_RECV_IRQ ON)
set(FEATURE_AT_UART_RECV_IRQ OFF)

# 是否打开AT模组多线程功能
set(FEATURE_AT_OS_USED ON)
set(FEATURE_AT_OS_USED OFF)

# 是否打开AT模组调试功能
set(FEATURE_AT_DEBUG OFF)

# 是否编译Linux多线程测试例程
set(FEATURE_MULTITHREAD_TEST_ENABLED ON)

# 是否使用HTTPS下载固件
set(FEATURE_OTA_USE_HTTPS ON)

######################CONFIG END######################################

# 设置CMAKE使用编译工具及编译选项
Expand Down Expand Up @@ -141,6 +141,7 @@ option(GATEWAY_ENABLED "Enable GATEWAY" ${FEATURE_GATEWAY_ENABLED})
option(AUTH_WITH_NOTLS "Enable AUTH_WITH_NOTLS" ${FEATURE_AUTH_WITH_NOTLS})
option(COAP_COMM_ENABLED "Enable COAP_COMM" ${FEATURE_COAP_COMM_ENABLED})
option(SYSTEM_COMM "Enable SYSTEM_COMM" ${FEATURE_SYSTEM_COMM_ENABLED})
option(MULTITHREAD_ENABLED "Enable Multi-thread support" ${FEATURE_MULTITHREAD_ENABLED})
option(DEV_DYN_REG_ENABLED "Enable DEV_DYN_REG" ${FEATURE_DEV_DYN_REG_ENABLED})
option(LOG_UPLOAD "Enable LOG_UPLOAD" ${FEATURE_LOG_UPLOAD_ENABLED})
option(DEBUG_DEV_INFO_USED "Enable DEBUG_DEV_INFO_USED" ${FEATURE_DEBUG_DEV_INFO_USED})
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ C-SDK的samples目录有使用各个功能的示例,关于运行示例的详

## 五、注意事项

#### 多设备连接
从版本3.2.0开始,SDK支持多个设备作为客户端同时访问物联网后台,并对多线程环境下的接口使用进行优化增强,具体请参考docs目录文档**C-SDK_MTMC多线程多设备支持**
该版本以面向对象方式对状态变量和参数进行封装,对外部接口的影响是证书设备进行初始化上有变化,其他的接口都没有变化,用户只要参考相关示例修改_setup_connect_init_params函数即可。

#### OTA升级API变化
从SDK版本3.0.3开始,OTA升级支持了断点续传,当固件下载过程中如果因为网络异常或其他原因被打断,可以将已经下载的固件部分保存,在下次恢复下载时候可以不用从零开始下载,而是从未下载的部分开始。
在支持这一新特性之后,OTA相关API的使用方法发生了变化,对于从3.0.2及以前的版本升级的用户,需要修改用户逻辑代码,否则固件下载会失败,请参考**samples/ota/ota_mqtt_sample.c**进行修改。
Expand Down
27 changes: 25 additions & 2 deletions cmake_build.sh
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
#! /bin/bash

if [ "$#" -eq "0" ]; then
rm -rf output
rm -rf build
echo "Build all (SDK libs and samples)"
mkdir -p build
cd build
cmake ..
#-DSAMPLE_ONLY=OFF ..
make
exit
elif [ "$#" -eq "1" -a $1 == "samples" ]; then
Expand All @@ -29,7 +30,29 @@ elif [ "$#" -eq "1" -a $1 == "clean" ]; then
rm -rf output
rm -rf build
exit
elif [ "$#" -eq "1" -a $1 == "code-check" ]; then
# code-check requires clang-tidy and cpplint
# sudo apt install clang-tidy
# pip install cpplint
echo "run code check"
rm -rf build
mkdir -p build
cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
echo "clang-tidy check begin"
clang_extra_arg="-extra-arg=-I/usr/lib/gcc/x86_64-linux-gnu/7/include -extra-arg=-I/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed"
clang_check_rules="-checks=-clang-analyzer-osx*,-clang-analyzer-security.insecureAPI.strcpy,-clang-diagnostic-missing-braces,-clang-diagnostic-varargs"
../tools/run-clang-tidy ${clang_extra_arg} ${clang_check_rules} >../code-check-clang-tidy.txt
echo "clang-tidy check end"
echo "cpplint check begin"
cd ..
# find ./samples/ ./include/ ./sdk_src/ ./platform/ -name *.c -o -name *.h | xargs clang-format -i
cpplint_rules="--filter=-whitespace/line_length,-readability/casting,-build/include_subdir,-whitespace/braces,-whitespace/comments,-whitespace/blank_line,-whitespace/parens,-whitespace/semicolon,-whitespace/end_of_line,-whitespace/ending_newline,-whitespace/comma,-build/header_guard,-runtime/int,-runtime/printf,-readability/todo,-build/include_order,-build/include_what_you_use"
cpplint_coverage="include/ samples/ platform/ sdk_src/"
cpplint ${cpplint_rules} --recursive ${cpplint_coverage} &>./code-check-cpplint.txt
echo "cpplint check end"
exit
else
echo "Usage: "$0" <null for all/samples/clean>"
echo "Usage: "$0" <null for all/samples/clean/code-check>"
exit
fi
16 changes: 7 additions & 9 deletions docs/C-SDK_API及可变参数说明.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,21 +51,16 @@ C-SDK 的使用可以根据具体场景需求,配置相应的参数,满足
| 5 | IOT_MQTT_Subscribe | 订阅 MQTT 主题 |
| 6 | IOT_MQTT_Unsubscribe | 取消订阅已订阅的 MQTT 主题 |
| 7 | IOT_MQTT_IsConnected | 查看当前 MQTT 是否已连接 |
| 8 | IOT_MQTT_GetErrCode | 获取IOT_MQTT_Construct失败的错误码 |
| 8 | IOT_MQTT_IsSubReady | 查询对应的主题是否已经订阅成功 |
| 9 | IOT_MQTT_GetDeviceInfo | 获取该 MQTTclien对应的设备信息 |
| 10 | IOT_MQTT_StartLoop | 多线程环境下,启动 MQTTclient后台Yield线程 |
| 11 | IOT_MQTT_StopLoop | 多线程环境下,停止 MQTTclient后台Yield线程 |

- 接口使用说明
```
MQTT构造时候除了提供设备信息,还需要提供一个回调函数,用于接收消息包括连接状态通知,订阅主题是否成功,QoS1消息是否发布成功等等事件通知。订阅主题时则需提供另一个回调函数,用于接收该主题的消息下发。具体接口使用方式可以参考docs/IoT_Hub目录的mqtt_sample_快速入门文档。
```

- 多线程环境使用说明
SDK对于MQTT接口在多线程环境下的使用有如下注意事项:
```
1. 不允许多线程调用IOT_MQTT_Yield,IOT_MQTT_Construct以及IOT_MQTT_Destroy
2. 可以多线程调用IOT_MQTT_Publish,IOT_MQTT_Subscribe及IOT_MQTT_Unsubscribe
3. IOT_MQTT_Yield 作为从socket读取并处理MQTT报文的函数,应保证一定的执行时间,避免被长时间挂起或抢占
```

### 2. 设备影子接口
关于设备影子功能介绍,可以参考[设备影子详情](https://cloud.tencent.com/document/product/634/11918)

Expand All @@ -88,6 +83,7 @@ SDK对于MQTT接口在多线程环境下的使用有如下注意事项:
| 15 | IOT_Shadow_JSON_Construct_OverwriteReport | 在JSON文档中添加reported字段,覆盖更新 |
| 16 | IOT_Shadow_JSON_ConstructReportAndDesireAllNull | 在JSON文档中添加reported字段,同时清空desired字段 |
| 17 | IOT_Shadow_JSON_ConstructDesireAllNull | 在JSON文档中添加 "desired": null 字段 |
| 18 | IOT_Shadow_Get_Mqtt_Client | 获取该ShadowClient对应的MQTTclient |

### 3. CoAP 接口

Expand All @@ -100,6 +96,7 @@ SDK对于MQTT接口在多线程环境下的使用有如下注意事项:
| 5 | IOT_COAP_GetMessageId | 获取 COAP Response 消息 msgId |
| 6 | IOT_COAP_GetMessagePayload | 获取 COAP Response 消息内容 |
| 7 | IOT_COAP_GetMessageCode | 获取 COAP Response 消息错误码 |
| 9 | IOT_COAP_GetDeviceInfo | 获取该 COAPclien对应的设备信息 |

### 4. OTA 接口
关于 OTA 固件下载功能介绍,可以参考[设备固件升级](https://cloud.tencent.com/document/product/634/14674)
Expand Down Expand Up @@ -154,6 +151,7 @@ SDK对于MQTT接口在多线程环境下的使用有如下注意事项:
| 4 | IOT_Gateway_Publish | 发布 MQTT 消息 |
| 5 | IOT_Gateway_Subscribe | 订阅 MQTT 主题 |
| 6 | IOT_Gateway_Unsubscribe | 取消订阅已订阅的 MQTT 主题 |
| 18 | IOT_Gateway_Get_Mqtt_Client | 获取该GatewayClient对应的MQTTclient |

### 8. 动态注册接口

Expand Down
3 changes: 2 additions & 1 deletion docs/C-SDK_Build编译环境及配置选项说明.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ sdk_src为SDK的核心逻辑及协议相关代码,一般不需要修改,其
| FEATURE_OTA_SIGNAL_CHANNEL | MQTT/COAP | OTA信令通道类型 |
| FEATURE_AUTH_MODE | KEY/CERT | 接入认证方式 |
| FEATURE_AUTH_WITH_NOTLS | ON/OFF | OFF: TLS使能, ON: TLS关闭 |
| FEATURE_MULTITHREAD_ENABLED | ON/OFF | 是否使能SDK对多线程环境的支持 |
| FEATURE_DEV_DYN_REG_ENABLED | ON/OFF | 设备动态注册开关 |
| FEATURE_LOG_UPLOAD_ENABLED | ON/OFF | 日志上报开关 |
| FEATURE_DEBUG_DEV_INFO_USED | ON/OFF | 设备信息获取来源开关 |
Expand All @@ -68,7 +69,7 @@ sdk_src为SDK的核心逻辑及协议相关代码,一般不需要修改,其
| FEATURE_AT_UART_RECV_IRQ | ON/OFF | AT模组中断接受功能开关 |
| FEATURE_AT_OS_USED | ON/OFF | AT模组多线程功能开关 |
| FEATURE_AT_DEBUG | ON/OFF | AT模组调试功能开关 |
| FEATURE_MULTITHREAD_TEST_ENABLED | ON/OFF | 是否编译Linux多线程测试例程 |


配置选项之间存在依赖关系,当依赖选项的值为有效值时,部分配置选项才有效,主要如下:

Expand Down
24 changes: 24 additions & 0 deletions docs/C-SDK_MTMC多线程多设备支持.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# C-SDK 多线程及多设备支持

多线程及多设备支持实例需要首先使能编译配置开关FEATURE_MULTITHREAD_ENABLED

## Multi-Thread 多线程环境使用说明

设备端 C-SDK 支持在多线程多任务环境下使用,但是对接口的使用有一定规范。
比如对于MQTT接口在多线程环境下的使用有如下注意事项:
```
1. 不允许多线程调用IOT_MQTT_Yield,IOT_MQTT_Construct以及IOT_MQTT_Destroy
2. 可以多线程调用IOT_MQTT_Publish,IOT_MQTT_Subscribe及IOT_MQTT_Unsubscribe
3. IOT_MQTT_Yield 作为从socket读取并处理MQTT报文的函数,应保证一定的执行时间,避免被长时间挂起或抢占
```
在多线程环境下,建议可以使用 IOT_MQTT_StartLoop 和 IOT_MQTT_StopLoop 来启动和停止后台 IOT_MQTT_Yield 线程,则在需要读取报文的时候不再需要主动调用IOT_MQTT_Yield函数,由后台线程来读取并处理MQTT报文。
使用示例可以参考 samples/mqtt/multi_thread_mqtt_sample

其他模块接口的使用可以参考MQTT接口的使用

## Multi-Client 多设备接入使用

在SDK版本3.2.0之后,支持同时使用多个设备接入。SDK采用面向对象方式对状态变量和参数进行封装,使得比如一个MQTT/Shadow Client实例可以对应一个设备,通过提供多个设备三元组,创建多个Client实例,则可以同时进行多个设备的接入和通讯。
具体的示例代码可以参考 samples/multi_client 下面的sample,通过创建多个线程,每个线程里面创建各自的 MQTT/Shadow Client,则相当于多个设备在同时访问后台服务。


20 changes: 10 additions & 10 deletions docs/C-SDK_Porting跨平台移植概述.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,22 @@ HAL层主要有几大块的移植,分别是OS相关的、网络及TLS相关的
SDK在 **platform/os** 目录示例了Linux、Windows、FreeRTOS及nonOS四个场景的硬件抽象层实现,可以参考最相近的目录展开目标平台的移植。

#### OS相关接口
以下函数跟线程/互斥锁/信号量相关的,只有在使能多线程/多任务情况下(MULTITHREAD_ENABLED)才需要移植

| 序号 | 函数名 | 说明 |
| ---- | ---------------------- | ------------------------------------------ |
| 1 | HAL_Malloc | 动态申请内存块 |
| 2 | HAL_Free | 释放内存块 |
| 3 | HAL_ThreadCreate | 线程创建 |
| 4 | HAL_ThreadDestroy | 线程销毁 |
| 5 | HAL_MutexCreate | 创建互斥锁 |
| 6 | HAL_MutexDestroy | 销毁互斥锁 |
| 7 | HAL_MutexLock | mutex 加锁 |
| 8 | HAL_MutexUnlock | mutex 解锁 |
| 9 | HAL_SemaphoreCreate | 创建信号量 |
| 10 | HAL_SemaphoreDestroy | 销毁信号量 |
| 11 | HAL_SemaphoreWait | 等待信号量 |
| 12 | HAL_SemaphorePost | 释放信号量 |
| 13 | HAL_SleepMs | 休眠 |
| 4 | HAL_MutexCreate | 创建互斥锁 |
| 5 | HAL_MutexDestroy | 销毁互斥锁 |
| 6 | HAL_MutexLock | mutex 加锁 |
| 7 | HAL_MutexUnlock | mutex 解锁 |
| 8 | HAL_SemaphoreCreate | 创建信号量 |
| 9 | HAL_SemaphoreDestroy | 销毁信号量 |
| 10 | HAL_SemaphoreWait | 等待信号量 |
| 11 | HAL_SemaphorePost | 释放信号量 |
| 12 | HAL_SleepMs | 休眠 |

#### 网络及TLS相关的HAL接口

Expand Down
18 changes: 17 additions & 1 deletion include/config.h
Original file line number Diff line number Diff line change
@@ -1 +1,17 @@

/* #undef AUTH_MODE_CERT */
#define AUTH_MODE_KEY
/* #undef AUTH_WITH_NOTLS */
#define GATEWAY_ENABLED
/* #undef COAP_COMM_ENABLED */
#define OTA_MQTT_CHANNEL
#define SYSTEM_COMM
#define DEV_DYN_REG_ENABLED
/* #undef LOG_UPLOAD */
/* #undef IOT_DEBUG */
/* #undef DEBUG_DEV_INFO_USED */
/* #undef AT_TCP_ENABLED */
/* #undef AT_UART_RECV_IRQ */
/* #undef AT_OS_USED */
/* #undef AT_DEBUG */
#define OTA_USE_HTTPS
#define MULTITHREAD_ENABLED
Loading

0 comments on commit 33118e9

Please sign in to comment.