首先需要拥有腾讯云的账户,并且开通腾讯云iothub,链接在这里:腾讯云登陆地址
拥有了云,我们需要创建我们自己的产品和设备,具体步骤请参考以下截图:
然后,我们打开源码,看到在examples/tencent_cloud_sdk_mqtt
目录下,就是本次的样例程序。这里,我们将tencent_cloud_sdk_mqtt.c
中连接的WIFI修改为自己的,将mqtt_sample.c
中的qcloud_device_create()
参数,分别用自己的productID、设备名称、设备密钥进行代替。
这样,源码就修改好了。
我是在MacOS+GCC环境下进行使用的,所以,首先创建Makefile。
制作这个可以参考之前的文章,细节我就不详细说了,就说一下我遇到的问题:
按照经验我配置好Makefile进行编译,却发现编译失败了。提示我:
然后,我就开始分析为何会报错?大的方面来讲,源码上传到github上,肯定是经过了测试,不可能直接编译就出错,所以问题肯定出在自己身上。于是我又把目光放到了Makefile上。重新对比了keil的项目文件,我发现了这么一句:
这里有个宏定义,将MBEDTLS_CONFIG_FILE
分配了参数,但在我的Makefile里我却遗漏了。于是快快补上。继续make,但,又出错了:
找不到文件?
我又仔细查看了我的头文件包含,确实包含了对应路径啊?经过漫长时间的自我怀疑和不断尝试,突然意识到,这是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
这个在文件
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
andMBEDTLS_ENTROPY_PLATFORM
, and potentiallyMBEDTLS_FS_IO
,MBEDTLS_HAVE_TIME_DATE
andMBEDTLS_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_mqtt
Demo已经成功运行。
在实际的使用中,不能眼高手低,不亲手试验一下,永远不知道路上会出现多少坑。所以,实践出真知绝对是很有道理的。
同时,当前还只是实现了节点数据的上传,并没有实现数据的下发,也没有实现一个完整的业务流程,今后仍有很大的学习空间。