TencentOS tiny使用mqtt连接腾讯云iothub Demo使用

文章目录

    • 创建云
    • 修改源码
    • 创建项目
      • Makefile
        • 宏定义
        • 追根溯源
      • 数据上云
    • 总结

在前面的文章中,我们已经可以使用mqtt进行通信了,这次我们使用官方提供的Demo,通过mqtt连接腾讯云的iothub进行通信。

创建云

首先需要拥有腾讯云的账户,并且开通腾讯云iothub,链接在这里:腾讯云登陆地址

拥有了云,我们需要创建我们自己的产品和设备,具体步骤请参考以下截图:

TencentOS tiny使用mqtt连接腾讯云iothub Demo使用_第1张图片

TencentOS tiny使用mqtt连接腾讯云iothub Demo使用_第2张图片

TencentOS tiny使用mqtt连接腾讯云iothub Demo使用_第3张图片

TencentOS tiny使用mqtt连接腾讯云iothub Demo使用_第4张图片

TencentOS tiny使用mqtt连接腾讯云iothub Demo使用_第5张图片

TencentOS tiny使用mqtt连接腾讯云iothub Demo使用_第6张图片

TencentOS tiny使用mqtt连接腾讯云iothub Demo使用_第7张图片

修改源码

然后,我们打开源码,看到在examples/tencent_cloud_sdk_mqtt目录下,就是本次的样例程序。这里,我们将tencent_cloud_sdk_mqtt.c中连接的WIFI修改为自己的,将mqtt_sample.c中的qcloud_device_create()参数,分别用自己的productID设备名称设备密钥进行代替。

这样,源码就修改好了。

创建项目

我是在MacOS+GCC环境下进行使用的,所以,首先创建Makefile。

Makefile

制作这个可以参考之前的文章,细节我就不详细说了,就说一下我遇到的问题:

宏定义

按照经验我配置好Makefile进行编译,却发现编译失败了。提示我:

TencentOS tiny使用mqtt连接腾讯云iothub Demo使用_第8张图片

然后,我就开始分析为何会报错?大的方面来讲,源码上传到github上,肯定是经过了测试,不可能直接编译就出错,所以问题肯定出在自己身上。于是我又把目光放到了Makefile上。重新对比了keil的项目文件,我发现了这么一句:

USE_HAL_DRIVER,STM32L431xx,MBEDTLS_CONFIG_FILE=<qcloud/tls_psk_config.h>

这里有个宏定义,将MBEDTLS_CONFIG_FILE分配了参数,但在我的Makefile里我却遗漏了。于是快快补上。继续make,但,又出错了:
TencentOS tiny使用mqtt连接腾讯云iothub Demo使用_第9张图片

找不到文件?

我又仔细查看了我的头文件包含,确实包含了对应路径啊?经过漫长时间的自我怀疑和不断尝试,突然意识到,这是Makefile!需要处理一下!直接使用是会产生歧义的!

于是,经过测试,以下四种宏定义的赋值方式均可以正常使用:

-DMBEDTLS_CONFIG_FILE=''
-DMBEDTLS_CONFIG_FILE=""
-DMBEDTLS_CONFIG_FILE=\"qcloud/tls_psk_config.h\"
-DMBEDTLS_CONFIG_FILE='"qcloud/tls_psk_config.h"'

追根溯源

其实也是在不断的学习中,我查阅到,因为mcu不具备一些能力,比如随机数/dev/urandom,所以移植mbedtls肯定需要进行适配。而适配好的配置文件在

components/security/mbedtls/wrapper/include/qcloud/tls_psk_config.h

而默认的配置,则是在

components/security/mbedtls/3rdparty/include/mbedtls/config.h

这个在文件
TencentOS tiny使用mqtt连接腾讯云iothub Demo使用_第10张图片
components/security/mbedtls/3rdparty/src/entropy_poll.c中可以看到。

对比两个配置文件,发现大部分是针对板子做的适配。查找官网的说明:Porting mbed TLS to a new environment or OS

发现这样一段话:

In short, in order to compile Mbed TLS for a bare-metal environment which already has a standard C library, configure your build by disabling MBEDTLS_NET_C, MBEDTLS_TIMING_C and MBEDTLS_ENTROPY_PLATFORM, and potentially MBEDTLS_FS_IO, MBEDTLS_HAVE_TIME_DATE and MBEDTLS_HAVE_TIME.

This is more thoroughly documented in config.h.

其实就可以理解,将上面的几个宏定义进行注释,也可以适配,只是不够严谨吧。

数据上云

我们将编译好的固件刷写到设备上

st-flash write build/TencentOS_tiny.bin 0x8000000

打开串口,就看到日志在刷新,并且数据已经上传成功了

—>SEND OK
WRN|1576800041|…/…/…/…//examples/tencent_cloud_sdk_mqtt/mqtt_sample.c|event_handler(83): publish success, packet-id=49195
WRN|1576800041|…/…/…/…//examples/tencent_cloud_sdk_mqtt/mqtt_sample.c|on_message_callback(114): Receive Message With topicName:FP3DG51JF2/dev_board/data, payload:{“action”: “publish_test”, “count”: “2”}
ERR|1576800044|…/…/…/…//components/connectivity/TencentCloud_SDK/source/src/mqtt/qcloud_mqtt_publish.c|qcloud_mqtt_publish(42): publish topic seq=49196|name=FP3DG51JF2/dev_board/data|payload={“action”: “publish_test”, “count”: “3”}
AT CMD:
AT+CIPSEND=0,121

—>OK

—>>
—>

—>Recv 121 bytes

至此,MacOS+GCC编译的tencent_cloud_sdk_mqttDemo已经成功运行。

总结

在实际的使用中,不能眼高手低,不亲手试验一下,永远不知道路上会出现多少坑。所以,实践出真知绝对是很有道理的。

同时,当前还只是实现了节点数据的上传,并没有实现数据的下发,也没有实现一个完整的业务流程,今后仍有很大的学习空间。

你可能感兴趣的:(TencentOS-tiny)