概述
本文代码链接 https://github.com/FranHawk/ConnectTOAliIOTServer.git
之前一直准备使用百度云天工作为物联网云平台,但是百度云天工平台的文档写的确实不是很好,相关API的接口也和其他方案有不一样,安全性不够好,故准备使用阿里云IOT平台。后期估计还要涉及到前后端的实现,自己搭建云服务器,才能完成数据存储和小程序开发。阿里云也提供了相关的接口,使用起来比较方便。
这几天查阅了很多的MQTT相关的资料,结果发现查到了太多底层的东西。根本没有太大的作用,浪费了很多时间。在掌握基本的MQTT的概念后,我发现只用掌握连接服务器,订阅话题,发布话题这些操作就足以满足最基本的需要。
在物联网设计(三)中,完成了连接本地服务器的功能,通过MQTT连接云服务器的步骤有所改变。
1.在使用TCP连接服务器的阶段,我们需要把连接的域名和端口改成云服务器的端口。
2.连接成功后进入透传模式
3.使用paho mqtt提供的函数连接服务器
接下来就要讲述如何一步步的完成这些操作
硬件准备
stm32+esp8266硬件设备一套
软件准备
已经注册好阿里云帐号并创建好设备,创建过程和前面百度云的创建过程类似,这里还是给出文档链接
当创建好设备后,会生成一个设备三元组,后面我们连接IOT平台使用一机一密的方式,这个设备三元组后面会经常用,记得妥善保存
移植paho mqtt库至STM32工程中
1.从github上下载paho mqtt嵌入式版本开源库,代码链接。
2.解压并打开
找到paho.mqtt.embedded-c-master\MQTTPacket\src
的所有文件和paho.mqtt.embedded-c-master\MQTTPacket\samples
里面的transport.c和transport.h两个文件
3.在自己的工程中新建一个文件夹存放这些文件,我用的工程是物联网(三)中创建的工程
4.在工程中添加这些文件
5.找到transport.c ,对其进行更改,首先改掉上面用的include函数,改为自己的,下面的是我根据自己的软件环境更改的头文件如下
1 |
除了上面的头文件之外。这个文件自己带的include和define都被我删了
6.重点:更改transport_sendPacketBuffer
和transport_getdatanb
函数,这两个函数就是MQTT操作单片机发送和接受数据的主要函数,在这里我们用USART来改变里面的发送数据的函数,使用中断方式发送,中断方式接收
通过这样的方式,使硬件和上层MQTT应用层代码解耦合,如果之后使用不同的硬件,其他代码不需要更改,只需要更改transport中的代码。来适应当时使用的通讯模块就可以了。
1 | int transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen) |
7.剩下的三个函数让他们直接变为空
1 | int transport_getdatanb(void *sck, unsigned char* buf, int count) |
8.在main函数中加入头文件,以检验移植是否成功
1 |
9.编译工程,没有错误,移植成功
连接阿里云服务器
1.根据单步调试的原则,先测试用TCP连接阿里云IOT服务器是否成功
根据以上的域名,更改在AT指令连接TCP服务器处的域名和端口号
1 |
1 | uint8_t esp8266_Connect_Server() |
下面是esp8266初始化函数的代码片段,完整代码请看物联网项目设计(三)
1 | u1_printf("设置为关闭多路连接\r\n"); |
通过串口助手发现成功连接
2.参考开源代码和文档,寻找连接方法。
这里先使用ping的方法而不是直接的订阅或发布一个MQTT话题还是考虑到步子不要跨的太大,先测试是否能连接上。
paho mqtt的github代码包中有比较简单的测试代码,我们可以借鉴
研究了下他的步骤,先是创建一个结构体,然后对结构体中的参数进行赋值,最后使用MQTTSerialize_connect
连接,使用MQTTPacket_read(buf, buflen, transport_getdata) == CONNACK
检测是否连接成功,然后定时,不停地ping,但是这些初始化参数如何设定呢,准备连接好后仔细研究下阿里云的文档,少走弯路。文档链接
以下是阿里云文档中对链接信息的描述
以下是Paho开源代码中的示例
1 | MQTTPacket_connectData data = MQTTPacket_connectData_initializer; |
3.尝试编写MQTT协议连接阿里云IOT服务器并ping通。
1.为了保证高度松耦合,连接MQTT服务器部分的代码我重新建立一个文件夹,并建立两个文件如下
因为最开始连的是百度服务器,所以名字起成上面的样子了。。。
2.头文件中按照之前的设备三元组构建宏定义
1 |
3.按照开源例程的写法,并参照阿里云的文档,就能知道如何连接云服务器,编写相关代码,每三秒ping一次阿里云的服务器。
1 |
|
4.最后在main中编写测试代码,并通过串口观察现象,每三秒ping一次
1 | u1_printf("开始配置"); |
连接成功并ping通,同时在阿里云端发现设备在线,试验成功