打印
[其他ST产品]

STM32-MQTT

[复制链接]
443|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
l63t89|  楼主 | 2023-10-9 23:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM32-MQTT
1. MQTT简介
1.1 概述
消息队列遥测传输(Message Queuing Telemetry Transport, MQTT)是基于客户端(Client)/服务器(Server)和发布(Pulishi)/订阅(Subscribe)范式的消息传输协议. MQTT具有轻量、开放、简单、设计易于实施等特点, 这些特性使其在许多情况非常适用, 包括机器到机器(Machine to Machine, M2M)和物联网(IoT)等受限环境, 这些环境对代码占用空间要求严格/或网络带宽非常宝贵. MQTT必须运行在提供有序、无损、双向连接的传输协议之上–通常是TCP/IP.
基本概念 MQTT Broker(Server)/Client
MQTT协议定义了两种类型的网络实体: 一个消息代理(Broker)、多个客户端(Client).
Broker是一个服务器程序, 它的角色类似于邮局, 它接收所有从Client发出的消息(message), 然后将消息路由到合适的目的Client.
Client可以是运行MQTT库并通过网络连接到Broker的任意设备(从微控制器到服务器).


使用特权

评论回复
评论
l63t89 2023-10-9 23:27 回复TA
———————————————— 版权声明:本文为CSDN博主「根号九九六」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u012698938/article/details/129163156 
沙发
l63t89|  楼主 | 2023-10-9 23:27 | 只看该作者
Publish/Subscribe & Topic
每个Client都可以将消息发布(Publish)到Broker, 或从Broker订阅(Subscribe)消息, 因此Client有两种角色: 发布者(Publisher)/订阅者(Subscriber).
消息在Broker中按照主题层次结构(Topic)组织. Publisher在发布消息时指定Topic, Broker在接收到消息时, 根据Topic将消息发布给订阅了该Topic的Subscriber.

使用特权

评论回复
板凳
l63t89|  楼主 | 2023-10-9 23:28 | 只看该作者
工作过程

MQTT Client和Broker通过TCP连接建立通信. 通常, Broker运行在服务器的1883端口上, 监听Client的连接请求.

使用特权

评论回复
地板
l63t89|  楼主 | 2023-10-9 23:28 | 只看该作者
建立连接(Connect). Client首先经过三次握手与Broker建立TCP连接, 然后发送Connect Command包登录Broker, Broker收到该包后, 回复Connect Ack包以确认Client的登陆请求, Client即可进行消息的订阅和发布.

使用特权

评论回复
5
l63t89|  楼主 | 2023-10-9 23:28 | 只看该作者
发布消息(Publish). Client发送Publish Message包指定发布的消息内容(Message)及主题(Topic), Broker收到该包后不进行回复, 根据消息主题将该消息转发给订阅了该主题的所有Client.

使用特权

评论回复
6
l63t89|  楼主 | 2023-10-9 23:28 | 只看该作者
订阅消息(Subscribe). Client发送Subscribe Request包指定需要订阅的主题, Broker收到该包后回复Subscribe Ack包确认订阅请求. 当Broker收到指定该主题的消息时, 会将该消息发布给所有订阅了该主题的Client.

使用特权

评论回复
7
l63t89|  楼主 | 2023-10-9 23:28 | 只看该作者
取消订阅(Unsubscribe). Client发送Unsubscribe Request包指定取消订阅的主题, Broker收到该包后回复Unsubscribe Ack包确认取消订阅.

使用特权

评论回复
8
l63t89|  楼主 | 2023-10-9 23:28 | 只看该作者
本帖最后由 l63t89 于 2023-10-9 23:33 编辑

断开连接(Disconnect). Client发送Disconnect Req包退出登录, 随后进行四次握手断开TCP连接.

使用特权

评论回复
9
l63t89|  楼主 | 2023-10-9 23:32 | 只看该作者
发布消息

使用特权

评论回复
10
l63t89|  楼主 | 2023-10-9 23:33 | 只看该作者
订阅

使用特权

评论回复
11
l63t89|  楼主 | 2023-10-9 23:33 | 只看该作者
1.4 版本

使用特权

评论回复
12
l63t89|  楼主 | 2023-10-9 23:33 | 只看该作者

使用特权

评论回复
13
l63t89|  楼主 | 2023-10-9 23:35 | 只看该作者
移植STM32
目标环境: STM32F107 + 4G模块
需求: 本地采集数据并通过4G模块发布到MQTT服务器
开发环境: Keil uVision 5
使用源码: eclipse/paho.mqtt.embedded-c

使用特权

评论回复
14
l63t89|  楼主 | 2023-10-9 23:37 | 只看该作者
步骤
下载源码
将MQTTPacket内的全部内容添加到Keil工程中
根据MQTTClient-C的内容编写移植代码
编译下载工程

使用特权

评论回复
15
l63t89|  楼主 | 2023-10-9 23:37 | 只看该作者
通信过程
底层模块建立TCP链接
登录MQTT服务器
采集数据并构造Message
发布消息

使用特权

评论回复
16
l63t89|  楼主 | 2023-10-9 23:37 | 只看该作者
简易移植方案
数据发送接口
bool transport_sendPacketBuffer(unsigned char *buf, unsigned int buflen)
{
    bool rc;
    rc = tcp_send(buf, buflen); // 底层发送TCP数据包的函数接口 自定义
    return rc;
}

使用特权

评论回复
17
l63t89|  楼主 | 2023-10-9 23:37 | 只看该作者
数据接收接口
int transport_getdata(unsigned char *buf, unsigned int count)
{
    tcp_recv(buf, count); // 底层接收TCP数据包的函数接口 自定义
    return 1;
}

使用特权

评论回复
18
l63t89|  楼主 | 2023-10-9 23:44 | 只看该作者
登录MQTT服务器
bool mqtt_connect(unsigned char *buf, unsigned int buflen)
{
    u32 len = 0;
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.clientID.csting = "me";
    data.keepAliveInterval = 20;
    data.cleansession = 1;
    data.username.cstring = "testuser";
    data.password.cstring = "testpassword";

    len = MQTTSerialize_connect(buf, buflen, &data);
    if(!transport_sendPacketBuffer(buf, len))
    {
        return 0;
    }
    return 1;
}

使用特权

评论回复
19
l63t89|  楼主 | 2023-10-9 23:47 | 只看该作者
发布消息bool mqtt_publish(unsigned char *buf, unsigned int buflen, char *topicName, MQTTMessage *message)
{
    u32 len = 0;
    MQTTString topicString = MQTTString_initializer;
    topicString.cstring = topicName;
    len = MQTTSerialize_publish(buf, buf_size, 0, message->qos, message->retained, message->id, topicName, (unsigned char*)message->payload, message->payloadlen);
   
    if(!transport_sendPacketBuffer(buf, len))
    {
        return 0;
    }
    return 1;
}

使用特权

评论回复
20
l63t89|  楼主 | 2023-10-9 23:48 | 只看该作者
发布消息
bool mqtt_publish(unsigned char *buf, unsigned int buflen, char *topicName, MQTTMessage *message)
{
    u32 len = 0;
    MQTTString topicString = MQTTString_initializer;
    topicString.cstring = topicName;
    len = MQTTSerialize_publish(buf, buf_size, 0, message->qos, message->retained, message->id, topicName, (unsigned char*)message->payload, message->payloadlen);
   
    if(!transport_sendPacketBuffer(buf, len))
    {
        return 0;
    }
    return 1;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

776

帖子

1

粉丝