前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP32接入腾讯云物联网开发平台

ESP32接入腾讯云物联网开发平台

原创
作者头像
twowinter
发布2020-06-24 18:59:05
6.6K0
发布2020-06-24 18:59:05
举报
文章被收录于专栏:腾讯云IoT腾讯云IoT

@TOC

前言

这篇笔记记录采用 ESP32 接入腾讯云物联网开发平台的流程,同时给出了我的移植示例,方便其他想接入腾讯云物联网的朋友。

毕竟腾讯云IoT现在是免费的,而且还有腾讯连连小程序加持,真香是肯定的。

先说下哈,问过腾讯云的朋友,ESP32接入腾讯云物联网开发平台的例程正在处理,预计后面会发布到 github 上。所以我这篇笔记只是小能手的试水,因为最近正在玩 ESP_Moonlight 开发板,想要做个小玩具玩玩,因此着急着先摸索出来了。后续当然建议是以腾讯云官方文档为主。

如果你还没看到官方文档,又急着玩,不妨看看我这篇笔记,也能加深下对ESP32开发的了解。

小能手在时隔4年后,再次玩起了乐鑫芯片,这次是带语音识别功能的ESP32。目前基于 ESP-Moonlight 开发板记录一系列笔记,详情请点击

1 资料参考

目力所及的资料有两个,一个是腾讯云的,一个是乐鑫的,两家在19年有过合作。

首先是腾讯云的资料,Wi-Fi 智能灯接入指引,虽然demo是使用AT命令的模组,不过追进去,还是发现了非模组的版本:

https://github.com/tencentyun/qcloud-iot-esp-wifi/tree/master/qcloud-iot-esp8266-demo

名称

说明

qcloud-iot-at-esp8266

腾讯云IoT AT指令ESP8266定制固件、说明及使用

qcloud-iot-esp8266-demo

腾讯云IoT C-SDK 在ESP8266 RTOS SDK上的移植及demo和配网代码

乐鑫也根据腾讯云的CSDK,写了一个对接的工程,不过目前有点旧了,移植的CSDK也是老的版本:https://github.com/espressif/esp-qcloud,另外看了代码只支持 cert 方式,比较有局限性。

2 对接总体思路

所以我的对接思路是以腾讯云的 ESP SDK 为主,应该更容易对接到腾讯云。

对接的主要困难是在编译系统这块,腾讯云的 qcloud-iot-esp8266-demo 仍采用 GNU Make,而我手头的 ESP-Moonlight 都是基于 ESP-IDF V4.0 了,编译系统采用的是 CMake。这块一些文件需要自己处理下。

目前总体代码也已上传:https://github.com/twowinter/esp-moonlight/

3 代码移植

3.1 component qcloud_iot

复制 component 目录

将 腾讯云SDK中的 component 复制至 本项目的 component 目录,具体见 esp-moonlight/components/qcloud_iot

CMakeLists.txt

参考了乐鑫的文档,这里头有CMake的参考,https://github.com/espressif/esp-qcloud/blob/master/CMakeLists.txt

代码语言:txt
复制
set(COMPONENT_ADD_INCLUDEDIRS 
    "qcloud_iot_c_sdk/include"
    "qcloud_iot_c_sdk/include/exports"
	"qcloud_iot_c_sdk/sdk_src/internal_inc"
    )

# Edit following two lines to set component requirements (see docs)
set(COMPONENT_REQUIRES "mbedtls")
set(COMPONENT_PRIV_REQUIRES )

set(COMPONENT_SRCS
    "qcloud_iot_c_sdk/sdk_src"
    "qcloud_iot_c_sdk/platform"
    )

register_component()

3.2 项目顶层处理

项目顶层目录位于 esp-moonlight/examples/qcloud_sr,主要是修改 CMake 文件和配置文件。

CMakeLists.txt

里面记得增加新加的 component qcloud_iot。

代码语言:txt
复制
set(EXTRA_COMPONENT_DIRS 
    ${CMAKE_CURRENT_SOURCE_DIR}/../../components/moonlight_board
    ${CMAKE_CURRENT_SOURCE_DIR}/../../components/led_rgb
    ${CMAKE_CURRENT_SOURCE_DIR}/../../components/speech_recognition
    ${CMAKE_CURRENT_SOURCE_DIR}/../../components/button
    ${CMAKE_CURRENT_SOURCE_DIR}/../../components/qcloud_iot
    )

复制 项目 配置

代码语言:txt
复制
#
# QCloud IoT demo Configuration
#
CONFIG_QCLOUD_IOT_EXPLORER_ENABLED=y
CONFIG_SMART_LIGHT_ENABLED=y
CONFIG_GATEWAY_ENABLED=
CONFIG_OTA_ENABLED=
CONFIG_RAW_DATA_ENABLED=
CONFIG_MQTT_ENABLED=
CONFIG_DEMO_EXAMPLE_SELECT=0
CONFIG_WIFI_CONFIG_ENABLED=y
CONFIG_DEMO_WIFI_SSID="Your_WiFi"
CONFIG_DEMO_WIFI_PASSWORD="12345678"

3.3 component main

component main 组件的调整也是两个文件,CMake 文件和配置文件。

CMakeLists.txt

代码语言:txt
复制
idf_component_register(SRC_DIRS "./" "samples/data_template_light"
                       INCLUDE_DIRS "./" "include"
                       )

配置菜单修改

qcloud-iot-esp-wifi/qcloud-iot-esp8266-demo/main/Kconfig.projbuild

里头涉及对 腾讯云DEMO 的参数配置菜单,需要移植过来。

4 移植问题备忘

移植过程中有两个典型问题,我这边做个记录。

CMakeLists.txt 的定义语法

对编译系统不熟,导致两次掉入这个坑里。

在指定原文件的时候,之前我采用 SRCS,应该是看某些文件里既可以指定文件,也可以指定目录,给我造成了误导。反正最新的CMake编译系统,原文件仅使用 SRCS,而如果是目录的话,就得使用 SRC_DIRS。

代码语言:txt
复制
In the legacy Make-based build system, it is required to also set COMPONENT_SRCDIRS if COMPONENT_SRCS is set. In CMake, the equivalent is not necessary i.e. specifying SRC_DIRS to idf_component_register if SRCS is also specified (in fact, SRCS is ignored if SRC_DIRS is specified).

而且这里要注意,如果使用 SRC_DIRS 那么 SRCS 就会被忽略。

component qcloud_iot 处理:

代码语言:txt
复制
set(src_dirs 
    "qcloud_iot_c_sdk/sdk_src"
    "qcloud_iot_c_sdk/platform"
    )

set(include_dirs 
    "qcloud_iot_c_sdk/include"
    "qcloud_iot_c_sdk/include/exports"
	"qcloud_iot_c_sdk/sdk_src/internal_inc"
    )

idf_component_register(SRC_DIRS "${src_dirs}"
                       INCLUDE_DIRS "${include_dirs}"
                       REQUIRES mbedtls
                       )

component main 处理:

代码语言:txt
复制
idf_component_register(SRC_DIRS "./" "samples/data_template_light"
                       INCLUDE_DIRS "./" "include"
                       )

mbedtls_ssl_conf_psk 编译错误

代码语言:txt
复制
/Users/tt/esp/esp-moonlight/components/qcloud_iot/qcloud_iot_c_sdk/platform/HAL_TLS_mbedtls.c: In function '_mbedtls_client_init':
/Users/tt/esp/esp-moonlight/components/qcloud_iot/qcloud_iot_c_sdk/platform/HAL_TLS_mbedtls.c:153:15: error: implicit declaration of function 'mbedtls_ssl_conf_psk'; did you mean 'mbedtls_ssl_conf_sni'? [-Werror=implicit-function-declaration]
         ret = mbedtls_ssl_conf_psk(&(pDataParams->ssl_conf), (unsigned char *)pConnectParams->psk, pConnectParams->psk_length,
               ^~~~~~~~~~~~~~~~~~~~
               mbedtls_ssl_conf_sni
cc1: some warnings being treated as errors

通过代码发现是相关的配置项需要启用。

代码语言:txt
复制
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
                const unsigned char *psk, size_t psk_len,
                const unsigned char *psk_identity, size_t psk_identity_len )
代码语言:txt
复制
/* Key exchanges using a PSK */
#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)           || \
    defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)       || \
    defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)       || \
    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
#define MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED
#endif

这是最终在项目配置中需要使能的参数。

CONFIG_MBEDTLS_PSK_MODES=y

5 腾讯云物联网开发平台操作

一旦SDK搞定,剩下的事情就好解决了。

5.1 腾讯云物联网开发平台创建WiFi产品

具体见 Wi-Fi 智能灯接入指引

5.2 代码中修改设备三元组信息

到 components/qcloud_iot/qcloud_iot_c_sdk/platform/HAL_Device_freertos.c 里面修改在腾讯云物联网平台注册的设备信息(目前仅支持密钥设备):

代码语言:txt
复制
/* 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";
/* Device Secret */
static char sg_device_secret[MAX_SIZE_OF_DEVICE_SECRET + 1] = "YOUR_IOT_PSK";

5.3 配置添加 WiFi SSID 和 密码

图省事,先不折腾配网了,直接 idf.py menuconfig 来配置。

5.4 ESP32 编译、烧写、monitor

常规操作,忽略不表。

6 最终结果

最终可以在腾讯云 IoT Explorer 上看到设备的属性更新。

看代码描述,这个示例应该是每10秒上传一次亮度。

代码语言:txt
复制
/*example for cycle report, you can delete this for your needs*/
static void cycle_report(Timer *reportTimer)
{
    int i;

    if (expired(reportTimer)) {
        for (i = 0; i < TOTAL_PROPERTY_COUNT; i++) {
            DeviceProperty *pReportData = &(sg_DataTemplate[i].data_property);
            /* simulate brightness changes */
            if (0 == strcmp(pReportData->key, "brightness")) {
                int *brightness = (int *)pReportData->data;
                *brightness += 5;
                if (*brightness > 100)
                    *brightness = 0;

                set_propery_state(pReportData->data, eCHANGED);
            } else {
                set_propery_state(&(sg_DataTemplate[i].data_property.data), eCHANGED);
            }

            countdown_ms(reportTimer, 10000);
        }
    }
}

END

That's all


IoT小能手的其他精彩文章:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1 资料参考
  • 2 对接总体思路
  • 3 代码移植
    • 3.1 component qcloud_iot
      • 3.2 项目顶层处理
        • 3.3 component main
        • 4 移植问题备忘
          • CMakeLists.txt 的定义语法
            • mbedtls_ssl_conf_psk 编译错误
            • 5 腾讯云物联网开发平台操作
              • 5.1 腾讯云物联网开发平台创建WiFi产品
                • 5.2 代码中修改设备三元组信息
                  • 5.3 配置添加 WiFi SSID 和 密码
                    • 5.4 ESP32 编译、烧写、monitor
                    • 6 最终结果
                    • END
                    相关产品与服务
                    物联网开发平台
                    腾讯云物联网开发平台(IoT Explorer)是面向智慧生活与产业物联应用的一站式物联网PaaS平台,为各行业用户提供一站式设备智能化服务。平台提供海量设备连接与消息通信能力,基于腾讯连连小程序应用开发能力、音视频能力及AI增值服务,聚合腾讯生态内容能力。提升传统行业设备智能化的效率,降低用户的开发运维成本。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档