update qcloud sdk

1. iot-hub sdk update to 3.2.0
2. iot-explorer update to 3.1.1
This commit is contained in:
daishengdong
2020-05-07 11:11:04 +08:00
parent c8e39739d3
commit 3e631cd96a
594 changed files with 47287 additions and 44165 deletions

View File

@@ -0,0 +1,73 @@
# 腾讯云物联网通信 C-SDK
腾讯云物联网通信IoT Hub C-SDK 依靠安全且性能强大的数据通道,为物联网领域开发人员提供设备终端和云端的双向通信能力。
本文档介绍SDK的各项功能。
## 快速入门
请参考**mqtt_sample_快速入门.md**文档介绍如何在腾讯云物联网通信IoT Hub控制台申请设备, 并结合本 SDK 的**mqtt_sample**快速体验设备端通过 MQTT 协议连接到腾讯云IoT Hub, 发送和接收消息。
## 设备影子
请参考**shadow_sample_设备影子.md**文档,介绍设备影子功能,并结合 SDK 的**shadow_sample**展示影子的数据流和功能
## 固件升级
请参考**ota_sample_固件升级.md**文档,介绍固件升级功能,并结合 SDK 的**ota_mqtt_sample**展示固件升级的流程和功能
## 网关功能
请参考**gateway_sample_网关功能.md**文档介绍如何在腾讯IoT Hub控制台申请网关设备并绑定子设备, 并结合本 SDK 的**gateway_sample**快速体验网关设备通过 MQTT 协议连接到腾讯云IoT Hub, 代理子设备上下线,发送和接收消息。
## 设备互通
请参考**door_aircond_sample_设备互通.md**文档,介绍一个智能家居设备互通的场景, 结合本 SDK 的**aircond_shadow_sample**和**door_mqtt_sample**快速体验基于IoT Hub的消息转发和规则引擎实现设备之间的联动。
## 动态注册
请参考**dynreg_dev_sample_动态注册.md**文档,介绍腾讯云物联网的设备接入认证以及动态注册功能。
## 设备日志上报功能
设备端日志上报功能可将设备端的Log通过HTTP上报到云端并可在控制台展示方便用户远程调试、诊断及监控设备运行状况。目前该功能仅支持MQTT模式。
只要将SDK的编译宏FEATURE_LOG_UPLOAD_ENABLED置为y默认为y并在控制台设置上报级别则在代码中调用Log_e/w/i/d接口的日志除了会在终端打印出来还会上报云端并在控制台展示如下图。
![](https://main.qcloudimg.com/raw/cae7f9e7cf1e354cfc1e3578eb6746bc.png)
上报级别设置可参见下图Level级别越大则上报的日志越多比如Level3(信息)会将ERROR/WARN/INFO级别的日志都上报而DEBUG级别则不上报。控制台默认为关闭状态则表示设备端仅在MQTT连接失败的时候才会上报ERROR级别日志。
![](https://main.qcloudimg.com/raw/826b648993a267b1cc2f082148d8d073.png)
代码具体用例可以参考mqtt_sample以及qcloud_iot_export_log.h注释说明用户除了打开编译宏开关还需要调用IOT_Log_Init_Uploader函数进行初始化。SDK在IOT_MQTT_Yield函数中会定时进行上报此外用户可根据自身需要在程序出错退出的时候调用IOT_Log_Upload(true)强制上报。同时SDK提供在HTTP通讯出错无法上报日志时的缓存和恢复正常后重新上报机制但需要用户根据设备具体情况提供相关回调函数如不提供回调或回调函数提供不全则该缓存机制不生效HTTP通讯失败时日志会被丢掉。
打开日志上报功能请确保编译配置文件CMakeLists.txt中使能下面选项
```
set(FEATURE_LOG_UPLOAD_ENABLED ON)
```
## CoAP通讯
IoT Hub支持设备端通过CoAP协议接入请参考[CoAP 协议说明](https://cloud.tencent.com/document/product/634/14063)
编译运行示例程序coap_sample首先修改CMakeLists.txt确保以下选项存在(以密钥认证设备为例)
```
set(BUILD_TYPE "release")
set(COMPILE_TOOLS "gcc")
set(PLATFORM "linux")
set(FEATURE_COAP_COMM_ENABLED ON)
set(FEATURE_AUTH_MODE "KEY")
set(FEATURE_AUTH_WITH_NOTLS OFF)
set(FEATURE_DEBUG_DEV_INFO_USED OFF)
```
编译SDK将控制台创建的设备信息填入device_info.json中
再执行coap_sample
```
./output/release/bin/coap_sample
INF|2019-09-16 23:49:36|device.c|iot_device_info_set(67): SDK_Ver: 3.1.0, Product_ID: S3EUVBRJLB, Device_Name: test_device
INF|2019-09-16 23:49:38|coap_client.c|IOT_COAP_Construct(82): coap connect success
INF|2019-09-16 23:49:38|coap_client_message.c|coap_message_send(402): add coap message id: 9734 into wait list ret: 0
DBG|2019-09-16 23:49:38|coap_client_message.c|_coap_message_handle(295): receive coap piggy ACK message, id 9734
INF|2019-09-16 23:49:38|coap_client_auth.c|_coap_client_auth_callback(43): auth token message success, code_class: 2 code_detail: 5
DBG|2019-09-16 23:49:38|coap_client_auth.c|_coap_client_auth_callback(53): auth_token_len = 10, auth_token = YWAIGGUGUC
DBG|2019-09-16 23:49:38|coap_client_message.c|_coap_message_list_proc(146): remove the message id 9734 from list
INF|2019-09-16 23:49:38|coap_client_message.c|_coap_message_list_proc(85): remove node
INF|2019-09-16 23:49:38|coap_client.c|IOT_COAP_Construct(91): device auth successfully, connid: Xy9W9
INF|2019-09-16 23:49:38|coap_sample.c|main(170): topic name is S3EUVBRJLB/test_device/data
INF|2019-09-16 23:49:38|coap_client_message.c|coap_message_send(402): add coap message id: 9735 into wait list ret: 0
DBG|2019-09-16 23:49:38|coap_sample.c|main(177): client topic has been sent, msg_id: 9735
DBG|2019-09-16 23:49:39|coap_client_message.c|_coap_message_handle(295): receive coap piggy ACK message, id 9735
INF|2019-09-16 23:49:39|coap_sample.c|event_handler(78): message received ACK, msgid: 9735
DBG|2019-09-16 23:49:39|coap_client_message.c|_coap_message_list_proc(146): remove the message id 9735 from list
INF|2019-09-16 23:49:39|coap_client_message.c|_coap_message_list_proc(85): remove node
INF|2019-09-16 23:49:39|coap_client.c|IOT_COAP_Destroy(125): coap release!
```

View File

@@ -0,0 +1,146 @@
# 设备互通
本文档根据一个智能家居设备互通的场景, 结合本 SDK 的**aircond_shadow_sample**和**door_mqtt_sample**快速体验基于IoT Hub的消息转发和规则引擎实现设备之间的联动。
## 一. 控制台创建设备
#### 1. 场景说明
本文档的用户场景请参考腾讯云文档中心的[设备互通](https://cloud.tencent.com/document/product/634/11913)
假设一个智能家居的场景,门打开时候触发空调的温度控制,两个设备之间的消息是通过云端规则引擎进行转发的
![](https://mc.qcloudimg.com/static/img/d158634d34fbddbed17bfaa49cb24d90/airv1schema.png)
#### 2. 创建产品和设备,配置规则引擎
请参考[设备互通](https://cloud.tencent.com/document/product/634/11913) 分别创建空调和门产品再创建airConditioner1和door1设备并配置好规则引擎。
## 二. 编译运行示例程序(以**密钥认证设备**为例)
#### 1. 编译 SDK
修改CMakeLists.txt确保以下选项存在
```
set(BUILD_TYPE "release")
set(COMPILE_TOOLS "gcc")
set(PLATFORM "linux")
set(FEATURE_MQTT_COMM_ENABLED ON)
set(FEATURE_MQTT_DEVICE_SHADOW ON)
set(FEATURE_AUTH_MODE "KEY")
set(FEATURE_AUTH_WITH_NOTLS OFF)
set(FEATURE_DEBUG_DEV_INFO_USED OFF)
```
执行脚本编译
```
./cmake_build.sh
```
示例输出aircond_shadow_sample和door_mqtt_sample位于`output/release/bin`文件夹中
#### 2. 填写设备信息
将上面创建的airConditioner1设备的设备信息填写到一个JSON文件aircond_device_info.json中
```
{
"auth_mode":"KEY",
"productId":"GYT9V6D4AF",
"deviceName":"airConditioner1",
"key_deviceinfo":{
"deviceSecret":"vXeds12qazsGsMyf5SMfs6OA6y"
}
}
```
再将door1设备的设备信息填写到另一个JSON文件door_device_info.json中
```
{
"auth_mode":"KEY",
"productId":"S3EUVBRJLB",
"deviceName":"door1",
"key_deviceinfo":{
"deviceSecret":"i92E3QMNmxi5hvIxUHjO8gTdg"
}
}
```
#### 3. 执行aircond_shadow_sample示例程序
因为这个场景涉及到两个sample同时运行可以先在当前终端console运行空调示例可以看到示例订阅了 /{productID}/{deviceName}/control 主题,然后就处于循环等待状态
```
./output/release/bin/aircond_shadow_sample -c ./aircond_device_info.json
INF|2019-09-16 23:25:17|device.c|iot_device_info_set(67): SDK_Ver: 3.1.0, Product_ID: GYT9V6D4AF, Device_Name: airConditioner1
DBG|2019-09-16 23:25:17|HAL_TLS_mbedtls.c|HAL_TLS_Connect(204): Setting up the SSL/TLS structure...
DBG|2019-09-16 23:25:17|HAL_TLS_mbedtls.c|HAL_TLS_Connect(246): Performing the SSL/TLS handshake...
DBG|2019-09-16 23:25:17|HAL_TLS_mbedtls.c|HAL_TLS_Connect(247): Connecting to /GYT9V6D4AF.iotcloud.tencentdevices.com/8883...
INF|2019-09-16 23:25:18|HAL_TLS_mbedtls.c|HAL_TLS_Connect(269): connected with /GYT9V6D4AF.iotcloud.tencentdevices.com/8883...
INF|2019-09-16 23:25:19|mqtt_client.c|IOT_MQTT_Construct(125): mqtt connect with id: Nh9Vc success
DBG|2019-09-16 23:25:19|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(138): topicName=$shadow/operation/result/GYT9V6D4AF/airConditioner1|packet_id=56171
DBG|2019-09-16 23:25:19|shadow_client.c|_shadow_event_handler(63): shadow subscribe success, packet-id=56171
INF|2019-09-16 23:25:19|aircond_shadow_sample.c|event_handler(96): subscribe success, packet-id=56171
INF|2019-09-16 23:25:19|shadow_client.c|IOT_Shadow_Construct(172): Sync device data successfully
INF|2019-09-16 23:25:19|aircond_shadow_sample.c|main(256): Cloud Device Construct Success
DBG|2019-09-16 23:25:19|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(138): topicName=GYT9V6D4AF/airConditioner1/control|packet_id=56172
DBG|2019-09-16 23:25:19|shadow_client.c|_shadow_event_handler(63): shadow subscribe success, packet-id=56172
INF|2019-09-16 23:25:19|aircond_shadow_sample.c|event_handler(96): subscribe success, packet-id=56172
INF|2019-09-16 23:25:19|aircond_shadow_sample.c|main(291): airConditioner state: close
INF|2019-09-16 23:25:19|aircond_shadow_sample.c|main(292): currentTemperature: 32.000000, energyConsumption: 0.000000
```
#### 4. 执行door_mqtt_sample示例程序模拟回家事件
这时打开另一个终端console运行门的示例可以看到示例往 /{productID}/{deviceName}/event 主题发送了JSON消息{"action": "come_home", "targetDevice": "airConditioner1"}表示将回家的消息通知目标设备airConditioner1然后程序就退出了
```
./output/release/bin/door_mqtt_sample -c ../devinfo/door_device_info.json -t airConditioner1 -a come_home
INF|2019-09-16 23:29:11|device.c|iot_device_info_set(67): SDK_Ver: 3.1.0, Product_ID: S3EUVBRJLB, Device_Name: test_dev_key
DBG|2019-09-16 23:29:11|HAL_TLS_mbedtls.c|HAL_TLS_Connect(204): Setting up the SSL/TLS structure...
DBG|2019-09-16 23:29:11|HAL_TLS_mbedtls.c|HAL_TLS_Connect(246): Performing the SSL/TLS handshake...
DBG|2019-09-16 23:29:11|HAL_TLS_mbedtls.c|HAL_TLS_Connect(247): Connecting to /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2019-09-16 23:29:11|HAL_TLS_mbedtls.c|HAL_TLS_Connect(269): connected with /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2019-09-16 23:29:11|mqtt_client.c|IOT_MQTT_Construct(125): mqtt connect with id: d89Wh success
INF|2019-09-16 23:29:11|door_mqtt_sample.c|main(229): Cloud Device Construct Success
DBG|2019-09-16 23:29:11|mqtt_client_publish.c|qcloud_iot_mqtt_publish(329): publish topic seq=46683|topicName=S3EUVBRJLB/test_dev_key/event|payload={"action": "come_home", "targetDevice": "airConditioner1"}
INF|2019-09-16 23:29:11|door_mqtt_sample.c|main(246): Wait for publish ack
INF|2019-09-16 23:29:11|door_mqtt_sample.c|event_handler(81): publish success, packet-id=46683
INF|2019-09-16 23:29:13|mqtt_client_connect.c|qcloud_iot_mqtt_disconnect(437): mqtt disconnect!
INF|2019-09-16 23:29:13|mqtt_client.c|IOT_MQTT_Destroy(186): mqtt release!
```
#### 5. 观察空调设备的消息接收,模拟消息响应
这个时候观察aircond_shadow_sample的打印输出可以看到已经收到door1发送的回家消息并将空调打开开始调节温度。
```
INF|2019-09-16 23:29:11|aircond_shadow_sample.c|main(291): airConditioner state: close
INF|2019-09-16 23:29:11|aircond_shadow_sample.c|main(292): currentTemperature: 32.000000, energyConsumption: 0.000000
INF|2019-09-16 23:29:12|aircond_shadow_sample.c|on_message_callback(140): Receive Message With topicName:GYT9V6D4AF/airConditioner1/control, payload:{"action":"come_home","targetDevice":"airConditioner1"}
INF|2019-09-16 23:29:12|aircond_shadow_sample.c|main(291): airConditioner state: open
INF|2019-09-16 23:29:12|aircond_shadow_sample.c|main(292): currentTemperature: 31.000000, energyConsumption: 1.000000
INF|2019-09-16 23:29:13|aircond_shadow_sample.c|main(291): airConditioner state: open
INF|2019-09-16 23:29:13|aircond_shadow_sample.c|main(292): currentTemperature: 30.000000, energyConsumption: 2.000000
```
#### 6. 执行door_mqtt_sample示例程序模拟离开事件
这时如果再次运行门的示例,更改程序启动参数,可以看到示例往 /{productID}/{deviceName}/event 主题发送了JSON消息{"action": "leave_home", "targetDevice": "airConditioner1"}表示将离开的消息通知目标设备airConditioner1
```
./output/release/bin/door_mqtt_sample -c ../devinfo/door_device_info.json -t airConditioner1 -a leave_home
INF|2019-09-16 23:40:35|device.c|iot_device_info_set(67): SDK_Ver: 3.1.0, Product_ID: S3EUVBRJLB, Device_Name: test_dev_key
DBG|2019-09-16 23:40:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(204): Setting up the SSL/TLS structure...
DBG|2019-09-16 23:40:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(246): Performing the SSL/TLS handshake...
DBG|2019-09-16 23:40:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(247): Connecting to /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2019-09-16 23:40:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(269): connected with /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2019-09-16 23:40:35|mqtt_client.c|IOT_MQTT_Construct(125): mqtt connect with id: 3I59W success
INF|2019-09-16 23:40:35|door_mqtt_sample.c|main(229): Cloud Device Construct Success
DBG|2019-09-16 23:40:35|mqtt_client_publish.c|qcloud_iot_mqtt_publish(329): publish topic seq=39867|topicName=S3EUVBRJLB/test_dev_key/event|payload={"action": "leave_home", "targetDevice": "airConditioner1"}
INF|2019-09-16 23:40:35|door_mqtt_sample.c|main(246): Wait for publish ack
INF|2019-09-16 23:40:35|door_mqtt_sample.c|event_handler(81): publish success, packet-id=39867
INF|2019-09-16 23:40:37|mqtt_client_connect.c|qcloud_iot_mqtt_disconnect(437): mqtt disconnect!
INF|2019-09-16 23:40:37|mqtt_client.c|IOT_MQTT_Destroy(186): mqtt release!
```
#### 7. 观察空调设备的消息接收,模拟消息响应
这个时候观察aircond_shadow_sample的打印输出可以看到已经收到door1发送的离开消息并将空调关闭温度开始升高。
```
INF|2019-09-16 23:40:35|aircond_shadow_sample.c|main(291): airConditioner state: open
INF|2019-09-16 23:40:35|aircond_shadow_sample.c|main(292): currentTemperature: 26.000000, energyConsumption: 6.000000
INF|2019-09-16 23:40:36|aircond_shadow_sample.c|on_message_callback(140): Receive Message With topicName:GYT9V6D4AF/airConditioner1/control, payload:{"action":"leave_home","targetDevice":"airConditioner1"}
INF|2019-09-16 23:40:36|aircond_shadow_sample.c|main(291): airConditioner state: close
INF|2019-09-16 23:40:36|aircond_shadow_sample.c|main(292): currentTemperature: 26.500000, energyConsumption: 6.000000
INF|2019-09-16 23:40:37|aircond_shadow_sample.c|main(291): airConditioner state: close
INF|2019-09-16 23:40:37|aircond_shadow_sample.c|main(292): currentTemperature: 27.000000, energyConsumption: 6.000000
INF|2019-09-16 23:40:39|aircond_shadow_sample.c|main(291): airConditioner state: close
```
至此,完成了模拟设备互通联动的示例运行。

View File

@@ -0,0 +1,81 @@
# 设备接入及动态注册
关于IoT Hub设备接入认证的详细介绍请参考 [设备身份认证 ](https://cloud.tencent.com/document/product/634/35272)
简单来说物联网通信平台IoT Hub提供三种设备端接入认证的方案
- 证书认证(设备级):为每台设备分配证书 + 私钥,使用非对称加密认证接入,用户需要为每台设备烧录不同的配置信息。
- 密钥认证(设备级):为每台设备分配设备密钥,使用对称加密认证接入,用户需要为每台设备烧录不同的配置信息。
- 动态注册认证(产品级):为同一产品下的所有设备分配统一密钥,设备通过注册请求获取设备证书/密钥后认证接入,用户可以为同一批设备烧录相同的配置信息。
使用设备动态注册功能可以使得同一个产品型号的设备出厂时烧录的是统一的固件该固件只包含统一的产品ID和产品密钥。设备出厂后判断设备信息为空判断设备信息为空的逻辑由业务逻辑实现可参考示例则触发设备动态注册从平台申请设备的证书创建的产品为证书认证产品或者设备的密钥创建的产品为密钥认证方式将获取到的设备信息保存下来之后后续的设备接入就可以使用。
## 一. 控制台使能动态注册
动态注册时设备名称的生成有两种方式一种是在控制台使能了动态注册产品的自动创建设备功能则设备可以自行生成设备名称但需保证同一产品下没有重复一般取设备的唯一信息比如CPUID或mac地址。另一种是没有使能动态注册产品的自动创建设备则需要在控制台预先录入各设备的名称且设备动态注册时设备要与录入的设备名称一致此种方式更加安全便利性有所下降。
控制台使能动态注册设置如下图示:
![](https://main.qcloudimg.com/raw/a02f57cbe40f26ead94170396d78253c.jpg)
将产品密钥ProductSecret保存下来。
## 二. 编译运行示例程序(以**密钥认证设备**为例)
#### 1. 编译 SDK
修改CMakeLists.txt确保以下选项存在
```
set(BUILD_TYPE "release")
set(COMPILE_TOOLS "gcc")
set(PLATFORM "linux")
set(FEATURE_MQTT_COMM_ENABLED ON)
set(FEATURE_DEV_DYN_REG_ENABLED ON)
set(FEATURE_AUTH_MODE "KEY")
set(FEATURE_AUTH_WITH_NOTLS OFF)
set(FEATURE_DEBUG_DEV_INFO_USED OFF)
```
执行脚本编译
```
./cmake_build.sh
```
示例输出dynreg_dev_sample位于`output/release/bin`文件夹中
#### 2. 填写设备信息
将控制台获取到的产品信息填写到一个JSON文件dynreg_device_info.json中其中deviceName字段填写要生成的设备名字deviceSecret字段保持为"YOUR_IOT_PSK"这样dynreg_dev_sample就会判断设备信息为空知道这个设备是需要进行动态注册。这部分逻辑可以由用户自行实现sample仅作示例。
```
{
"auth_mode":"KEY",
"productId":"S3EUVBRJLB",
"productSecret":"8Xz56tyfgQAZEDCTUGau4snA",
"deviceName":"device_1234",
"key_deviceinfo":{
"deviceSecret":"YOUR_IOT_PSK"
}
}
```
#### 3. 运行示例
执行设备动态注册例程dynreg_dev_sample
```
./output/release/bin/dynreg_dev_sample -c ./dynreg_device_info.json
DBG|2019-09-17 11:50:35|dynreg_dev_sample.c|main(80): dev psk not exist!
DBG|2019-09-17 11:50:35|dynreg.c|IOT_DynReg_Device(467): sign:ZWM4YTEyMWE2ODUxYzk1M2Q0MDc2OWNmN2FhMTg1ZWM1ODgxMWNkNQ==
DBG|2019-09-17 11:50:35|dynreg.c|IOT_DynReg_Device(483): request:{"deviceName":"device_1234","nonce":1439928322,"productId":"S3EUVBRJLB","timestamp":1568692235,"signature":"ZWM4YTEyMWE2ODUxYzk1M2Q0MDc2OWNmN2FhMTg1ZWM1ODgxMWNkNQ=="}
DBG|2019-09-17 11:50:35|dynreg.c|IOT_DynReg_Device(485): resbuff len:256
DBG|2019-09-17 11:50:35|HAL_TLS_mbedtls.c|_mbedtls_client_init(134): psk/pskid is empty!|psk=(null)|psd_id=(null)
DBG|2019-09-17 11:50:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(204): Setting up the SSL/TLS structure...
DBG|2019-09-17 11:50:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(246): Performing the SSL/TLS handshake...
DBG|2019-09-17 11:50:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(247): Connecting to /gateway.tencentdevices.com/443...
INF|2019-09-17 11:50:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(269): connected with /gateway.tencentdevices.com/443...
DBG|2019-09-17 11:50:35|utils_httpc.c|qcloud_http_client_connect(749): http client connect success
DBG|2019-09-17 11:50:37|dynreg.c|_parse_devinfo(244): recv: {"code":0,"message":"","len":53,"payload":"eHGRUBar9LBPI+mcaHnVEZsj05mSdoZLPhd54hDJXv/2va2rXSpfddgRy5XE/FIS835NjUr5Mhw1AJSg4yGC/w=="}
DBG|2019-09-17 11:50:37|dynreg.c|_parse_devinfo(258): payload:eHGRUBar9LBPI+mcaHnVEZsj05mSdoZLPhd54hDJXv/2va2rXSpfddgRy5XE/FIS835NjUr5Mhw1AJSg4yGC/w==
DBG|2019-09-17 11:50:37|dynreg.c|IOT_DynReg_Device(489): request dev info success
DBG|2019-09-17 11:50:37|HAL_Device_linux.c|iot_save_devinfo_to_json_file(340): JsonDoc(183):{
"auth_mode":"KEY",
"productId":"S3EUVBRJLB",
"productSecret":"8XzjN8rfgFVGDTNTUGau4snA",
"deviceName":"device_1234",
"key_deviceinfo":{
"deviceSecret":"7WmFArtyFGH5632QwJWtYwio"
}
}
DBG|2019-09-17 11:50:37|dynreg_dev_sample.c|main(99): dynamic register success,productID: S3EUVBRJLB, devName: device_1234, device_secret: 7WmFArtyFGH5632QwJWtYwio
```
可以看到设备动态注册已经成功获取到的设备密钥也写入到dynreg_device_info.json文件中了

View File

@@ -0,0 +1,148 @@
# 网关设备快速入门
本文档将讲述如何在腾讯IoT Hub控制台申请网关设备并绑定子设备, 并结合本 SDK 的**gateway_sample**快速体验网关设备通过 MQTT 协议连接到腾讯云IoT Hub, 代理子设备上下线,发送和接收消息。
## 一. 控制台创建网关设备
#### 1. 创建网关产品和设备
点击页面**创建新产品**按钮, 创建一个产品。
![](https://main.qcloudimg.com/raw/a0da21dc6ac9a9e1dede0077d40cfb22.png)
在弹出的产品窗口中,选择节点类型和产品类型,输入产品名称,选择认证方式和数据格式,输入产品描述,然后点击确定创建。普通网关设备,可按下图选择。
![](https://main.qcloudimg.com/raw/d3f5de3bd07a779f9b1306085fa4d1f1.png)
在生成的产品页面下,点击**设备列表**页面添加新设备。
![](https://main.qcloudimg.com/raw/0530e0da724cd36baefc7011ebce4775.png)
如果产品认证方式为证书认证,输入设备名称成功后,切记点击弹窗中的**下载**按钮,下载所得包中的设备密钥文件和设备证书用于设备连接物联网通信的鉴权。
![](https://main.qcloudimg.com/raw/6592056f1b55fa9262e4b2ab31d0b218.png)
如果产品认证方式为密钥认证,输入设备名称成功后,会在弹窗中显示新添加设备的密钥
![](https://main.qcloudimg.com/raw/fe7a013b1d8c29c477d0ed6d00643751.png)
网关产品,除了自身创建产品和设备,当需要代理子设备进行通讯时,还需要按照普通产品的方式先创建子产品和子设备,并在网关产品页面添加子产品和子设备。需要注意的是子设备是无法直连物联网平台的产品,由网关设备代理连接,所以子设备的认证方式不影响连接,由网关设备来负责认证接入。
创建好子产品之后,先到网关产品页面的子产品栏目添加子产品
![](https://main.qcloudimg.com/raw/00da59942515b1d772323c7087f627e3.png)
再到网关设备页面的子设备栏目添加子设备
![](https://main.qcloudimg.com/raw/c24938ac8ed3aa3e0834cb40598740ca.png)
#### 2. 创建可订阅可发布的Topic
进入产品设置页面的后, 点击权限列表,再点击**添加Topic权限**。
![](https://main.qcloudimg.com/raw/65a2d1b7251de37ce1ca2ba334733c57.png)
在弹窗中输入 data, 并设置操作权限为**发布和订阅**,点击创建。
![](https://main.qcloudimg.com/raw/f429b32b12e3cb0cf319b1efe11ccceb.png)
随后将会创建出 productID/\${deviceName}/data 的 Topic在产品页面的权限列表中可以查看该产品的所有权限。
对于网关产品除了添加本产品的Topic权限还需要为子产品添加Topic权限
![](https://main.qcloudimg.com/raw/3de74cfd5b235fe942fe18c359ad08af.png)
## 二. 编译运行示例程序
#### 1. 编译 SDK
修改CMakeLists.txt确保以下选项存在(以**密钥认证设备**为例)
```
set(BUILD_TYPE "release")
set(COMPILE_TOOLS "gcc")
set(PLATFORM "linux")
set(FEATURE_MQTT_COMM_ENABLED ON)
set(FEATURE_GATEWAY_ENABLED ON)
set(FEATURE_AUTH_MODE "KEY")
set(FEATURE_AUTH_WITH_NOTLS OFF)
set(FEATURE_DEBUG_DEV_INFO_USED OFF)
```
执行脚本编译
```
./cmake_build.sh
```
示例输出位于`output/release/bin`文件夹中
#### 2. 填写设备信息
将上面在腾讯云物联网IoT Hub创建的网关设备和子设备的设备信息(以**密钥认证设备**为例)填写到device_info.json中
```
{
"auth_mode":"KEY",
"productId":"NINEPLMEB6",
"deviceName":"Gateway-demo",
"key_deviceinfo":{
"deviceSecret":"vX23qEazsGsMyf5SMfs6OA6y"
}
"subDev":{
"sub_productId":"S3EUVBRJLB",
"sub_devName":"test_device"
}
}
```
#### 3. 执行网关示例程序
如下日志信息显示示例程序通过MQTT网关代理子设备上下线状态变化发布和订阅消息成功。
```
./gateway_sample
INF|2019-09-16 14:35:34|device.c|iot_device_info_set(67): SDK_Ver: 3.1.0, Product_ID: NINEPLMEB6, Device_Name: Gateway-demo
DBG|2019-09-16 14:35:34|HAL_TLS_mbedtls.c|HAL_TLS_Connect(204): Setting up the SSL/TLS structure...
DBG|2019-09-16 14:35:34|HAL_TLS_mbedtls.c|HAL_TLS_Connect(246): Performing the SSL/TLS handshake...
DBG|2019-09-16 14:35:34|HAL_TLS_mbedtls.c|HAL_TLS_Connect(247): Connecting to /NINEPLMEB6.iotcloud.tencentdevices.com/8883...
INF|2019-09-16 14:35:34|HAL_TLS_mbedtls.c|HAL_TLS_Connect(269): connected with /NINEPLMEB6.iotcloud.tencentdevices.com/8883...
INF|2019-09-16 14:35:34|mqtt_client.c|IOT_MQTT_Construct(125): mqtt connect with id: Senw3 success
DBG|2019-09-16 14:35:34|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(138): topicName=$gateway/operation/result/NINEPLMEB6/Gateway-demo|packet_id=27802
DBG|2019-09-16 14:35:34|gateway_api.c|_gateway_event_handler(23): gateway sub|unsub(3) success, packet-id=27802
DBG|2019-09-16 14:35:34|gateway_api.c|IOT_Gateway_Subdev_Online(125): there is no session, create a new session
DBG|2019-09-16 14:35:34|mqtt_client_publish.c|qcloud_iot_mqtt_publish(337): publish packetID=0|topicName=$gateway/operation/NINEPLMEB6/Gateway-demo|payload={"type":"online","payload":{"devices":[{"product_id":"S3EUVBRJLB","device_name":"test_device"}]}}
INF|2019-09-16 14:35:35|gateway_common.c|_gateway_message_handler(134): client_id(S3EUVBRJLB/test_device), online success. result 0
DBG|2019-09-16 14:35:35|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(138): topicName=S3EUVBRJLB/test_device/data|packet_id=27803
DBG|2019-09-16 14:35:35|gateway_api.c|_gateway_event_handler(23): gateway sub|unsub(3) success, packet-id=27803
INF|2019-09-16 14:35:35|gateway_sample.c|_event_handler(61): subscribe success, packet-id=27803
DBG|2019-09-16 14:35:35|mqtt_client_publish.c|qcloud_iot_mqtt_publish(329): publish topic seq=27804|topicName=S3EUVBRJLB/test_device/data|payload={"data":"test gateway"}
INF|2019-09-16 14:35:35|gateway_sample.c|_event_handler(88): publish success, packet-id=27804
INF|2019-09-16 14:35:35|gateway_sample.c|_message_handler(111): Receive Message With topicName:S3EUVBRJLB/test_device/data, payload:{"data":"test gateway"}
DBG|2019-09-16 14:35:36|mqtt_client_publish.c|qcloud_iot_mqtt_publish(337): publish packetID=0|topicName=$gateway/operation/NINEPLMEB6/Gateway-demo|payload={"type":"offline","payload":{"devices":[{"product_id":"S3EUVBRJLB","device_name":"test_device"}]}}
INF|2019-09-16 14:35:36|gateway_common.c|_gateway_message_handler(139): client_id(S3EUVBRJLB/test_device), offline success. result 0
INF|2019-09-16 14:35:37|mqtt_client_connect.c|qcloud_iot_mqtt_disconnect(437): mqtt disconnect!
INF|2019-09-16 14:35:37|mqtt_client.c|IOT_MQTT_Destroy(186): mqtt release!
```
#### 4. 观察子设备上线
如下日志信息显示示例程序的网关设备Gateway-demo通过MQTT代理子设备test_device的上线成功
```
DBG|2019-09-16 14:35:34|mqtt_client_publish.c|qcloud_iot_mqtt_publish(337): publish packetID=0|topicName=$gateway/operation/NINEPLMEB6/Gateway-demo|payload={"type":"online","payload":{"devices":[{"product_id":"S3EUVBRJLB","device_name":"test_device"}]}}
INF|2019-09-16 14:35:35|gateway_common.c|_gateway_message_handler(134): client_id(S3EUVBRJLB/test_device), online success. result 0
```
#### 5. 观察网关发送接收子设备的消息
如下日志信息显示示例程序的网关设备Gateway-demo通过MQTT代理子设备test_device的消息发送接收
```
DBG|2019-09-16 14:35:35|mqtt_client_publish.c|qcloud_iot_mqtt_publish(329): publish topic seq=27804|topicName=S3EUVBRJLB/test_device/data|payload={"data":"test gateway"}
INF|2019-09-16 14:35:35|gateway_sample.c|_event_handler(88): publish success, packet-id=27804
INF|2019-09-16 14:35:35|gateway_sample.c|_message_handler(111): Receive Message With topicName:S3EUVBRJLB/test_device/data, payload:{"data":"test gateway"}
```
## 三. 代码说明
gateway_sample示例演示了网关代理一个子设备的情况如果用户需要增加更多子设备可以先在控制台添加子设备然后在代码里面通过创建更多GatewayParam参数实例并将GatewayParam参数传递给网关各个API即可以实现网关代理多个子设备进行通讯。
```
// one GatewayParam only support one sub-device
// use more GatewayParam to add more sub-device
GatewayParam gw_param1 = DEFAULT_GATEWAY_PARAMS;;
gw_param1.product_id = gw_dev_info.gw_info.product_id;
gw_param1.device_name = gw_dev_info.gw_info.device_name;
gw_param1.subdev_product_id = "SUB-PRODUCT1";
gw_param1.subdev_device_name = "SUB-DEVICE1";
IOT_Gateway_Subdev_Online(client, &gw_param1);
```

View File

@@ -0,0 +1,130 @@
# 快速开始
本文档将讲述如何在腾讯云物联网通信IoT Hub控制台申请设备, 并结合本 SDK 的**mqtt_sample**快速体验设备端通过 MQTT 协议连接到腾讯云IoT Hub, 发送和接收消息。
## 一. 控制台创建设备
#### 1. 注册/登录腾讯云账号
访问[腾讯云登录页面](https://cloud.tencent.com/login?s_url=https%3A%2F%2Fcloud.tencent.com%2F), 点击[立即注册](https://cloud.tencent.com/register?s_url=https%3A%2F%2Fcloud.tencent.com%2F), 免费获取腾讯云账号,若您已有账号,可直接登录。
#### 2. 访问物联网通信控制台
登录后点击右上角控制台,进入控制台后,鼠标悬停在云产品上,弹出层叠菜单,点击物联网通信。
![](https://main.qcloudimg.com/raw/f8719b28d557496ce3388e0439ca38b6.png)
或者直接访问[物联网通信控制台](https://console.qcloud.com/iotcloud)
#### 3. 创建产品和设备
点击页面**创建新产品**按钮, 创建一个产品。
![](https://main.qcloudimg.com/raw/a0da21dc6ac9a9e1dede0077d40cfb22.png)
在弹出的产品窗口中,选择节点类型和产品类型,输入产品名称,选择认证方式和数据格式,输入产品描述,然后点击确定创建。对于普通直连设备,可按下图选择。
![](https://main.qcloudimg.com/raw/7ee90122a01f5f277785885669a56aec.png)
在生成的产品页面下,点击**设备列表**页面添加新设备。
![](https://main.qcloudimg.com/raw/0530e0da724cd36baefc7011ebce4775.png)
如果产品认证方式为证书认证,输入设备名称成功后,切记点击弹窗中的**下载**按钮,下载所得包中的设备密钥文件和设备证书用于设备连接物联网通信的鉴权。
![](https://main.qcloudimg.com/raw/6592056f1b55fa9262e4b2ab31d0b218.png)
如果产品认证方式为密钥认证,输入设备名称成功后,会在弹窗中显示新添加设备的密钥
![](https://main.qcloudimg.com/raw/fe7a013b1d8c29c477d0ed6d00643751.png)
#### 4. 创建可订阅可发布的Topic
按照**第三步**中进入产品设置页面的方法进入页面后, 点击权限列表,再点击**添加Topic权限**。
![](https://main.qcloudimg.com/raw/65a2d1b7251de37ce1ca2ba334733c57.png)
在弹窗中输入 data, 并设置操作权限为**发布和订阅**,点击创建。
![](https://main.qcloudimg.com/raw/f429b32b12e3cb0cf319b1efe11ccceb.png)
随后将会创建出 productID/\${deviceName}/data 的 Topic在产品页面的权限列表中可以查看该产品的所有权限。
#### 5. 创建消息转发规则
消息在设备间的转发需要通过规则引擎进行,具体用法请参考[规则引擎](https://cloud.tencent.com/document/product/634/14446)
需要注意的是同一个设备如果想进行自发自收也需要创建转发规则对于本示例可以参考下图设立转发规则需要将图片中productID以及deviceName部分替换为上面创建的设备信息
![](https://main.qcloudimg.com/raw/5cdda90be21256386bcd786268f72e6f.png)
## 二. 编译运行示例程序
#### 1. 编译 SDK
修改CMakeLists.txt确保以下选项存在(以密钥认证设备为例)
```
set(BUILD_TYPE "release")
set(COMPILE_TOOLS "gcc")
set(PLATFORM "linux")
set(FEATURE_MQTT_COMM_ENABLED ON)
set(FEATURE_AUTH_MODE "KEY")
set(FEATURE_AUTH_WITH_NOTLS OFF)
set(FEATURE_DEBUG_DEV_INFO_USED OFF)
```
执行脚本编译
```
./cmake_build.sh
```
示例输出位于`output/release/bin`文件夹中
#### 2. 填写设备信息
将上面在腾讯云物联网IoT Hub创建的设备的设备信息(以**密钥认证设备**为例)填写到device_info.json中
```
{
"auth_mode":"KEY",
"productId":"S3EUVBRJLB",
"deviceName":"test_device",
"key_deviceinfo":{
"deviceSecret":"vX6PQqazsGsMyf5SMfs6OA6y"
}
}
```
#### 3. 执行 mqtt_sample 示例程序
```
./output/release/bin/mqtt_sample
INF|2019-09-12 21:28:20|device.c|iot_device_info_set(67): SDK_Ver: 3.1.0, Product_ID: S3EUVBRJLB, Device_Name: test_device
DBG|2019-09-12 21:28:20|HAL_TLS_mbedtls.c|HAL_TLS_Connect(204): Setting up the SSL/TLS structure...
DBG|2019-09-12 21:28:20|HAL_TLS_mbedtls.c|HAL_TLS_Connect(246): Performing the SSL/TLS handshake...
DBG|2019-09-12 21:28:20|HAL_TLS_mbedtls.c|HAL_TLS_Connect(247): Connecting to /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2019-09-12 21:28:20|HAL_TLS_mbedtls.c|HAL_TLS_Connect(269): connected with /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2019-09-12 21:28:20|mqtt_client.c|IOT_MQTT_Construct(125): mqtt connect with id: p8t0W success
INF|2019-09-12 21:28:20|mqtt_sample.c|main(303): Cloud Device Construct Success
DBG|2019-09-12 21:28:20|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(138): topicName=$sys/operation/result/S3EUVBRJLB/test_device|packet_id=1932
INF|2019-09-12 21:28:20|mqtt_sample.c|_mqtt_event_handler(71): subscribe success, packet-id=1932
DBG|2019-09-12 21:28:20|system_mqtt.c|_system_mqtt_sub_event_handler(80): mqtt sys topic subscribe success
DBG|2019-09-12 21:28:20|mqtt_client_publish.c|qcloud_iot_mqtt_publish(337): publish packetID=0|topicName=$sys/operation/S3EUVBRJLB/test_device|payload={"type": "get", "resource": ["time"]}
DBG|2019-09-12 21:28:20|system_mqtt.c|_system_mqtt_message_callback(63): Recv Msg Topic:$sys/operation/result/S3EUVBRJLB/test_device, payload:{"type":"get","time":1568294900}
INF|2019-09-12 21:28:21|mqtt_sample.c|main(316): system time is 1568294900
DBG|2019-09-12 21:28:21|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(138): topicName=S3EUVBRJLB/test_device/data|packet_id=1933
INF|2019-09-12 21:28:21|mqtt_sample.c|_mqtt_event_handler(71): subscribe success, packet-id=1933
DBG|2019-09-12 21:28:21|mqtt_client_publish.c|qcloud_iot_mqtt_publish(329): publish topic seq=1934|topicName=S3EUVBRJLB/test_device/data|payload={"action": "publish_test", "count": "0"}
INF|2019-09-12 21:28:21|mqtt_sample.c|_mqtt_event_handler(98): publish success, packet-id=1934
INF|2019-09-12 21:28:21|mqtt_sample.c|on_message_callback(195): Receive Message With topicName:S3EUVBRJLB/test_device/data, payload:{"action": "publish_test", "count": "0"}
INF|2019-09-12 21:28:22|mqtt_client_connect.c|qcloud_iot_mqtt_disconnect(437): mqtt disconnect!
INF|2019-09-12 21:28:22|system_mqtt.c|_system_mqtt_sub_event_handler(98): mqtt client has been destroyed
INF|2019-09-12 21:28:22|mqtt_client.c|IOT_MQTT_Destroy(186): mqtt release!
```
#### 4. 观察消息发送
如下日志信息显示示例程序通过 MQTT 的 Publish 类型消息, 上报数据到 /{productID}/{deviceName}/data, 服务器已经收到并成功完成了该消息的处理
```
INF|2019-09-12 21:28:21|mqtt_sample.c|_mqtt_event_handler(98): publish success, packet-id=1934
```
#### 5. 观察消息接收
如下日志信息显示该消息因为是到达已被订阅的 Topic, 所以又被服务器原样推送到示例程序, 并进入相应的回调函数
```
INF|2019-09-12 21:28:21|mqtt_sample.c|on_message_callback(195): Receive Message With topicName:S3EUVBRJLB/test_device/data, payload:{"action": "publish_test", "count": "0"}
```
#### 6. 观察控制台日志
可以登录物联网通信控制台, 点击左边导航栏中的**云日志**, 查看刚才上报的消息
![](https://main.qcloudimg.com/raw/f589691c7e007b59a5426ede6dc17ddb.png)

View File

@@ -0,0 +1,112 @@
# OTA设备固件升级
关于物联平台 OTA 固件升级功能及流程介绍,请参考官网文档[设备固件升级](https://cloud.tencent.com/document/product/634/14674)
## 一. 上传固件
进行固件升级,首先要上传固件到物联网后台,可以通过控制台进行上传,如下图示:
![](https://main.qcloudimg.com/raw/219ab155f886e2ac1a1ebd0d7a1184aa.png)
## 二. 编译运行示例程序(以**MQTT密钥认证设备**为例)
#### 1. 编译 SDK
修改CMakeLists.txt确保以下选项存在
```
set(BUILD_TYPE "release")
set(COMPILE_TOOLS "gcc")
set(PLATFORM "linux")
set(FEATURE_MQTT_COMM_ENABLED ON)
set(FEATURE_OTA_COMM_ENABLED ON)
set(FEATURE_OTA_SIGNAL_CHANNEL "MQTT")
set(FEATURE_AUTH_MODE "KEY")
set(FEATURE_AUTH_WITH_NOTLS OFF)
set(FEATURE_DEBUG_DEV_INFO_USED OFF)
```
执行脚本编译
```
./cmake_build.sh
```
示例输出ota_mqtt_sample位于`output/release/bin`文件夹中
#### 2. 填写设备信息
将设备信息填写到配置文件device_info.json中
```
{
"auth_mode":"KEY",
"productId":"S3EUVBRJLB",
"deviceName":"test_device",
"key_deviceinfo":{
"deviceSecret":"vX6PQqazsGsMyf5SMfs6OA6y"
}
}
```
#### 3. 运行示例
执行OTA MQTT例程ota_mqtt_sample
```
./output/release/bin/ota_mqtt_sample
INF|2020-03-04 16:50:35|qcloud_iot_device.c|iot_device_info_set(50): SDK_Ver: 3.1.2, Product_ID: S3EUVBRJLB, Device_Name: test_device
DBG|2020-03-04 16:50:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(206): Setting up the SSL/TLS structure...
DBG|2020-03-04 16:50:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(248): Performing the SSL/TLS handshake...
DBG|2020-03-04 16:50:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(249): Connecting to /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2020-03-04 16:50:35|HAL_TLS_mbedtls.c|HAL_TLS_Connect(271): connected with /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2020-03-04 16:50:35|mqtt_client.c|IOT_MQTT_Construct(111): mqtt connect with id: BzaMF success
INF|2020-03-04 16:50:35|ota_mqtt_sample.c|main(516): Cloud Device Construct Success
DBG|2020-03-04 16:50:35|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(141): topicName=$ota/update/S3EUVBRJLB/test_device|packet_id=63333
INF|2020-03-04 16:50:35|ota_mqtt_sample.c|_event_handler(77): subscribe success, packet-id=63333
DBG|2020-03-04 16:50:35|ota_mqtt.c|_otamqtt_event_callback(117): OTA topic subscribe success
INF|2020-03-04 16:50:36|ota_mqtt_sample.c|_get_local_fw_running_version(363): FW running version: 1.0.0
DBG|2020-03-04 16:50:36|mqtt_client_publish.c|qcloud_iot_mqtt_publish(334): publish topic seq=63334|topicName=$ota/report/S3EUVBRJLB/test_device|payload={"type": "report_version", "report":{"version":"1.0.0"}}
INF|2020-03-04 16:50:36|ota_mqtt_sample.c|_event_handler(89): publish success, packet-id=63334
DBG|2020-03-04 16:50:36|ota_mqtt.c|_otamqtt_upgrage_cb(103): topic=$ota/update/S3EUVBRJLB/test_device
INF|2020-03-04 16:50:36|ota_mqtt.c|_otamqtt_upgrage_cb(104): len=86, topic_msg={"result_code":0,"result_msg":"success","type":"report_version_rsp","version":"1.0.0"}
INF|2020-03-04 16:50:36|ota_client.c|_ota_callback(102): Report version success!
INF|2020-03-04 16:50:36|ota_mqtt_sample.c|process_ota(389): wait for ota upgrade command...
INF|2020-03-04 16:50:37|ota_mqtt_sample.c|process_ota(389): wait for ota upgrade command...
```
可以看到设备已经上报了当前的固件版本,并在等待固件升级的命令下发
#### 4. 执行固件升级命令
在收到设备上报的固件版本之后,可以选择要升级的新固件版本并执行升级命令,可以通过控制台进行操作,如下图示:
![](https://main.qcloudimg.com/raw/ac71788c5bc5d542eb10292751e12fbe.png)
这个时候再观察sample的示例打印可以看到设备端通过MQTT接收到升级命令并且通过HTTPS去下载固件并保存到本地
```
INF|2020-03-04 16:50:38|ota_mqtt_sample.c|process_ota(389): wait for ota upgrade command...
DBG|2020-03-04 16:50:39|ota_mqtt.c|_otamqtt_upgrage_cb(103): topic=$ota/update/S3EUVBRJLB/test_device
INF|2020-03-04 16:50:39|ota_mqtt.c|_otamqtt_upgrage_cb(104): len=454, topic_msg={"file_size":175436,"md5sum":"ad4615b866c13afb8b293a679bfa5dc4","type":"update_firmware","url":"https://ota-1255858890.cos.ap-guangzhou.myqcloud.com/100008768029_S3EUVBRJLB_1.3.0?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDdO8ldrUa0Uts4H5Gzx6FZ9nfedjpiCd7%26q-sign-time%3D1583311839%3B1583398239%26q-key-time%3D1583311839%3B1583398239%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3D1215yt303628f88f31c9a7734ead8a7fa32ed1b3%00","version":"1.3.0"}
INF|2020-03-04 16:50:39|ota_mqtt_sample.c|process_ota(389): wait for ota upgrade command...
ERR|2020-03-04 16:50:39|ota_mqtt_sample.c|_get_local_fw_info(251): open file ./FW_S3EUVBRJLBtest_device.json failed
DBG|2020-03-04 16:50:39|ota_client.c|IOT_OTA_StartDownload(347): to download FW from offset: 0, size: 175436
DBG|2020-03-04 16:50:39|ota_fetch.c|ofc_Init(83): head_content:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Range: bytes=0-175436
DBG|2020-03-04 16:50:39|HAL_TLS_mbedtls.c|_mbedtls_client_init(134): psk/pskid is empty!|psk=(null)|psd_id=(null)
DBG|2020-03-04 16:50:39|HAL_TLS_mbedtls.c|HAL_TLS_Connect(206): Setting up the SSL/TLS structure...
DBG|2020-03-04 16:50:39|HAL_TLS_mbedtls.c|HAL_TLS_Connect(248): Performing the SSL/TLS handshake...
DBG|2020-03-04 16:50:39|HAL_TLS_mbedtls.c|HAL_TLS_Connect(249): Connecting to /ota-1255858890.cos.ap-guangzhou.myqcloud.com/443...
INF|2020-03-04 16:50:40|HAL_TLS_mbedtls.c|HAL_TLS_Connect(271): connected with /ota-1255858890.cos.ap-guangzhou.myqcloud.com/443...
DBG|2020-03-04 16:50:40|utils_httpc.c|qcloud_http_client_connect(747): http client connect success
DBG|2020-03-04 16:50:40|mqtt_client_publish.c|qcloud_iot_mqtt_publish(340): publish packetID=0|topicName=$ota/report/S3EUVBRJLB/test_device|payload={"type": "report_progress", "report": {"progress": {"state":"downloading", "percent":"0", "result_code":"0", "result_msg":""}, "version": "1.3.0"}}
DBG|2020-03-04 16:50:41|mqtt_client_publish.c|qcloud_iot_mqtt_publish(340): publish packetID=0|topicName=$ota/report/S3EUVBRJLB/test_device|payload={"type": "report_progress", "report": {"progress": {"state":"downloading", "percent":"31", "result_code":"0", "result_msg":""}, "version": "1.3.0"}}
DBG|2020-03-04 16:50:42|mqtt_client_publish.c|qcloud_iot_mqtt_publish(340): publish packetID=0|topicName=$ota/report/S3EUVBRJLB/test_device|payload={"type": "report_progress", "report": {"progress": {"state":"downloading", "percent":"59", "result_code":"0", "result_msg":""}, "version": "1.3.0"}}
DBG|2020-03-04 16:50:43|mqtt_client_publish.c|qcloud_iot_mqtt_publish(340): publish packetID=0|topicName=$ota/report/S3EUVBRJLB/test_device|payload={"type": "report_progress", "report": {"progress": {"state":"downloading", "percent":"88", "result_code":"0", "result_msg":""}, "version": "1.3.0"}}
DBG|2020-03-04 16:50:43|mqtt_client_publish.c|qcloud_iot_mqtt_publish(340): publish packetID=0|topicName=$ota/report/S3EUVBRJLB/test_device|payload={"type": "report_progress", "report": {"progress": {"state":"downloading", "percent":"100", "result_code":"0", "result_msg":""}, "version": "1.3.0"}}
INF|2020-03-04 16:50:43|ota_client.c|IOT_OTA_Ioctl(638): FW MD5 check: origin=ad4615b866c13afb8b293a679bfa5dc4, now=ad4615b866c13afb8b293a679bfa5dc4
INF|2020-03-04 16:50:43|ota_mqtt_sample.c|process_ota(456): The firmware is valid
DBG|2020-03-04 16:50:43|mqtt_client_publish.c|qcloud_iot_mqtt_publish(334): publish topic seq=63335|topicName=$ota/report/S3EUVBRJLB/test_device|payload={"type": "report_progress", "report":{"progress":{"state":"done", "result_code":"0", "result_msg":""}, "version":"1.3.0"}}
INF|2020-03-04 16:50:44|ota_mqtt_sample.c|_event_handler(89): publish success, packet-id=63335
INF|2020-03-04 16:50:44|mqtt_client_connect.c|qcloud_iot_mqtt_disconnect(450): mqtt disconnect!
INF|2020-03-04 16:50:44|ota_mqtt.c|_otamqtt_event_callback(135): mqtt client has been destroyed
INF|2020-03-04 16:50:44|mqtt_client.c|IOT_MQTT_Destroy(171): mqtt release!
```
## 三. 代码使用说明
1. 固件升级支持通过HTTP或者HTTPS来下载固件可以通过编译选项FEATURE_OTA_USE_HTTPS来选择
2. SDK的固件升级支持断点续传功能即当固件下载过程因为网络或者其他原因中断了则再次下载的时候可以从上一次中断的位置继续下载。
3. 在ota_mqtt_sample.c中process_ota函数为OTA的核心流程包括了版本上报等待升级命令发起下载并保存校验文件MD5以及回复升级结果的过程同时为断点续传功能实时保存下载状态。该函数在各个平台适配的时候可以保持不变。而跟固件保存断点续传状态保存相关的功能函数则跟平台密切相关示例中使用了文件操作在支持标准文件操作的系统比如Linux/Windows上面可以直接使用对于其他平台则需要进行适配。

View File

@@ -0,0 +1,113 @@
# 设备影子
本文档介绍设备影子功能,并结合 SDK 的**shadow_sample**展示影子的数据流和功能。
## 设备影子介绍
设备影子本质上是一份在服务器端缓存的设备数据JSON 形式),主要用于保存:
- 设备的当前配置
- 设备的当前状态
作为中介,设备影子可以有效实现设备和用户应用之间的数据双向同步:
- 对于设备配置,用户应用不需要直接修改设备,只需要修改服务器端的设备影子,由设备影子同步到设备。即使当时设备不在线,设备上线后仍能从设备影子同步到最新配置。
- 对于设备状态,设备将状态上报到设备影子,用户应用查询时,只需查询设备影子即可。这样可以有效减少设备和服务器端的网络交互,尤其是低功耗设备。
关于设备影子的详细介绍,请参考[设备影子详情](https://cloud.tencent.com/document/product/634/11918)
## 编译运行示例程序(以**密钥认证设备**为例)
#### 1. 编译 SDK 及示例
修改CMakeLists.txt确保以下选项存在
```
set(BUILD_TYPE "release")
set(COMPILE_TOOLS "gcc")
set(PLATFORM "linux")
set(FEATURE_MQTT_COMM_ENABLED ON)
set(FEATURE_MQTT_DEVICE_SHADOW ON)
set(FEATURE_AUTH_MODE "KEY")
set(FEATURE_AUTH_WITH_NOTLS OFF)
set(FEATURE_DEBUG_DEV_INFO_USED OFF)
```
执行脚本编译
```
./cmake_build.sh
```
示例输出shadow_sample位于`output/release/bin`文件夹中
#### 2. 填写设备信息
将设备信息填写到配置文件device_info.json中
```
{
"auth_mode":"KEY",
"productId":"S3EUVBRJLB",
"deviceName":"test_device",
"key_deviceinfo":{
"deviceSecret":"vX6PQqazsGsMyf5SMfs6OA6y"
}
}
```
#### 3. 第一次执行shadow_sample示例程序
示例首先订阅了$shadow/operation/result/{productID}/{deviceName}主题,然后通过向$shadow/operation/{productID}/{deviceName}主题发送shadow GET命令来获取云端缓存的设备状态然后就循环更新updateCount变量并执行shadow UPDATE。
假设在updateCount=3的时候停止示例运行。
```
./output/release/bin/shadow_sample
INF|2019-09-17 12:49:59|device.c|iot_device_info_set(67): SDK_Ver: 3.1.0, Product_ID: S3EUVBRJLB, Device_Name: test_device
DBG|2019-09-17 12:49:59|HAL_TLS_mbedtls.c|HAL_TLS_Connect(204): Setting up the SSL/TLS structure...
DBG|2019-09-17 12:49:59|HAL_TLS_mbedtls.c|HAL_TLS_Connect(246): Performing the SSL/TLS handshake...
DBG|2019-09-17 12:49:59|HAL_TLS_mbedtls.c|HAL_TLS_Connect(247): Connecting to /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2019-09-17 12:49:59|HAL_TLS_mbedtls.c|HAL_TLS_Connect(269): connected with /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2019-09-17 12:50:00|mqtt_client.c|IOT_MQTT_Construct(125): mqtt connect with id: bph30 success
DBG|2019-09-17 12:50:00|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(138): topicName=$shadow/operation/result/S3EUVBRJLB/test_device|packet_id=46510
DBG|2019-09-17 12:50:00|shadow_client.c|_shadow_event_handler(63): shadow subscribe success, packet-id=46510
INF|2019-09-17 12:50:00|shadow_client.c|IOT_Shadow_Construct(172): Sync device data successfully
DBG|2019-09-17 12:50:00|shadow_client.c|IOT_Shadow_Get(383): GET Request Document: {"clientToken":"S3EUVBRJLB-0"}
DBG|2019-09-17 12:50:00|mqtt_client_publish.c|qcloud_iot_mqtt_publish(337): publish packetID=0|topicName=$shadow/operation/S3EUVBRJLB/test_device|payload={"type":"get", "clientToken":"S3EUVBRJLB-0"}
DBG|2019-09-17 12:50:00|shadow_client_manager.c|_on_operation_result_handler(278): type:get
DBG|2019-09-17 12:50:00|shadow_client.c|_update_ack_cb(114): requestAck=0
DBG|2019-09-17 12:50:00|shadow_client.c|_update_ack_cb(117): Received Json Document={"clientToken":"S3EUVBRJLB-0","payload":{"state":{"reported":{}},"timestamp":1568695800,"version":0},"result":0,"timestamp":1568695800,"type":"get"}
DBG|2019-09-17 12:50:00|shadow_client.c|IOT_Shadow_Update(317): UPDATE Request Document: {"state":{"reported":{"updateCount":0}}, "clientToken":"S3EUVBRJLB-1"}
DBG|2019-09-17 12:50:00|mqtt_client_publish.c|qcloud_iot_mqtt_publish(337): publish packetID=0|topicName=$shadow/operation/S3EUVBRJLB/test_device|payload={"type":"update", "state":{"reported":{"updateCount":0}}, "clientToken":"S3EUVBRJLB-1"}
DBG|2019-09-17 12:50:01|shadow_client_manager.c|_on_operation_result_handler(278): type:update
INF|2019-09-17 12:50:01|shadow_sample.c|OnShadowUpdateCallback(49): recv shadow update response, response ack: 0
DBG|2019-09-17 12:50:01|shadow_client.c|IOT_Shadow_Update(317): UPDATE Request Document: {"state":{"reported":{"updateCount":1}}, "clientToken":"S3EUVBRJLB-2"}
DBG|2019-09-17 12:50:01|mqtt_client_publish.c|qcloud_iot_mqtt_publish(337): publish packetID=0|topicName=$shadow/operation/S3EUVBRJLB/test_device|payload={"type":"update", "state":{"reported":{"updateCount":1}}, "clientToken":"S3EUVBRJLB-2"}
DBG|2019-09-17 12:50:02|shadow_client_manager.c|_on_operation_result_handler(278): type:update
INF|2019-09-17 12:50:02|shadow_sample.c|OnShadowUpdateCallback(49): recv shadow update response, response ack: 0
DBG|2019-09-17 12:50:02|shadow_client.c|IOT_Shadow_Update(317): UPDATE Request Document: {"state":{"reported":{"updateCount":2}}, "clientToken":"S3EUVBRJLB-3"}
DBG|2019-09-17 12:50:02|mqtt_client_publish.c|qcloud_iot_mqtt_publish(337): publish packetID=0|topicName=$shadow/operation/S3EUVBRJLB/test_device|payload={"type":"update", "state":{"reported":{"updateCount":2}}, "clientToken":"S3EUVBRJLB-3"}
DBG|2019-09-17 12:50:03|shadow_client_manager.c|_on_operation_result_handler(278): type:update
INF|2019-09-17 12:50:03|shadow_sample.c|OnShadowUpdateCallback(49): recv shadow update response, response ack: 0
DBG|2019-09-17 12:50:04|shadow_client.c|IOT_Shadow_Update(317): UPDATE Request Document: {"state":{"reported":{"updateCount":3}}, "clientToken":"S3EUVBRJLB-4"}
DBG|2019-09-17 12:50:04|mqtt_client_publish.c|qcloud_iot_mqtt_publish(337): publish packetID=0|topicName=$shadow/operation/S3EUVBRJLB/test_device|payload={"type":"update", "state":{"reported":{"updateCount":3}}, "clientToken":"S3EUVBRJLB-4"}
```
#### 4. 查看云端设备影子状态变化并修改状态
从控制台的虚拟设备可以看到该设备的updateCount已经更新为3即便设备已经离线仍然可以通过这份缓存来获取设备离线之前的最新状态。
![](https://main.qcloudimg.com/raw/ec18636eb38ee25ae21389a0004cd094.png)
这个时候如果点击修改则可以改变影子状态这个操作相当于模拟设备离线期间通过云API修改设备的目标状态比如将updateCount更改为5
![](https://main.qcloudimg.com/raw/9719fa972cbf158165ae208113e7bc19.png)
确定修改之后再次运行shadow_sample
#### 5. 第二次执行shadow_sample示例程序
这时候可以看到当执行shadow GET命令来获取云端缓存的设备状态updateCount已经变为云端最新的状态。
```
./output/release/bin/shadow_sample
INF|2019-09-17 12:59:01|device.c|iot_device_info_set(67): SDK_Ver: 3.1.0, Product_ID: S3EUVBRJLB, Device_Name: test_device
DBG|2019-09-17 12:59:01|HAL_TLS_mbedtls.c|HAL_TLS_Connect(204): Setting up the SSL/TLS structure...
DBG|2019-09-17 12:59:01|HAL_TLS_mbedtls.c|HAL_TLS_Connect(246): Performing the SSL/TLS handshake...
DBG|2019-09-17 12:59:01|HAL_TLS_mbedtls.c|HAL_TLS_Connect(247): Connecting to /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2019-09-17 12:59:01|HAL_TLS_mbedtls.c|HAL_TLS_Connect(269): connected with /S3EUVBRJLB.iotcloud.tencentdevices.com/8883...
INF|2019-09-17 12:59:01|mqtt_client.c|IOT_MQTT_Construct(125): mqtt connect with id: hY8DA success
DBG|2019-09-17 12:59:01|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(138): topicName=$shadow/operation/result/S3EUVBRJLB/test_device|packet_id=63420
DBG|2019-09-17 12:59:01|shadow_client.c|_shadow_event_handler(63): shadow subscribe success, packet-id=63420
INF|2019-09-17 12:59:01|shadow_client.c|IOT_Shadow_Construct(172): Sync device data successfully
DBG|2019-09-17 12:59:01|shadow_client.c|IOT_Shadow_Get(383): GET Request Document: {"clientToken":"S3EUVBRJLB-0"}
DBG|2019-09-17 12:59:01|mqtt_client_publish.c|qcloud_iot_mqtt_publish(337): publish packetID=0|topicName=$shadow/operation/S3EUVBRJLB/test_device|payload={"type":"get", "clientToken":"S3EUVBRJLB-0"}
DBG|2019-09-17 12:59:01|shadow_client_manager.c|_on_operation_result_handler(278): type:get
DBG|2019-09-17 12:59:01|shadow_client.c|_update_ack_cb(114): requestAck=0
DBG|2019-09-17 12:59:01|shadow_client.c|_update_ack_cb(117): Received Json Document={"clientToken":"S3EUVBRJLB-0","payload":{"state":{"reported":{"updateCount":5}},"timestamp":1568696289949,"version":5},"result":0,"timestamp":1568696341,"type":"get"}
```