项目地址: https://github.com/tencentyun/qcloud-iot-esp-wifi/tree/master/qcloud-iot-esp8266-demo
文档地址: https://cloud.tencent.com/document/product/1081/48370
8266项目的SDK又是基于腾讯的C SDK抽取的, C SDK地址: https://github.com/tencentyun/qcloud-iot-explorer-sdk-embedded-c

要修改的和供调用的

8266项目目录下components/qcloud_iot/qcloud_iot_c_sdk/includes中的几个文件是要修改的参数和调用的api放置的地方.
还有三元组信息在 components/qcloud_iot/qcloud_iot_c_sdk/platform下的HAL_Device_freertos.c文件中. 居然不是在头文件里定义, 感觉挺糟糕的.

要调用的API: qcloud_iot_export.h

这个qcloud_iot_export.h文件实际上include了所有在exports目录里面的.h文件. 所有的接口API在其中描述.

参数修改 qcloud_iot_export_variables.h

MQTT的心跳时间240s建议改为200s. 默认240s与服务器端太一致了, 设备时钟慢一点就会被服务器踢出.

/* default MQTT keep alive interval (unit: ms) */
#define QCLOUD_IOT_MQTT_KEEP_ALIVE_INTERNAL (200 * 1000)  // 原设置: 240*1000

参数修改 HAL_Device_freertos.c


#ifdef DEBUG_DEV_INFO_USED
/* product Id  */
static char sg_product_id[MAX_SIZE_OF_PRODUCT_ID + 1] = "PRODUCT_ID"; // 修改

/* device name */
static char sg_device_name[MAX_SIZE_OF_DEVICE_NAME + 1] = "YOUR_DEV_NAME"; // 根据mac生成的话, 需要在代码中动态修改 . 似乎应该在HAL_SetDevInfo()调用前或者干脆就在这个函数里修改

/* device secret of PSK device */
static char sg_device_secret[MAX_SIZE_OF_DEVICE_SECRET + 1] = "YOUR_IOT_PSK";

/* region */
static char sg_region[MAX_SIZE_OF_PRODUCT_REGION + 1] = "ap-guangzhou";

#ifdef GATEWAY_ENABLED
/* sub-device product id  */
static char sg_sub_device_product_id[MAX_SIZE_OF_PRODUCT_ID + 1] = "PRODUCT_ID";
/* sub-device device name */
static char sg_sub_device_name[MAX_SIZE_OF_DEVICE_NAME + 1] = "YOUR_SUB_DEV_NAME";
#endif

#ifdef DEV_DYN_REG_ENABLED
/* product secret for device dynamic Registration  */
static char sg_product_secret[MAX_SIZE_OF_PRODUCT_SECRET + 1] = "YOUR_PRODUCT_SECRET";  // 动态验证需要改这儿
#endif

编译文件修改component.mk

如果在main目录下自定义了新的文件夹用于放源码, 需要将这个文件夹加入编译路径 ,在component.mk中, 如增加一行:

COMPONENT_SRCDIRS += ./lamploop

主流程

samples目录下有4个demo程序, 实际上是根据sdkconfig里面的配置选择不同的demo进行编译. 以data_template_light的主流程示例如下:

main.c中的app_main()创建qcloud_demo_task任务
-->演示获取WIFI信息
-->联网
-->设置时间服务器
-->调用主逻辑qcloud_iot_explorer_demo
-->qcloud_iot_explorer_demo在samples/data_template_light/light_data_template_sample.c中定义
-->初始化连接信息_setup_connect_init_params
-->构建物模型也就是所谓的数据模板IOT_Template_Construct
-->初始化数据模板_init_data_template
-->注册模板属性_register_data_template_property
-->注册模板动作_register_data_template_action
-->获取系统信息_get_sys_info, 并上报IOT_Template_Report_SysInfo_Sync
-->获取数据状态IOT_Template_GetStatus_sync
-->处理下行数据逻辑deal_down_stream_user_logic
-->使能ota任务enable_ota_task
-->初始化报告时钟
-->倒计时10秒
-->进入task的死循环
  -->断开连接(!IOT_Template_IsConnected)超过20秒直接跳出死循环
  -->判断固件在下载is_fw_downloading, 睡0.5秒后,进入下次循环
  -->收到控制消息sg_control_msg_arrived
    -->进入控制信令处理deal_down_stream_user_logic
    -->回复服务器IOT_Template_ControlReply
  -->构造变化属性的报告deal_up_stream_user_logic(pReportDataList, &ReportCount)
    -->如果属性有变化, 则构造报告数组IOT_Template_JSON_ConstructReportArray
    -->上传报告数组IOT_Template_Report
  -->如果开启了事件处理, 则进行事件处理.
  -->睡到1秒
-->如果各种原因跳出了循环(看到的原因只有断开连接)
-->关闭ota任务
-->销毁模板

根据乐鑫v3.1模板加入qcloud_iot模块的方式

下面基于乐鑫的v3.1example/project_template项目基础上, 增加qcloud_iot功能
为解说方便, 将qcloud-iot-esp8266-demo项目称之为qcloud项目, 将将project_template项目称之为template项目

复制

  1. 要将qcloud项目components\qcloud_iot\qcloud_iot_c_sdk目录复制到template项目的components\qcloud_iot_c_sdk,去掉一级目录qcloud_iot.
  2. components\component.mk复制过来
  3. sdkconfig复制过来, 或者进入make menuconfig手动修改. 主要要改component config-->SSL-->mbedTLS下的内容:
  • (2560) TLS maximum OUTPUT message content length
  • (2560) TLS maximum INPUT message content length
  • TLS Protocol Role (Client)--->
    在`TLS Key Exchange Methods`下修改:
  • [*] Enable pre-shared-key ciphersuites
  • [*] Enable PSK based ciphersuite modes
  • [ ] Enable DHE-PSK based ciphersuite modes
  • [ ] Enable ECDHE-PSK based ciphersuite modes
  • [*] Enable RSA-PSK based ciphersuite modes
  • [*] Enable RSA-only based ciphersuite modes
  • [ ] Enable DHE-RSA based ciphersuite modes

深入文档

要深入了解文档,还是要看C-SDK项目的示例而不是8266-C-SDK的项目示例
qcloud-iot-explorer-sdk-embedded-c
视频教程

OTA分片下载例程更新

https://git.code.tencent.com/hubertxxu/qcloud_iot_explorer_esp8266

标签: none 阅读量: 1249

添加新评论