Code Monkey home page Code Monkey logo

tencentcloud-iot-sdk-embedded-c's Introduction

腾讯云物联网设备端 C-SDK

腾讯云物联网设备端 C-SDK 依靠安全且性能强大的数据通道,为物联网领域开发人员提供设备端快速接入云端,并和云端进行双向通信的能力。

在版本v3.1.0之后,SDK对编译环境,代码及目录结构进行了重构优化,提高了可用性和可移植性。

本SDK仅适用于物联网通信平台IoT Hub,对于物联网开发平台,请访问 IoT Explorer C-SDK

一、C-SDK 适用范围

C-SDK 采用模块化设计,分离核心协议服务与硬件抽象层,并提供灵活的配置选项和多种编译方式,适用于不同设备的开发平台和使用环境。

1. 具备网络通讯能力并使用Linux/Windows操作系统的设备

对于具备网络通讯能力并使用标准 Linux/Windows 系统的设备比如PC/服务器/网关设备,及较高级的嵌入式设备比如树莓派等等,可直接在该设备上编译运行SDK。 对于需要交叉编译的嵌入式 Linux 设备,如果开发环境的toolchain具备glibc或类似的库,可以提供包括socket通讯,select同步IO,动态内存分配,获取时间/休眠/随机数/打印函数,以及临界数据保护如Mutex机制(仅在需要多线程时)等系统调用,则只要做简单适配(比如在CMakeLists.txt或make.settings里面修改交叉编译器的设定)就可以编译运行SDK。

2. 具备网络通讯能力并采用RTOS系统的设备

对于具备网络通讯能力并采用RTOS的物联网设备,C-SDK需要针对不同的RTOS做移植适配工作,目前C-SDK已经适配了包括FreeRTOS/RT-Thread/TencentOS tiny等多个面向物联网的RTOS平台。 在RTOS设备移植SDK时,如果平台提供了类似newlib的C运行库和类似lwIP的嵌入式TCP/IP协议栈,则移植适配工作也可以轻松完成。

3. MCU+通讯模组的设备

对于不具备网络通讯能力的MCU,一般采用MCU+通讯模组的方式,通讯模组(包括WiFi/2G/4G/NB-IoT)一般提供了基于串口的AT指令协议供MCU进行网络通讯。针对这种场景,C-SDK 封装了AT-socket网络层,网络层之上的核心协议和服务层无须移植。并提供了基于FreeRTOS和不带操作系统(nonOS)两种方式的HAL实现,具体可以参考docs目录文档。

除此之外,腾讯云物联网还提供了专用的AT指令集,如果通讯模组实现了该指令集,则设备接入和通讯更为简单,所需代码量更少,针对这种场景,请参考面向腾讯云定制AT模组专用的 MCU AT SDK

二、SDK 目录结构简介

1. 目录结构及顶层文件简介

名称 说明
CMakeLists.txt cmake编译描述文件
CMakeSettings.json visual studio下的cmake配置文件
cmake_build.sh Linux下使用cmake的编译脚本
make.settings Linux下使用Makefile直接编译的配置文件
Makefile Linux下使用Makefile直接编译
device_info.json 设备信息文件,当DEBUG_DEV_INFO_USED=OFF时,将从该文件解析出设备信息
docs 文档目录,SDK在不同平台下使用说明文档。
external_libs 第三方软件包组件,如mbedtls
samples 应用示例
include 提供给用户使用的外部头文件
platform 平台相关的源码文件,目前提供了针对不同OS(Linux/Windows/FreeRTOS/nonOS),TLS(mbedtls)以及AT模组下的实现。
sdk_src SDK核心通信协议及服务代码
tools SDK配套的编译及代码生成脚本工具

三、SDK 编译方式说明

C-SDK 支持三种编译方式:

  • cmake 方式
  • Makefile 方式
  • 代码抽取方式

编译方式以及编译配置选项的详细说明请参考docs目录文档 C-SDK_Build编译环境及配置选项说明

四、SDK 示例体验

C-SDK的samples目录有使用各个功能的示例,关于运行示例的详细说明,请参考docs目录各个文档

五、注意事项

多设备连接

从版本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进行修改。

代码命名变化

为了提高代码可读性,保证命名规范,SDK 3.1.0版本对部分变量、函数及宏命名进行了变更,对于从3.0.3及以前的版本升级的用户,可以在Linux环境下面执行tools/update_from_old_SDK.sh脚本对自己的用户代码执行名字替换,替换完成就可以直接使用新版本的SDK。

旧命名 新命名
QCLOUD_ERR_SUCCESS QCLOUD_RET_SUCCESS
QCLOUD_ERR_MQTT_RECONNECTED QCLOUD_RET_MQTT_RECONNECTED
QCLOUD_ERR_MQTT_MANUALLY_DISCONNECTED QCLOUD_RET_MQTT_MANUALLY_DISCONNECTED
QCLOUD_ERR_MQTT_CONNACK_CONNECTION_ACCEPTED QCLOUD_RET_MQTT_CONNACK_CONNECTION_ACCEPTED
QCLOUD_ERR_MQTT_ALREADY_CONNECTED QCLOUD_RET_MQTT_ALREADY_CONNECTED
MAX_SIZE_OF_DEVICE_SERC MAX_SIZE_OF_DEVICE_SECRET
devCertFileName dev_cert_file_name
devPrivateKeyFileName dev_key_file_name
devSerc device_secret
MAX_SIZE_OF_PRODUCT_KEY MAX_SIZE_OF_PRODUCT_SECRET
product_key product_secret。
DEBUG eLOG_DEBUG
INFO eLOG_INFO
WARN eLOG_WARN
ERROR eLOG_ERROR
DISABLE eLOG_DISABLE
Log_writter IOT_Log_Gen
qcloud_iot_dyn_reg_dev IOT_DynReg_Device
IOT_SYSTEM_GET_TIME IOT_Get_SysTime
#! /bin/bash

sed -i "s/QCLOUD_ERR_SUCCESS/QCLOUD_RET_SUCCESS/g" `grep -rwl QCLOUD_ERR_SUCCESS ./*`
sed -i "s/QCLOUD_ERR_MQTT_RECONNECTED/QCLOUD_RET_MQTT_RECONNECTED/g" `grep -rwl QCLOUD_ERR_MQTT_RECONNECTED ./*`
sed -i "s/QCLOUD_ERR_MQTT_MANUALLY_DISCONNECTED/QCLOUD_RET_MQTT_MANUALLY_DISCONNECTED/g" `grep -rwl QCLOUD_ERR_MQTT_MANUALLY_DISCONNECTED ./*`
sed -i "s/QCLOUD_ERR_MQTT_CONNACK_CONNECTION_ACCEPTED/QCLOUD_RET_MQTT_CONNACK_CONNECTION_ACCEPTED/g" `grep -rwl QCLOUD_ERR_MQTT_CONNACK_CONNECTION_ACCEPTED ./*`
sed -i "s/QCLOUD_ERR_MQTT_ALREADY_CONNECTED/QCLOUD_RET_MQTT_ALREADY_CONNECTED/g" `grep -rwl QCLOUD_ERR_MQTT_ALREADY_CONNECTED ./*` 
sed -i "s/MAX_SIZE_OF_DEVICE_SERC/MAX_SIZE_OF_DEVICE_SECRET/g" `grep -rwl MAX_SIZE_OF_DEVICE_SERC ./*`
sed -i "s/devCertFileName/dev_cert_file_name/g" `grep -rwl devCertFileName ./*`
sed -i "s/devPrivateKeyFileName/dev_key_file_name/g" `grep -rwl devPrivateKeyFileName ./*`
sed -i "s/devSerc/device_secret/g" `grep -rwl devSerc ./*`
sed -i "s/MAX_SIZE_OF_PRODUCT_KEY/MAX_SIZE_OF_PRODUCT_SECRET/g" `grep -rwl MAX_SIZE_OF_PRODUCT_KEY ./*`
sed -i "s/product_key/product_secret/g" `grep -rwl product_key ./*` 
sed -i "s/DEBUG/eLOG_DEBUG/g" `grep -rwl DEBUG ./*`
sed -i "s/INFO/eLOG_INFO/g" `grep -rwl INFO ./*`
sed -i "s/WARN/eLOG_WARN/g" `grep -rwl WARN ./*`
sed -i "s/ERROR/eLOG_ERROR/g" `grep -rwl ERROR ./*`
sed -i "s/DISABLE/eLOG_DISABLE/g" `grep -rwl DISABLE ./*`
sed -i "s/Log_writter/IOT_Log_Gen/g" `grep -rwl Log_writter ./*` 
sed -i "s/qcloud_iot_dyn_reg_dev/IOT_DynReg_Device/g" `grep -rwl qcloud_iot_dyn_reg_dev ./*`
sed -i "s/IOT_SYSTEM_GET_TIME/IOT_Get_SysTime/g" `grep -rwl IOT_SYSTEM_GET_TIME ./*`

tencentcloud-iot-sdk-embedded-c's People

Contributors

chipengliu avatar shockcao avatar skyztmeng avatar spikelin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tencentcloud-iot-sdk-embedded-c's Issues

设备启动后第二次执行IOT_MQTT_Construct会导致qcloud_get_log_level返回错误

设备启动后,执行一次IOT_MQTT_Construct和IOT_MQTT_Destroy后,再次执行IOT_MQTT_Construct会导致qcloud_get_log_level返回错误,定位时发现IOT_MQTT_Destroy动作未将sg_log_sub_ok复位,希望SDK开发人员帮忙确认是否有必要在Destroy Client后加一个复位动作,如果有必要,希望排查一下这种情况的其他全局变量(如:sg_client_token、sg_devinfo_initialized等)。

连接成功后会立马出现这种错误,network read failed, rc: -708. MQTT Disconnect.

[zcprotocol_best-t:2023-07-25T14:54:57.559] Info [QCloudThread(4121592944)][mqttcommapi.c log_handler 478]: ERR|2023-07-25 14:54:57|HAL_TLS_mbedtls.c|HAL_TLS_Read(378): cloud_iot_network_tls_read failed: 0x0000

[zcprotocol_best-t:2023-07-25T14:54:57.559] Info [QCloudThread(4121592944)][mqttcommapi.c log_handler 478]: ERR|2023-07-25 14:54:57|mqtt_client_yield.c|qcloud_iot_mqtt_yield(246): network read failed, rc: -708. MQTT Disconnect.

[zcprotocol_best-t:2023-07-25T14:54:57.560] Info [QCloudThread(4121592944)][mqttcommapi.c log_handler 478]: ERR|2023-07-25 14:54:57|mqtt_client_yield.c|_handle_disconnect(68): disconnect MQTT for some reasons..

[zcprotocol_best-t:2023-07-25T14:54:57.560] Info [QCloudThread(4121592944)][mqttcommapi.c event_handler 495]: MQTT disconnect.
[zcprotocol_best-t:2023-07-25T14:54:57.560] Warning [QCloudThread(4121592944)][mqttcommapi.c ReadChannelThread 878]: It will attempting reconnect: -105
[zcprotocol_best-t:2023-07-25T14:54:58.564] Warning [QCloudThread(4121592944)][mqttcommapi.c ReadChannelThread 774]: into disconnect status, 0,1
[zcprotocol_best-t:2023-07-25T14:54:58.566] Info [QCloudThread(4121592944)][mqttcommapi.c log_handler 478]: ERR|2023-07-25 14:54:58|device.c|iot_device_info_init(30): device info has been initialized.

FUNC: qcloud_iot_mqtt_init L#259 server iotcloud-mqtt.gz.tencentdevices.com:8883
[zcprotocol_best-t:2023-07-25T14:54:58.712] Info [QCloudThread(4121592944)][mqttcommapi.c log_handler 478]: ERR|2023-07-25 14:54:58|mqtt_client.c|IOT_MQTT_Construct(111): mqtt connect with id: dDm1s failed: -117

移植到嵌入式平台,有相关介绍吗?

文档里面只是介绍了SDK的代码结构,但是对于移植的具体操作没有说明啊,有没有具体的操作实例?
怎么设置编译参数,怎么选择编译平台等等。

MQTT 连接失败

按readme 配置后运行报错

非对称加密

DBG|2018-04-08 13:39:14|HAL_TLS_mbedtls.c|HAL_TLS_Connect(203):  Connecting to /iotcloud-mqtt.gz.tencentdevices.com/8883...  
DBG|2018-04-08 13:39:20|HAL_TLS_mbedtls.c|HAL_TLS_Connect(208):  Setting up the SSL/TLS structure... 
DBG|2018-04-08 13:39:20|HAL_TLS_mbedtls.c|HAL_TLS_Connect(250): Performing the SSL/TLS handshake...  
ERR|2018-04-08 13:39:20|mqtt_client.c|IOT_MQTT_Construct(90): mqtt connect with id: EmHEy failed: -111  
ERR|2018-04-08 13:39:20|mqtt_sample.c|main(256): Cloud Device Construct Failed

请问错误码在哪查询?

对称加密

DBG|2018-04-08 14:21:20|mqtt_client.c|qcloud_iot_mqtt_init(178): device_name: switch01
DBG|2018-04-08 14:21:20|mqtt_client.c|qcloud_iot_mqtt_init(251): cert file: k1CIyegaDZBDGbU9mbiQyw==
段错误 (核心已转储)

简单提几个bug

bug1

src/utils/farra/utils_httpc.c中368行

    *p_read_len = 0;
    rc = client->network_stack.read(&client->network_stack, (unsigned char *)buf, max_len, (uint32_t)left_ms(&timer), (size_t *)p_read_len);

在64位系统中size_t和int长度可能不一样,这样强转会导致p_read_len指向地址附近的内存会被异常覆盖。

bug2

src/mqtt/src/mqtt_client_connect.c中187行

    if ((flags & MQTT_CONNECT_FLAG_USERNAME) && options->username != NULL) {
        mqtt_write_utf8_string(&ptr, options->username);
        HAL_Free(options->username);
    }

    if ((flags & MQTT_CONNECT_FLAG_PASSWORD) && options->password != NULL) {
    	mqtt_write_utf8_string(&ptr, options->password);
    	HAL_Free(options->password);
    }

HAL_Free后建议将指针置为NULL,否则mqtt重连的时候程序会挂掉

FEATURE_AT_OS_USED 关闭 编译出错

MCU+通用TCP_AT模组移植(nonOS) 按照 所给文档配置CMakeLists.txt 编译报错
image

查看代码发现resp_sem 被 FEATURE_AT_OS_USED 注释掉了
image

移植到mips平台出现问题,请帮忙看看日志,给点提示

编译没有错误,能正常运行,同样配置直接在ubuntu下编译后能正常连接到服务器

root@KtGw:/tmp/release/bin# ./mqtt_sample
INF|2018-09-14 05:26:35|device.c|iot_device_info_init(37): device info init success!
INF|2018-09-14 05:26:35|device.c|iot_device_info_set(42): start to set device info!
INF|2018-09-14 05:26:35|device.c|iot_device_info_set(66): device info set successfully!
FUNC_ENTRY: qcloud_iot_mqtt_init L#180
DBG|2018-09-14 05:26:35|mqtt_client.c|qcloud_iot_mqtt_init(185): product_id: YEHOII6XCA
DBG|2018-09-14 05:26:35|mqtt_client.c|qcloud_iot_mqtt_init(186): device_name: VDEV0914
DBG|2018-09-14 05:26:35|mqtt_client.c|qcloud_iot_mqtt_init(259): cert file: /tmp/release/bin/certs/VDEV0914_cert.crt
DBG|2018-09-14 05:26:35|mqtt_client.c|qcloud_iot_mqtt_init(260): key file: /tmp/release/bin/certs/VDEV0914_private.key
FUNC_EXIT: qcloud_iot_mqtt_init L#303 Return Code : 0
FUNC_ENTRY: qcloud_iot_mqtt_connect L#389
FUNC_ENTRY: get_client_conn_state L#1308
FUNC_EXIT: get_client_conn_state L#1313 Return Code : 0
FUNC_ENTRY: _mqtt_connect L#325
DBG|2018-09-14 05:26:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(204): Connecting to /YEHOII6XCA.iotcloud.tencentdevices.com/8883...
DBG|2018-09-14 05:26:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(209): Setting up the SSL/TLS structure...
DBG|2018-09-14 05:26:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(251): Performing the SSL/TLS handshake...
FUNC_ENTRY: _serialize_connect_packet L#134
FUNC_ENTRY: mqtt_write_packet_rem_len L#96
FUNC_EXIT: mqtt_write_packet_rem_len L#111 Return Code : 1
FUNC_EXIT: _serialize_connect_packet L#235 Return Code : 0
FUNC_ENTRY: send_mqtt_packet L#511
FUNC_EXIT: send_mqtt_packet L#535 Return Code : 0
FUNC_ENTRY: wait_for_read L#1277
FUNC_ENTRY: cycle_for_read L#1222
FUNC_ENTRY: _read_mqtt_packet L#599
FUNC_EXIT: _read_mqtt_packet L#613 Return Code : -109
FUNC_EXIT: cycle_for_read L#1232 Return Code : 0
FUNC_EXIT: wait_for_read L#1298 Return Code : -111
FUNC_EXIT: _mqtt_connect L#364 Return Code : -111
FUNC_EXIT: qcloud_iot_mqtt_connect L#406 Return Code : -111
ERR|2018-09-14 05:26:40|mqtt_client.c|IOT_MQTT_Construct(102): mqtt connect with id: qU9fl failed: -111
ERR|2018-09-14 05:26:40|mqtt_sample.c|main(245): Cloud Device Construct Failed

其中make.settings如下配置
BUILD_TYPE = debug #release/debug

#PLATFORM_CC = gcc
#PLATFORM_AR = ar
PLATFORM_OS = linux
PLATFORM_SSL = mbedtls

Uncomment below and specify PATH to your toolchain when cross-compile SDK

PLATFORM_CC = /home/shock/openwrt/packages/toolchain/mipsel-linux-gcc

PLATFORM_AR = /home/shock/openwrt/packages/toolchain/mipsel-linux-ar

PLATFORM_CC = armcc

PLATFORM_AR = armar

PLATFORM_CC = /opt/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc
PLATFORM_AR = /opt/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-ar

#/home/flym/ktgw/OpenWrt-SDK/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin
#/opt/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin

FEATURE_MQTT_COMM_ENABLED = y # 是否打开MQTT通道的总开关
FEATURE_MQTT_DEVICE_SHADOW = n # 是否打开设备影子的总开关
FEATURE_COAP_COMM_ENABLED = n # 是否打开CoAP通道的总开关
FEATURE_NBIOT_COMM_ENABLED = n # 是否打开NBIoT通道的消息组装

FEATURE_OTA_COMM_ENABLED = n # 是否打开OTA固件升级总开关
FEATURE_OTA_SIGNAL_CHANNEL = MQTT # OTA信令通道类型:MQTT/COAP

FEATURE_AUTH_MODE = CERT # MQTT/CoAP接入认证方式,使用证书认证:CERT;使用密钥认证:KEY
FEATURE_AUTH_WITH_NOTLS = n # 接入认证是否不使用TLS,证书方式必须选择使用TLS,密钥认证可选择不使用TLS

FEATURE_SYSTEM_COMM_ENABLED = y # 是否打开获取iot后台时间功能

使用SSL认证失败,直接使用的是mqtt_sample,同样的证书用MQTT.fx测试没有问题

INF|2020-06-11 16:18:02|qcloud_iot_device.c|iot_device_info_set(50): SDK_Ver: 3.2.0, Product_ID: PRODUCT_ID, Device_Name: YOUR_DEV_NAME
DBG|2020-06-11 16:18:02|mqtt_client.c|qcloud_iot_mqtt_init(426): cert file: /home/xx/work/qcloud-iot-sdk-embedded-c/output/release/bin/certs/client.pem
DBG|2020-06-11 16:18:02|mqtt_client.c|qcloud_iot_mqtt_init(427): key file: /home/xx/work/qcloud-iot-sdk-embedded-c/output/release/bin/certs/client.key
DBG|2020-06-11 16:18:02|HAL_TLS_mbedtls.c|HAL_TLS_Connect(212): Setting up the SSL/TLS structure...
DBG|2020-06-11 16:18:02|HAL_TLS_mbedtls.c|HAL_TLS_Connect(256): Performing the SSL/TLS handshake...
DBG|2020-06-11 16:18:02|HAL_TLS_mbedtls.c|HAL_TLS_Connect(257): Connecting to /10.1.8.142/8883...
INF|2020-06-11 16:18:02|HAL_TLS_mbedtls.c|_dtls_debug(199): [mbedTLS]:[/home/xx/work/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/library/ssl_tls.c]:[4454]: x509_verify_cert() returned 4 (-0xfffffffc)

ERR|2020-06-11 16:18:02|HAL_TLS_mbedtls.c|HAL_TLS_Connect(264): mbedtls_ssl_handshake failed returned 0x0004
DBG|2020-06-11 16:18:02|HAL_TLS_mbedtls.c|HAL_TLS_Disconnect(291): handle is NULL
ERR|2020-06-11 16:18:02|mqtt_client.c|IOT_MQTT_Construct(108): mqtt connect with id: failed: -1001
INF|2020-06-11 16:18:02|mqtt_client.c|qcloud_iot_mqtt_fini(532): release mqtt client resources
ERR|2020-06-11 16:18:02|mqtt_sample.c|main(309): MQTT Construct failed!

是否可以返回特定的错误码呢?

https://github.com/tencentyun/qcloud-iot-sdk-embedded-c/blob/75b9f02a0f4d7cd3490f878472ae4695639a0c45/src/mqtt/src/mqtt_client_common.c#L1037

当sub返回正数(paket-id),消息回调挂接handles满了之后,希望返回特定错误码用于标识该特定的错误原因。eg:某场景下,设备主程序Yield循环期间,无法感知该错误类型,sub返回正数paket-id后,Yield不会触发sub handle回调函数,而仅仅返回-1001失败,设备开发人员无法知道是否该将该sub的主题放入自己的订阅list表中。

cmake选项通过命令行指定

现在的方式是直接在 CMastLists.txtset(BUILD_TYPE "release"),如果我想写一个脚本编译,无法通过命令行重新设置变量,除非直接修改 CMastLists.txt 中变量的值,是否考虑使用缓存变量?

at_client.c 多线程模式存在宕机问题

https://github.com/tencentyun/qcloud-iot-sdk-embedded-c/blob/5381d0efd99efe96337c29ecbdf64c3e40a1cb59/sdk_src/network/at_socket/at_client.c#L840-L851

https://github.com/tencentyun/qcloud-iot-sdk-embedded-c/blob/5381d0efd99efe96337c29ecbdf64c3e40a1cb59/platform/os/freertos/HAL_OS_freertos.c#L165-L193

at_client.c 840行创建线程的handle是局部变量,在HAL_OS_freertos.c 中 创建完线程回调_HAL_thread_func_wrapper_ 传入的参数是线程的handle,创建线程函数已经退出,handle里内容已经被释放,_HAL_thread_func_wrapper_的params->thread_func 函数指针会变为0或者野指针,导致系统宕机。

linux ubuntu18.04编译不过

[ 55%] Building C object sdk_src/CMakeFiles/iot_sdk.dir/network/socket/network_socket.c.o
[ 56%] Building C object sdk_src/CMakeFiles/iot_sdk.dir/network/network_interface.c.o
[ 57%] Linking C static library ../../output/release/lib/libiot_sdk.a
[ 57%] Built target iot_sdk
Scanning dependencies of target iot_platform
[ 59%] Building C object platform/CMakeFiles/iot_platform.dir/os/linux/HAL_Device_linux.c.o
[ 60%] Building C object platform/CMakeFiles/iot_platform.dir/os/linux/HAL_File_linux.c.o
[ 61%] Building C object platform/CMakeFiles/iot_platform.dir/os/linux/HAL_Log_linux.c.o
[ 62%] Building C object platform/CMakeFiles/iot_platform.dir/os/linux/HAL_OS_linux.c.o
[ 63%] Building C object platform/CMakeFiles/iot_platform.dir/os/linux/HAL_TCP_linux.c.o
[ 64%] Building C object platform/CMakeFiles/iot_platform.dir/os/linux/HAL_Timer_linux.c.o
In file included from /home/xie/mywork/cj/tencentcloud-iot-explorer-sdk-embedded-c-3.2.2/platform/os/linux/HAL_Timer_linux.c:26:0:
/home/xie/mywork/cj/tencentcloud-iot-explorer-sdk-embedded-c-3.2.2/platform/os/linux/HAL_Timer_linux.c: In function 'HAL_Timer_expired':
/home/xie/mywork/cj/tencentcloud-iot-explorer-sdk-embedded-c-3.2.2/platform/os/linux/HAL_Timer_linux.c:35:5: error: request for member 'tv_sec' in something not a structure or union
     timersub(&timer->end_time, &now, &res);
     ^
/home/xie/mywork/cj/tencentcloud-iot-explorer-sdk-embedded-c-3.2.2/platform/os/linux/HAL_Timer_linux.c:35:5: error: request for member 'tv_usec' in something not a structure or union
     timersub(&timer->end_time, &now, &res);
     ^
/home/xie/mywork/cj/tencentcloud-iot-explorer-sdk-embedded-c-3.2.2/platform/os/linux/HAL_Timer_linux.c: In function 'HAL_Timer_countdown_ms':
/home/xie/mywork/cj/tencentcloud-iot-explorer-sdk-embedded-c-3.2.2/platform/os/linux/HAL_Timer_linux.c:44:5: error: request for member 'tv_sec' in something not a structure or union
     timeradd(&now, &interval, &timer->end_time);
     ^
/home/xie/mywork/cj/tencentcloud-iot-explorer-sdk-embedded-c-3.2.2/platform/os/linux/HAL_Timer_linux.c:44:5: error: request for member 'tv_usec' in something not a structure or union
     timeradd(&now, &interval, &timer->end_time);
     ^
/home/xie/mywork/cj/tencentcloud-iot-explorer-sdk-embedded-c-3.2.2/platform/os/linux/HAL_Timer_linux.c:44:5: error: request for member 'tv_usec' in something not a structure or union
     timeradd(&now, &interval, &timer->end_time);
     ^
/home/xie/mywork/cj/tencentcloud-iot-explorer-sdk-embedded-c-3.2.2/platform/os/linux/HAL_Timer_linux.c:44:5: error: request for member 'tv_sec' in something not a structure or union
     timeradd(&now, &interval, &timer->end_time);

MQTT连接失败

Halo,大神们

我在我的模组上面自己加入网络,然后使用light_data_template_sample.c作为demo进行测试。发现报如下错误:
mqtt connect with id: failed: -1001
image
image

linux编译失败失败。

qcloud-iot-sdk-embedded-c$ ./cmake_build.sh
Build all (SDK libs and samples)
-- The C compiler identification is GNU 11.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/john/qcloud-iot-sdk-embedded-c/build
[ 1%] Building C object sdk_src/CMakeFiles/iot_sdk.dir/utils/json_parser.c.o
..........
[ 80%] Building C object external_libs/mbedtls/CMakeFiles/mbedtls.dir/library/ss l_tls.c.o
/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c:1012:67: error: argument 2 of type ‘unsigned char[36]’ with mismatch ed bound [-Werror=array-parameter=]
1012 | ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char hash[36] )
| ~~~~~~~~~~~~~~^~~~~~~~

/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c:466:57: note: previously declared as ‘unsigned char *’
466 | static void ssl_calc_verify_tls( mbedtls_ssl_context *, unsigned char * );
| ^~~~~~~~~~~~~~~
/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c:1040:74: error: argument 2 of type ‘unsigned char[32]’ with mismatch ed bound [-Werror=array-parameter=]
1040 | c_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char hash[32] )
| ~~~~~~~~~~~~~~^~~~~~~~

/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c:473:63: note: previously declared as ‘unsigned char *’
473 | atic void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *,unsigned cha r * );
| ^~~~~~~~~~~~ ~~~

/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c:1061:74: error: argument 2 of type ‘unsigned char[48]’ with mismatch ed bound [-Werror=array-parameter=]
1061 | c_verify_tls_sha384( mbedtls_ssl_context *ssl, unsigned char hash[48] )
| ~~~~~~~~~~~~~~^~~~~~~~

/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c:479:64: note: previously declared as ‘unsigned char *’
479 | tic void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *, unsigned cha r * );
| ^~~~~~~~~~~~ ~~~

/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c: In function ‘ssl_calc_finished_tls_sha384’:
/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c:4924:5: error: ‘mbedtls_sha512_finish’ accessing 64 bytes in a regio n of size 48 [-Werror=stringop-overflow=]
4924 | mbedtls_sha512_finish( &sha512, padbuf );
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c:4924:5: note: referencing argument 2 of type ‘unsigned char *’
In file included from /home/john/qcloud-iot-sdk-embedded-c/extern al_libs/mbedtls/include/mbedtls/ssl_internal.h:41,
from /home/john/qcloud-iot-sdk-embedded-c/extern al_libs/mbedtls/library/ssl_tls.c:48:
/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/includ e/mbedtls/sha512.h:102:6: note: in a call to function ‘mbedtls_sha512_finish’
102 | void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char o utput[64] );
| ^~~~~~~~~~~~~~~~~~~~~
/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c: In function ‘ssl_calc_verify_tls_sha384’:
/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c:1070:5: error: ‘mbedtls_sha512_finish’ accessing 64 bytes in a regio n of size 48 [-Werror=stringop-overflow=]
1070 | mbedtls_sha512_finish( &sha512, hash );
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/librar y/ssl_tls.c:1070:5: note: referencing argument 2 of type ‘unsigned char *’
In file included from /home/john/qcloud-iot-sdk-embedded-c/extern al_libs/mbedtls/include/mbedtls/ssl_internal.h:41,
from /home/john/qcloud-iot-sdk-embedded-c/extern al_libs/mbedtls/library/ssl_tls.c:48:
/home/john/qcloud-iot-sdk-embedded-c/external_libs/mbedtls/includ e/mbedtls/sha512.h:102:6: note: in a call to function ‘mbedtls_sha512_finish’
102 | void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char o utput[64] );
| ^~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[2]: *** [external_libs/mbedtls/CMakeFiles/mbedtls.dir/build.make:188:exter nal_libs/mbedtls/CMakeFiles/mbedtls.dir/library/ssl_tls.c.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:289:external_libs/mbedtls/CMakeFiles/mbedtls .dir/all] 错误 2
make: *** [Makefile:91:all] 错误 2

SDK支持多个子设备上线

目前的GatewayParam结构体中只支持单个子设备名称,请提供多个子设备上线的接口。
如修改GatewayParam中char *subdev_device_name为char *subdev_device_name[],并在内部实现中新增相关代码。

just一些单词可能拼写错误

萌新在vs code上发现一个插件Code Spell Checker,很好用,于是忍不住检索了一下你们的两万行代码,挑出一些可能拼写错误的单词:

SUBCRIBE
UNSUBCRIBE
unsubcribed
writter
paload
desried
propertys
Shdaow
DEIRECT
recgonized
unrecogonized
NORMANL

samples/mqtt/multi_thread_mqtt_sample.c, multi_client_shadow_sample.c, ota_mqtt_sample.c存在内存DF和UAF问题。

samples/mqtt/multi_thread_mqtt_sample.c,ota_mqtt_sample.c存在内存UAF (memory Use-After-Free) 安全问题(即使用了一个已经释放的内存)。
multi_client_shadow_sample.c, ota_mqtt_sample.c存在DF(memory Double Free)安全问题(即对内存进行双重释放)。

  1. samples/mqtt/multi_thread_mqtt_sample.c
    https://github.com/tencentyun/qcloud-iot-sdk-embedded-c/blob/master/samples/mqtt/multi_thread_mqtt_sample.c
    UAF问题:在第201行已经释放了action_value内存,然而在202行又调用了action_value内存,此时释放后的action_value内存值是不确定的,会出现非预期行为。
static void _mqtt_message_handler(void *pClient, MQTTMessage *message, void *userData)
{
    if (message == NULL) {
        return;
    }

    if (MAX_SIZE_OF_TOPIC_CONTENT >= message->payload_len) {
        ...
        if (action_value != NULL) {
            temp = strstr(action_value, "-");
            if (NULL != temp) {
                tempRow = atoi(temp + 1);
                HAL_Free(action_value);
            } else {
                HAL_Free(action_value);      //!!! action_value memory is released
                Log_e("invalid action value: %s", action_value);    //!!! Use of memory action_value  after it is freed
                sg_rx_unexpected_count++;
                return;
            }
        } else {
            ...
        }

        ...
    } else {
        sg_rx_msg_buf_too_big_count++;
    }
}

  1. samples/multi_client/multi_client_shadow_sample.c
    https://github.com/tencentyun/qcloud-iot-sdk-embedded-c/blob/master/samples/multi_client/multi_client_shadow_sample.c
    DF问题:在180行已经通过IOT_Shadow_Destroy释放了shadow_client内存,但在226行再次通过IOT_Shadow_Destroy释放shadow_client内存,造成Memory Double Free安全问题。
static void _shadow_client_thread_runner(void *ptr)
{
    int   rc            = QCLOUD_ERR_FAILURE;
    void *shadow_client = NULL;
...
    shadow_client = IOT_Shadow_Construct(&init_params);
    if (shadow_client == NULL) {
        Log_e("shadow client constructed failed.");
        goto thread_exit;
    }

    // register delta property
    shadow_property.key  = thread_data->property_key;
    shadow_property.data = &current_update_count;
    shadow_property.type = JINT32;
    rc                   = IOT_Shadow_Register_Property(shadow_client, &shadow_property, OnDeltaCallback);
    if (rc != QCLOUD_RET_SUCCESS) {
        rc = IOT_Shadow_Destroy(shadow_client);    //!!! shadow_client memory was freed via IOT_Shadow_Destroy
        Log_e("register device shadow property failed, err: %d", rc);
        goto thread_exit;
    }
...
thread_exit:

    if (shadow_client != NULL) {
        IOT_Shadow_Destroy(shadow_client);    //!!! shadow_client memory was freed via IOT_Shadow_Destroy again since it was freed before.
        shadow_client = NULL;
    }

    sg_thread_status[thread_id] = 1;
}
  1. samples/ota/ota_mqtt_sample.c
    https://github.com/tencentyun/qcloud-iot-sdk-embedded-c/blob/master/samples/ota/ota_mqtt_sample.c
    UAF问题:在第285行已经释放了version内存,但在第289行又再次调用version,此时释放后的version内存值是不确定的,会出现非预期行为,造成UAF问题。
    DF问题:在第285行已经释放了version内存,但在第290行又再次释放version,造成double free安全问题。
static int _get_local_fw_info(char *file_name, char *local_version)
{
    ...

    char *version = LITE_json_value_of(KEY_VER, json_doc);
    char *size    = LITE_json_value_of(KEY_SIZE, json_doc);

    if ((NULL == version) || (NULL == size)) {
        if (version)
            HAL_Free(version);
        if (size)
            HAL_Free(size);
        fclose(fp);
        return 0;
    }

    int local_size = atoi(size);
    HAL_Free(size);

    if (local_size <= 0) {
        Log_w("local info offset invalid: %d", local_size);
        HAL_Free(version);    //!!! version memory is released
        local_size = 0;
    }

    strncpy(local_version, version, FW_VERSION_MAX_LEN);    //!!! Use of memory version after it is freed
    HAL_Free(version);    //!!! Double Free issues.
    fclose(fp);
    return local_size;
}

ESP8266平台无法连接到服务器

乐鑫SDK版本是v3.3(b74255d)

以下是调试信息:
INF|1970-01-01 00:00:06|qcloud_iot_device.c|iot_device_info_set(65): SDK_Ver: 3.1.3, Product_ID: R0UVGK0FR9, Device_Name: DEV000000000001
ERR|1970-01-01 00:00:06|HAL_TLS_mbedtls.c|HAL_TLS_Connect(256): mbedtls_ssl_handshake failed returned 0x7780(�s)
ERR|1970-01-01 00:00:06|mqtt_client.c|IOT_MQTT_Construct(121): mqtt connect with id: failed: -1001
INF|1970-01-01 00:00:06|mqtt_client.c|qcloud_iot_mqtt_fini(442): release mqtt client resources

PATH_MAX在Linux下编译出现重定义

环境:
$ gcc --version
gcc (GCC) 10.2.0
Copyright (c) 2020 Free Software Foundation, Inc.

$ cat /proc/version
CYGWIN_NT-10.0-17763 version 3.2.0-340.x86_64 (corinna@calimero) (gcc version 9.3.0 20200312 (Fedora Cygwin 9.3.0-1) (GCC) ) 2021-03-29 08:42 UTC

建议修改如下
#ifdef PATH_MAX
#undef PATH_MAX
#endif

ESP8266 Qcloud 移植MQTT完成,但是有其他疑问.

https://github.com/nickfox-taterli/esp8266_qcloud

MQTT例子完全OK,稳定,跑了2天了.但是shadow'例子各种出问题.

日志如下:

INF|1970-01-01 00:00:21|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:22|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:24|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:24|main.c|on_temperature_actuate_callback(178): actuate callback jsonString={"temperatureDesire":10}|dataLen=24
INF|1970-01-01 00:00:24|main.c|on_temperature_actuate_callback(181): modify desire temperature to:
INF|1970-01-01 00:00:25|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:26|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:27|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:28|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:30|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:31|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:32|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:33|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:34|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:36|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:36|main.c|on_request_handler(115): Method=GET|Ack=ACK_TIMEOUT
INF|1970-01-01 00:00:36|main.c|on_request_handler(116): received jsonString={"payload":{"metadata":{"temperatureDesire":{"timestamp":1554183524446}},"state":{"temperatureDesire":10},"timestamp":1554183524446,"version":39},"timestamp":1554183524446,"typ
INF|1970-01-01 00:00:37|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:38|main.c|mqtt_loop(383): Wait for Shadow Get Result
INF|1970-01-01 00:00:39|main.c|mqtt_loop(383): Wait for Shadow Get Result

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.