EVB_AIOT套件使用最新sdk对接腾讯云物联网平台成功
经过年前年后一个多月的奋战,MX1062芯片开发板终于使用qcloud对接腾讯云平台成功了,再次记录一下对接的过程以及其中的心路历程.
首先解释一下为什么要搞这个
在群里提问的时候有人不理解,命名官方有mqtt的例子不用,非要折腾这个东西,主要有以下几点:
1.官当的demo用的是原生的mqtt组件,而qcloud_sdk是完全屏蔽了mqtt的操作,留下一些简洁的接口,实现这些接口就可以做到对接物联网平台的
2.为了增加可移植性,用官方的sdk至少当官方的平台有变化的时候能够同步跟上
3.不得不承认qcloud_sdk真的非常优秀,用原生的mqtt的话需要自己制作登录密码等数据,而用了qcloud_sdk只需要把产品id,设备id和设备密码配置好就行,简直不要太方便
4.新版qcloud_sdk的at框架已经大改,这其中必然有其道理,而官方demo里面还是用老的at框架,想学习先进的技术肯定要用最新的啦
5.原生的demo里面对于report,event那些需要自己做封包,而新版qcloud_sdk已经全都帮你做完了,真正做到关注业务就行
等等
基于以上几点理由,在使用的官方demo之后,便萌生了使用qcloud_sdk的方式来对接腾讯云平台,看看如何操作吧
操作步骤说明及心路历程
1.首先是下载官方的sdk,官方的sdk下载链接在这篇文档有介绍:
https://cloud.tencent.com/document/product/1081/48356
这里给出了下载地址,点进去就有了,截止发稿日期,是3.2.0版本,还是很好用的
2.sdk的使用方式:
把下载的sdk解压完毕,放到工程目录里去,比如我是放在了这里:
放在这里的好处是以后建立的新工程也可以使用
然后就需要在工程里面添加对应的文件,我用的是keil,官方的nxpIDE一看是基于Eclipse做的,就不想用了
添加完如下形式:
基本上就只需要使用这些文件了
然后在编译里面把头文件路径都添进去:
这里完成了就可以尝试编译一次了.
有同学可能会问了,这些文件是啥?
问得好,下面就解释这几个文件的来由.
3.首先我们要阅读官方文档
文档地址在这:
https://cloud.tencent.com/document/product/1081/48373
这篇文档说了一些基本信息,是整个sdk比较全面的文档.不得不提一句,腾讯的文档做的真的很好,对标阿里和华为云的话,就好太多了,很详细:
这里就描述了我们需要实现的一些接口:
https://cloud.tencent.com/document/product/1081/48389
这里截图做一点点说明:
在我的代码里就体现在上面的截图里
4.AT串口的实现
这里着重说一下关于HAL_AT_UART相关的接口在本开发板上的实现:
需要添加这个宏开关和头文件
下面这两个函数是管串口发送和接收的:
下面这两个函数是管串口的初始化和反初始化的:
眼尖的同学可能会看到,为什么HAL_AT_Uart_Recv
函数里面啥也没有,直接返回0了?
其实这一点我一开始也很疑惑.
现在请随着我的思路一步步捋一下为什么这里什么代码都没有并且直接返回0
要闹明白这个,首先我们要追查一下老的at框架是怎么实现的,线索就在HAL_AT_Uart_Send
里面,这里调用了
tos_hal_uart_write
函数,那进去看一下老的at串口是怎么调用这个接口的:
果然不出所料,就是老的at的发送里,那看看老的at接收:
在老的at框架里,at的接受并不是用的物理的串口接收函数而是从一个fifo里面取值
那就看看fifo的值是什么时候放进去的吧,一番查找,发现在这:
看看这个函数哪里调吧:
就是这里没错,找到这个就好办了,咱们在新的at框架也实现一个吧
先创建一个fifo,制作输入输出缓冲区,嗯嗯,xxx怎么这么多东西要做,不可能吧,官方的sdk还要我们自己做这么多工作吗,不可能吧,这样因为愿意对接啊,竟一时陷入了僵局
唉搞简单点吧,要不然这一个月的事写到明天也写不完,最后我找到官方的代码里面有这一句:
原来不是用的fifo,用的ringbuffer,这就好办了,把ringbuffer开关打开就行:
打开之后,串口接收就走这了:
然而事情没完,我们还需要把串口中断那里原来发给老at的fifo地方改到现在这个代码来:
到这里,底层的串口算是搞定了.
后面就到了测试at底层了,这里比较了老的代码和新的对接qcloud_sdk的地方,总结出配置文件应该这样:
因为时间过去太久了,细节不太记得了
总之这样就能编译成功了,喔对了,还要实现一个线程创建的接口:
这样就行了.
5.官方demo的移植
官方demo的移植就比较简单了,官方文档也有讲,这里只需要把data_template文件加进来:
我们启用这个文件,把上面那个失能,就走我们的新的sdk了,爽多了
6.排坑记
其实也不算多坑,但是报销了我好几个晚上,主要的问题就是设备能登上云平台,然后立马就被踢掉线,用新老框架不停得换,不停的打log,最后终于发现是我的esp8266返回数据太慢了,接收的地方定时器超时了,改了一个qclou的宏问题搞定
原值是5*1000,但是经过我不停的打log,抓现象发现5s刚好数据回来,所以造成超时,改成12s就行了
总结
坚持的力量总是强大的,这过程中有无数次想放弃的时候,最后还是被自己内心的小人说服了,花费了无数的夜晚和周末,终于搞定了这个不叫功能的功能,也算是有所收获吧,在调试的过程中发现qcloud_sdk还是一套很优秀的代码,看得出来鹅厂的确有人才,看来我辈还得加倍努力啊.