相关文章
1.《MQTT协议分析总结(一)》
2.《MQTT协议分析总结(二)》
3.《【IoT】如何连接到百度IoT云》
4.《【FreeRTOS】基于STM32移植LWIP 2.1.2之MQTT》
1.前言
MQTT协议工作在TCP之上,端和代理之间通过交换预先定义的控制报文来完成通信。因为 MQTT 是应用层协议,所以它需要运行在LwIP协议上,我们就使用 Socket API来进行移植。
物接入(IoT Hub)是面向物联网领域开发者的全托管云服务,通过主流的物联网协议MQTT通讯,可以在智能设备与云端之间建立安全的双向连接,快速实现物联网项目。
2.下载MQTT源码
MQTT源码下载地址:https://github.com/eclipse/paho.mqtt.embedded-c

这个存储库包含用于嵌入式平台的Eclipse Paho MQTT C/ c++客户端库的源代码。有三个子项目:
- MQTTPacket:对MQTT数据包进行简单的反/序列化
- MQTTClient:高级C++客户端
- MQTTClient-C:高级C客户端(几乎是C++客户端的克隆)
我们这里是STM32平台,选择的是MQTTPacket项目代码。
3.移植MQTT协议
- 创建一个
MQTT文件夹,再将MQTTPacket\src目录下的文件添加到工程目录MQTT文件夹。

- 再将
MQTTPacket\samples目录下的transport.c、transport.h添加到这个文件夹下。

- 添加MQTT头文件路径

4. 修改transport.c文件
transport.c文件是MQTT协议调用底层socket接口的API,基本上可以沿用sample code里面transport.c,这里有一些微调。如下:
#include "transport.h"
#include "lwip/opt.h"
#include "lwip/arch.h"
#include "lwip/api.h"
#include "lwip/inet.h"
#include "lwip/sockets.h"
#include "string.h"
static int mysock;
/************************************************************************
** 函数名称: transport_sendPacketBuffer
** 函数功能: 以TCP方式发送数据
** 入口参数: unsigned char* buf:数据缓冲区
** int buflen:数据长度
** 出口参数: <0发送数据失败
************************************************************************/
int32_t transport_sendPacketBuffer( uint8_t* buf, int32_t buflen)
{
int32_t rc;
rc = write(mysock, buf, buflen);
return rc;
}
/************************************************************************
** 函数名称: transport_getdata
** 函数功能: 以阻塞的方式接收TCP数据
** 入口参数: unsigned char* buf:数据缓冲区
** int count:数据长度
** 出口参数: <=0接收数据失败
************************************************************************/
int32_t transport_getdata(uint8_t* buf, int32_t count)
{
int32_t rc;
//这个函数在这里不阻塞
rc = recv(mysock, buf, count, 0);
return rc;
}
/************************************************************************
** 函数名称: transport_open
** 函数功能: 打开一个接口,并且和服务器 建立连接
** 入口参数: char* servip:服务器域名
** int port:端口号
** 出口参数: <0打开连接失败
************************************************************************/
int32_t transport_open(int8_t* servip, int32_t port)
{
int32_t *sock = &mysock;
int32_t ret;
// int32_t opt;
struct sockaddr_in addr;
//初始换服务器信息
memset(&addr,0,sizeof<


2383

被折叠的 条评论
为什么被折叠?



