【FreeRTOS】基于STM32移植LWIP 2.1.2之MQTT

相关文章

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.ctransport.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<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值