设备高端网站建设,学创杯营销之道模板,云速成美站做网站好吗,无锡大型互联网公司MQTT全称是#xff08;Message Queuing Telemetry Transport#xff09;#xff0c;即消息队列遥测传输协议
是一种基于发布/订阅#xff08;Publish/Subscribe#xff09;模式的轻量级通讯协议#xff0c;并且该协议构建于TCP/IP协议之上#xff0c;常用于互联网中Message Queuing Telemetry Transport即消息队列遥测传输协议
是一种基于发布/订阅Publish/Subscribe模式的轻量级通讯协议并且该协议构建于TCP/IP协议之上常用于互联网中轻便 基本组件 客户端Client 任何设备传感器、手机、应用程序等都可以作为MQTT客户端。客户端可以发布消息Publisher或者订阅消息Subscriber。 代理Broker 代理是MQTT网络的核心组件负责接收来自发布者的消息并将其转发给订阅了该主题的客户端。它确保消息的传递和分发管理客户端连接、订阅、注销等操作。
工作流程 连接 MQTT客户端通过TCP/IP与MQTT代理建立连接。连接建立后客户端必须发送“连接”请求。代理根据请求的信息如客户端ID、用户名、密码等进行身份验证和授权。 发布Publish 客户端将消息发布到特定的主题Topic。主题是一种类似路径的层级结构可以用斜杠/分隔如 sensors/temperature/kitchen。代理接收消息并进行处理。 订阅Subscribe 客户端可以订阅一个或多个主题。订阅后代理会将所有属于该主题的消息分发给相应的客户端。订阅可以是精确的主题也可以包含通配符来匹配多个主题。 消息分发 代理将发布的消息转发给所有订阅了该主题的客户端。 断开连接 客户端可以随时断开与代理的连接。代理也可以在检测到长时间未活动后断开客户端连接。
应用场景
MQTT广泛应用于物联网、车联网、智能家居、远程监控和消息推送等场景。其轻量级、低带宽、高效的特性使其特别适合资源受限及网络不稳定的环境。
通过这些组件和操作MQTT可以实现高效、可靠的消息传递成为物联网通信中的重要协议。
QT 交互例子
准备工作MQTT客户端的交互需要安装MQTT代理及代理服务器负责将消息转发。按照好后配置相关如监听的端口和协议、是否启用消息持久化、日志文件路径等。根据需求修改这些设置保存配置文件等。这里就不赘述 接下来详细讲解在QT中MQTT的使用
1.使用官方的MQTT源码造好的轮子有用就用官网https://github.com/emqx/qmqtt
或者这个链接下载: https://pan.baidu.com/s/1oUtl9R628-3cfS-tyL6iEQ?pwd1234 提取码: 1234
下载完解压放到程序目录下
我的例子程序结构如下分为mqtt封装的库用于发送接收消息和界面主程序用于控制发送和消息显示 2.写一个例子这里给关键代码展示
一是连接mqtt二是推送消息函数三是接收订阅的消息函数
void MqttShareHandle::initMqtt()
{if (client) {return;}client.reset(new QMqttClient);QObject::connect(client.get(), QMqttClient::connected, this, MqttShareHandle::connected);QObject::connect(client.get(), QMqttClient::disconnected, this, MqttShareHandle::disconnected);QObject::connect(client.get(), QMqttClient::errorChanged, this, MqttShareHandle::errorChanged);QObject::connect(client.get(), QMqttClient::messageReceived, this,[](const QByteArray message, const QMqttTopicName topic) {emit messageReceived(message, topic.name());});QObject::connect(client.get(), QMqttClient::messageReceived, this,[](const QByteArray message, const QMqttTopicName topic) {onMessageReceived(message, topic.name());});
}void MqttShareHandle::connectToHost(const QString host,quint16 port,const QString username,const QString password)
{if (!client || isConnected()) {return;}client-setHostname(host);client-setPort(port);client-setUsername(username);client-setPassword(password);client-connectToHost();
}
//订阅消息
void MqttShareHandle::subscribeBizTopics()
{//保证消息至少到达一次。//较为可靠适用于大多数需要保证消息到达的场景const quint8 qos 1;subscribeTopic(TopicAppEnvData, qos);subscribeTopic(TopicAppDeviceStatus, qos);subscribeTopic(TopicAppEventNotify, qos);
}bool MqttShareHandle::subscribeTopic(const QString topic, quint8 qos)
{if (!client) {return false;}auto subscription client-subscribe(topic, qos);return subscription ? subscription-state() QMqttSubscription::Subscribed : false;
}//推送消息
bool MqttShareHandle::publishTopic(const QString topic, const QByteArray data, quint8 qos, bool retain)
{if (!client) {return false;}emit printMsg(QString(推送消息, topic:%1,data:%2).arg(topic).arg(QString(data)));auto ret client-publish(topic, data, qos, retain);return ret ! -1;
}void MqttShareHandle::onMessageReceived(const QByteArray message, const QString topic)
{QJsonParseError error;QJsonDocument doc QJsonDocument::fromJson(message, error);if (error.error ! QJsonParseError::NoError) {return;}//QMetaObject::invokeMethod(this, MessageMap.value(topic).toUtf8(), Q_ARG(QByteArray,message));emit printMsg(QString(收到消息推送, topic:%1,data:%2).arg(topic).arg(QString(message)));if(topic TopicAppEnvData) {emit appEnvDataUpdate(message);}else if(topic TopicAppEventNotify) {emit appEventNotify(message);}else if(topic TopicAppDeviceStatus) {emit appDeviceStatusUpdate(message);}
}我的这个例子用了五个主题要演示推送和接收
// 环境信息更新主题
QString MqttShareHandle::TopicAppEnvData /Topic/EnvData;
// 设备状态更新主题
QString MqttShareHandle::TopicAppDeviceStatus /Topic/DeviceStatus;
// 事件通知主题
QString MqttShareHandle::TopicAppEventNotify /Topic/EventNotify;
//------------------------消息发布推送-------------------------
// 控制设备主题
QString MqttShareHandle::TopicControlDevice /Topic/ControlDevice;
// 控制门主题开关门
QString MqttShareHandle::TopicControlDoor /Topic/ControlDoor;
写了一个demo程序如下改程序可以通过mqtt推送开关门控制事件模拟控制订阅“TopicControlDoor”主题的设备控制开关门控制订阅TopicControlDevice主题的设备控制开关灯并且订阅相关设备推送消息的主题便于接收响应的信息 演示下效果比较简陋
我用这个QT客户端模式外部设备 演示视频
通过订阅环境主题事件设备状态可以接收设备的相关消息推送
设备也订阅了控门事件控灯事件。接收到app的推送后也显示出来做出相应的处理 通过这个例子可以认识到mqtt的通讯方式是一对多也可以一对一实现方式也很简单订阅与发布。
订阅就相当于你关注了一个人UP主uploader他要是发布了动态或者视频等就会通知你如果你没有关注那个人肯定不会接收到通知
发布就反过来你是UP主发布的东西只要他人关注了你就会被通知
这个例子的源码我就放在这里了有什么不懂的欢迎评论区交流哈
链接: https://pan.baidu.com/s/1v_xViXSHoV2QekwdKDq7SA?pwd6666 提取码: 6666
为什么有了tcp通信后还要有人写一个mqtt出来呢
mqtt的优势
1. 发布/订阅模式
MQTT 采用发布/订阅模式允许客户端发布消息到主题Topic其他客户端可以订阅这些主题来接收消息。这种模式使得消息的传递更加灵活和解耦客户端之间不需要直接连接减少了复杂性。
2. 轻量级
MQTT 协议设计得非常轻量级适合在带宽有限、网络不稳定的环境中使用如物联网设备。MQTT 的消息头非常小最小只有 2 字节这使得它在低带宽网络中传输效率更高。
3. QoS服务质量
MQTT 提供了三种服务质量QoS级别
QoS 0最多一次At most once消息发送一次不保证接收。QoS 1至少一次At least once消息至少发送一次可能会重复。QoS 2恰好一次Exactly once消息只发送一次保证不重复。
QoS 0最多一次At most once
特点
消息传输是尽力而为不保证消息到达。不进行消息确认不做重发。最低的网络开销和延迟。
使用场合
传感器数据如环境温度、湿度等定期发送如果丢失一两条数据不会有太大影响。日志数据实时性和完整性要求不高的日志信息。状态更新如设备的在线状态定期发送如果有丢失可在下次更新时弥补。
优点
最低的网络开销。最低的延迟。简单实现。
缺点
不保证消息到达。可能会丢失消息。
QoS 1至少一次At least once
特点
消息至少到达一次。发送者会重发消息直到收到接收者的确认。接收者可能会收到重复的消息需要去重。
使用场合
重要数据如报警信息需要确保接收者至少收到一次即使可能会有重复。财务记录如银行交易需要确保消息到达但可以接受重复处理。设备控制如远程设备控制命令需要确保命令被接收和执行但可以手动处理重复执行。
优点
保证消息至少到达一次。较为可靠适用于大多数需要保证消息到达的场景。
缺点
可能会收到重复消息需要处理冗余。网络开销和延迟高于 QoS 0。
QoS 2只有一次Exactly once
特点
消息保证到达且仅到达一次。通过四次消息交换确保消息的唯一性和可靠性。最高的可靠性适合对传输可靠性要求极高的场合。
使用场合
关键指令如关键操作的执行命令不能出现丢失或重复的情况。交易处理如金融交易需要严格的消息确保机制要求高可靠性。数据同步如重要数据库的同步操作需要确保数据准确性和一致性。
优点
保证消息仅到达一次。最高的传输可靠性。
缺点
最高的网络开销。延迟较高因为需要多次消息交换。实现复杂。
这些 QoS 级别使得 MQTT 能够适应不同的应用场景确保消息的可靠传输。
4. 会话保持
MQTT 支持会话保持Session Persistence即使在客户端断开连接后服务器仍然可以保存客户端的订阅信息和未接收的消息当客户端重新连接时可以继续接收这些消息。
5. 遗嘱消息Last Will and Testament
MQTT 支持遗嘱消息LWT客户端可以在连接时设置一个遗嘱消息当客户端异常断开连接时服务器会自动发布这个遗嘱消息通知其他客户端该客户端已经断开连接。
6. 心跳机制
MQTT 支持心跳机制Keep Alive客户端可以定期发送 PING 请求确保连接的活跃性服务器也可以通过 PING 响应来检测客户端的连接状态。
7. 安全性
MQTT 支持 TLS/SSL 加密确保消息在传输过程中的安全性。此外MQTT 还支持用户名和密码认证增加了系统的安全性。
8. 易于扩展
MQTT 的发布/订阅模式和主题Topic结构使得系统易于扩展。新的客户端可以轻松地加入系统订阅感兴趣的主题而不需要修改现有的客户端或服务器。
9. 广泛支持
MQTT 协议得到了广泛的支持有大量的客户端库和服务器实现适用于各种编程语言和平台如 C、C、Java、Python、JavaScript 等。
总结
相比于直接使用 TCPMQTT 提供了更高层次的抽象和功能使得消息的传递更加灵活、可靠和高效。特别是在物联网和低带宽网络环境中MQTT 的优势更加明显。