MQTT 协议学习:008-在STM32上移植MQTT
title: protocol-app-mqtt-8-porting-mqtt-on-stm32
date: 2020-02-07 14:16:51
categories:
tags:
- mqtt
- protocol
- stm32
- porting
前言
title: protocol-app-mqtt-8-porting-mqtt-on-stm32
date: 2020-02-07 14:16:51
categories:
tags:
- mqtt
- protocol
- stm32
- porting
通过前面了解MQTT有关概念、分析了有关的报文,我们对于这个协议也有了更深的认识。但纸上谈来终觉浅,绝知此事要躬行
。
本文参考:《STM32+W5500+MQTT+Android实现远程数据采集及控制》、《物联网核心之MQTT移植 》、《基于联盛德w600的mqtt客户端程序示例》
host平台 :Ubuntu 16.04
Taget :STM32 + W5500。
MQTT-client : paho.mqtt.embedded-c
W5500 - 芯片介绍
全硬件TCPIP协议栈
- 支持TCP,UDP,ICMP,IPv4,ARP,IGMP,PPPoE协议
- 硬件协议栈不受网络攻击,安全稳定
8个独立的硬件Socket,各路通信互不影响
32KB片上缓存供TCP/IP包处理
集成802.3以太网MAC
集成10BaseT / 100Base-T以太网PHY
主机接口:SPI高速串行外设接口(最高80Mhz )
低功耗,工作温度40℃左右
支持嵌入式操作系统:Linux & RTOS
支持掉电模式 & UDP网络唤醒
工作电压3.3V,I/O 5V耐压
支持自动协商(全/半双工,10M/100M)
48Pin LQFP无铅封装(7x7mm, 0.5mm针间距)
W5500以太网芯片内核
全硬件TCP/IP协议栈以太网接入方案
MCU <---spi---> w5500 <------> 以太网
MCU : 应用层
w5500 : 传输层,网络层,链路层,物理层
方案介绍
STM32 <---spi---> W5500 <------> 以太网
实际上,单片机这块有很多的方案:RTL8711(WIFI SOC) + LWIP + FreeRTOS + MQTT
、ESP8266 + MQTT
1)STM32F405为主控芯片,它通过传感器采集环境数据
,比如温度,湿度,光照度,大气压强等;
2)主控芯片通过W5500模块将测量的数据通过MQTT协议方式发布到MQTT服务器
(服务器域名和IP见固件程序);
3)主控订阅LED灯控制的消息,当接收到对应的控制指令后点亮或者熄灭对应的LED灯;
4)安卓手机端订阅传感器数据的消息,当接收到消息后将传感器数据在界面显示;
5)安卓手机可发送点亮或者熄灭LED灯的指令到服务器,然后服务器会将该指令转发给STM32主控,然后STM32主控解析该指令并执行指令。
准备
1)下载 MQTT客户端 源码
2)解压源码,再进入MQTTPacket
文件夹,里面有三个文件夹。
A)) 拷贝 src
下 所有 *.c *.h、samples
下的transport.c、transport.h
两个文件复制到工程目录下。
这里我们主要的移植工作就在transport里面。
打开transport.c文件,这个是MQTT连接,发送,接收的接口,源码是Linux跟Windows平台,用的标准的Socket接口函数,我们这里的移植工作量很小,因为LWIP也是支持标准的Socket接口函数,只不过里面有些函数接口是LWIP不支持的,主要就是transport_open这个连接函数有区别。把原来的transport_open函数注释掉,重新写一个。
如果STM32或者其它单片机是用WIFI模块或者GPRS模块,没有用到LWIP的怎么办。其实只要理解的MQTT的源码,就不难用GPRS或者WiFi模块去实现。
MQTT的源码里都是对协议包进行打包解包,数据传输都是在tranport.c里面,我们完全不用transport,可以自己写通信接口,然后把打包的数据包通过模块发出去,写接收接口,把模块接收到服务器数据调用MQTT解包接口解析就可以了。
MQTT的移植非常简单,将C/C++ MQTT Embedded clients的代码添加到工程中,然后我们只需要再次封装4个函数即可:
// 通过网络以TCP的方式发送数据
int transport_sendPacketBuffer(unsigned char* buf, int buflen);
// TCP方式从服务器端读取数据,该函数目前属于阻塞函数;
int transport_getdata(unsigned char* buf, int count);
// 打开一个网络接口,其实就是和服务器建立一个TCP连接;
int transport_open(void);
// 关闭网络接口。
int transport_close(void);
// 因为LWIP也是支持标准的Socket接口函数,只不过里面有些函数接口是LWIP不支持的,主要就是transport_open这个连接函数有区别。
// 所以,如果 协议栈是 LWIP,那么只需要 把原来的transport_open函数注释掉,重写 即可
// ref : http://www.openedv.com/forum.php?mod=viewthread&tid=228932&extra=
MQTT 协议学习:008-在STM32上移植MQTT的更多相关文章
- MQTT 协议学习: 总结 与 各种定义的速查表
背景 经过几天的学习与实操,对于MQTT(主要针对 v3.1.1版本)的学习告一段落,为了方便日后的查阅 本文链接:<MQTT 协议学习: 总结 与 各种定义的速查表> 章节整理 MQTT ...
- MQTT 协议学习:004-MQTT建立通信与 CONNECT 、CONNACK 报文
背景 上一讲 MQTT 协议学习:通信报文的构成介绍了在MQTT通信中,各报文的通信流程:从本讲开始,我们开始介绍实际中使用的报文,以及它们的组成. CONNECT - 连接请求 报文 客户端到服务端 ...
- MQTT 协议学习:002- 通信报文的构成
背景 之前工作中参与有关协议调试的时候,发现对于协议帧的解析是比较重要的. 参考:<MQTT协议 -- 消息报文格式>.<基于STM32实现MQTT>.<MQTT协议从服 ...
- MQTT 协议学习:001-搭建MQTT通信环境,并抓包测试
背景 目的:了解MQTT 通信的有关概念与流程:方便推算某些数据与文档描述是否一致. 为了能够在保证学习质量的前提下,降低配置环境的门槛,我们将服务器搭建在windwos中,实行内网间的MQTT协议访 ...
- STM32上移植ds1307笔记
PS:网上关于ds1307的资料最多还是基于51等单片机的,和stm32上还是略有差别,代码是参考了http://www.openedv.com/posts/list/20167.htm 但是他的代码 ...
- MQTT协议学习总结
一.MQTT介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通 ...
- MQTT协议学习研究 & Mosquitto简要教程(安装和使用)
若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]——在RESTfu ...
- MQTT协议学习及实践(Linux服务端,Android客户端的例子)
前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提 ...
- MQTT 协议学习: QoS等级 与 会话
背景 QoS 等级 与 通信的流程有关,直接影响了整个通信.而且篇幅比较长,所以我觉得应该单独拎出来讲一下. 概念 QoS 代表了 服务质量等级. 设置上,由2 位 的二进制控制,且值不允许为 3(0 ...
随机推荐
- 常见Linux发行版有哪些?
Linux 发行版(英语:Linux distribution,也被叫做GNU/Linux 发行版),为一般用户预先集成好的Linux操作系统及各种应用软件.一般用户不需要重新编译,在直接安装之后,只 ...
- 「CF438D The Child and Sequence」
一道CF线段树好题. 前置芝士 线段树:一个很有用数据结构. 势能分析:用来证明复杂度,其实不会也没什么关系啦. 具体做法 不难发现,对于一个数膜一个大于它的数后,这个数至少减少一半,每个数最多只能被 ...
- Spring 注意事项
1.在我们使用spring 5.x版本的时候,要求junit 的jar版本是4.12及以上. 2.不管是什么样的配置,当发现之前能用,改了位置就不能用的时候,首先要考虑的问题就是:是否有约束上顺序的要 ...
- redis服务器性能优化
1.系统内存OOM优化 vm.overcommit_memory Redis会占用非常大内存,所以通常需要关闭系统的OOM,方法为将“/proc/sys/vm/overcommit_memory”的值 ...
- Python 基础之模块之os os.path 及os与shutil对比
一: os 对系统进行操作 #注:以下操作都在linux环境下操作,且很多运行之前需要做好相关条件import os#(1)system() 在python总执行系统命令#os.system(&quo ...
- DoMes平台首页菜单栏
问题1:左侧菜单栏数据是在哪里获取的? 答案1: 项目根目录的Views/Home/Index文件为平台首页 打开Index.cshtml文件,有一个framework-clientdata.js引入 ...
- OPC DA通讯 KEP6.4 DCOM 配置脚本
在OPC DA通讯测试时总是避免不了要配置DCOM,我习惯是在虚拟机中装这些通讯测试软件,每次安装都需要再次手动配置,感觉很是麻烦 因此,查找资料,了解到可以用dcomperm这个软件来在命令行下进行 ...
- POJ 2947:Widget Factory 求同余方程
Widget Factory Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 5173 Accepted: 1790 De ...
- 第1节 storm编程:8、storm的分发策略
8. Storm的分发策略 Storm当中的分组策略,一共有八种: 所谓的grouping策略就是在Spout与Bolt.Bolt与Bolt之间传递Tuple的方式.总共有八种方式: 1)shuffl ...
- 使用U盘安装Linux最美桌面发行版Elementary OS 及常用开发环境配置(JDK,Redis,MySQL,Docker,IDEA,STS)
前言 假期在家无聊,刚好把六年前的一台笔记本电脑利用起来,原来电脑虽然说配置说不上古董机器,但是运行win系统感觉还是不流畅,所幸给换成Linux桌面版系统,在网上查阅了很多,Linux桌面系统要么推 ...