STM32 基础系列教程 40 - Lwip_mqtt

前言

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

物联网这么火,不会点MQTT怎么行。本节我们将学习stm32 + LWIP构建一下MQTT客端,学会使用MQTT给云/服务器(本节为了演示用本地服务器来演示),本节的示例修改目标地址有相关主题后可直接连接阿里云,但要实现与阿里云服务器真实的通信还需用户注册阿里云平台开发者账号,以使用阿里去提供的SDK(后期有教程推出)。

 

示例详解

基于硬件平台: 正点源子的stm32f4 探索者开发板,主要使用了SDIO文件系统以及以太网接口, MCU 的型号是 STM32F4ZET6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。本示例所用的开发板及部分原理图:

STM32 基础系列教程 40 - Lwip_mqtt

STM32 基础系列教程 40 - Lwip_mqtt

STM32 基础系列教程 40 - Lwip_mqtt

 

 

 

    1. 关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:

 

      1. 系统时钟树

STM32 基础系列教程 40 - Lwip_mqtt

 

      1. 网口配置

STM32 基础系列教程 40 - Lwip_mqtt

高级参数项默认是LAN8742,开发板使用的是LAN8720,它两寄存器基本一样,所以本实验对高级参数不作修改。

 

      1. RCC配置

STM32 基础系列教程 40 - Lwip_mqtt

      1. SYS配置

STM32 基础系列教程 40 - Lwip_mqtt

 

      1. Lwip配置

STM32 基础系列教程 40 - Lwip_mqtt

 

      1. 引脚配置

STM32 基础系列教程 40 - Lwip_mqtt

IO脚按原理图来配置即可,但这时要注意一点是网口芯片有个复位引脚PD3在程序运行时要配迈高,可参考如下:

STM32 基础系列教程 40 - Lwip_mqtt

STM32 基础系列教程 40 - Lwip_mqtt

      1. 堆栈配置,本工程较大,可以适当加大堆栈大小:

STM32 基础系列教程 40 - Lwip_mqtt

 

    1. 工程代码
      1. 在工程中加入Mqtt协议栈,如果没有需先安装:

STM32 基础系列教程 40 - Lwip_mqtt

安装好后就可以加入到我们的工程中:

STM32 基础系列教程 40 - Lwip_mqtt

加好之后工程树下增加IoT Utility目录:

STM32 基础系列教程 40 - Lwip_mqtt

 

      1. 在工程树下新建“myMqttClient”文件夹,并加入我们事先准备好的mqtt_client.c及transport.c文件,其中transport.c是实现Mqtt协议数据收发的具体实现,mqtt_client.c文件实现TCP连接与Mqtt工作状态机。

STM32 基础系列教程 40 - Lwip_mqtt

STM32 基础系列教程 40 - Lwip_mqtt

      1. 做好上述操作后,就可以在main.c中加入以下代码来实现本实现的测试功能:

STM32 基础系列教程 40 - Lwip_mqtt

STM32 基础系列教程 40 - Lwip_mqtt

同样为了实样调试信息的打印输出,我们也要实现putc函数

STM32 基础系列教程 40 - Lwip_mqtt

      1. 最后为了我们的Mqtt能成功跑起来,我们在Lwipopts.h中手动设置MEMP_NUM_SYS_TIMEOUT的数为6:

STM32 基础系列教程 40 - Lwip_mqtt

 

    1. 编译工程,下载代码, ip为路由器自动分配,如果设备网口及LWIP成功运行,在路由器列表中同样也应该可以看到我们的设备,同时应该是可以PING通的:

(注:在使用探索者F4调试时,下载或仿真调试时先不要PC串口工具连接上开发板的USB_232接口,有可能导致程序运行不了--boot0引脚电平不对,可以先跑起来再在PC串口工具上连接相应端口!!)

STM32 基础系列教程 40 - Lwip_mqtt

在mqtt_client.h文件中定义了本地MQtt服务器的IP地址为192.168.1.100(PC IP)如下:

STM32 基础系列教程 40 - Lwip_mqtt

烧录程序打开本地MQTT测试服务器软件,然后按下开发板上复位键,可以看到服务器软件上接收MQTT连接信处:

STM32 基础系列教程 40 - Lwip_mqtt

边接后,会每5秒上发一些数据到服务器:

STM32 基础系列教程 40 - Lwip_mqtt

在服务器发窗口输入发送内容(如上图),打开串口工具,接上开发板的USB_232接口,然点Send,可以在串口工具中看到服务器发给客户端的数据:

STM32 基础系列教程 40 - Lwip_mqtt

到此stm32+lwip的mqtt服务构建实验就算完成了,本节只演示了简单的数据收发,真正的MQTT通信内容一般是JSON数据,关于JSON数据的使用(组包与解析)我们后面再讲。

OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!

文中源码资料下载,在公众号里给十三发消息:

下载|STM32基础系列教程40

STM32 基础系列教程 40 - Lwip_mqtt

 

关注十三公众号

STM32 基础系列教程 40 - Lwip_mqtt