物联网协议之MQTT(一)基础概念和设备
前言: 本文内容均以实战出发,像MQTT概念这种基础内容建议大家自行百度。
推荐资料: mica-mqtt文档
一、MQTT简单介绍
作为当今物联网的主流协议,MQTT的使用范围非常广,如果你想了解甚至是从事物联网行业,MQTT是避不开的。
1.1 clientId
看名字不难看出,clientId
就是客户端的ID
,服务端可以通过clientId判断出对应的是哪台设备。
ID就意味着唯一,所以请在定义clientId时保证它的唯一性,如果重复,可能导致两个设备互踢下线的情况。
- 唯一性: 保证clientId的唯一,才能做到对设备的唯一识别;
- 长度限制: 根据不同的MQTT,一般都有长度限制,有限制23个字符的,有64个字符的。所以,建议大家不要超过
20
个字符。 - 别用特殊字符: 这个其实大家都懂吧,别那么有个性,容易出奇奇怪怪的问题。尽量用
大小写字母
、数字
、_
、-
,这四种就行,实测没毛病。
1.2 Topic
Topic是MQTT中很重要的概念,消息的分类标签,客户端通过订阅或发布特定的主题来进行消息交互。大家可以把它简单理解为我们代码里API接口(就是controller写的那个),都是以斜杠/
分隔。当然,如果你是Kafka之类MQ消息队列的使用者,对Topic的概念应该不陌生。下面举个例子。
名称 | Topic地址 |
---|---|
实时数据 | /mqtt/xxx/xxx/live |
历史数据 | /mqtt/xxx/xxx/history |
告警事件 | /mqtt/xxx/xxx/event |
下发控制 | /cloud/xxx/xxx/switch |
中间的两层xxx一般是设备的编号信息。👆上面只是举例Topic的格式,并不是说所有的MQTT设备都有这些Topic。
1.2.1 Topic应用场景
- 实时监控: 通过订阅相关Topic,实时接收设备状态和数据,实现对设备的实时监控;
- 远程控制: 通过发布命令到特定Topic,实现对远程设备的控制和操作;
- 报警通知: 当设备检测到异常情况时,通过发布报警消息到指定Topic,及时通知相关人员或系统;
- 数据采集: 通过订阅数据Topic,集中采集和处理来自多个设备的数据。
1.2.2 Topic命名习惯
以下信息主要是以标准网关为例,并不是强制要求。
一般标准的Topic格式有以下特征:
- 统一的开头: 一般第一层是传输方向,比如上面表格的例子。以
/mqtt
开头为设备上报到服务端,以/cloud
开头为服务端下发到设备控制; - 统一的结尾: 一般最后一层是传输方向,比如上面表格的例子。以
/live
结尾为设备上报实时数据,以/history
结尾为设备上报历史数据; - 自带设备编号: Topic的中间部分一般是网关的pkey、sn或者clientId。
当然,我们是可以在MQTT服务中自定义Topic,格式可以根据大家的个人习惯。但是希望大家每种功能都定义一个Topic,而不是在消息体内用type
之类的字段来区分。
1.2.3 Topic通配符
以上面表格为例,一般Topic中间会有代表设备编号或clientId,不可能每个设备都写个订阅,一般都以通配符表示。以表格第一行的/mqtt/xxx/xxx/live
Topic为例,我们简单演示两种通配符的使用。
- 匹配多层的
#
:#
可以模糊匹配多层,比如:我们可以用/mqtt/#/live
表示上面的例子; - 匹配单层的
+
:+
可以模糊匹配单层,比如:我们可以用/mqtt/+/+/live
表示上面的例子。
1.2.4 Topic共享订阅
这个功能一般是在服务端分发数据的时候时候,这个功能非常好用。后面会有单独的篇幅介绍,不了解的谨慎使用。
一般而言多个客户端订阅同一个Topic,那么所有的客户端都会收到Topic的消息。但是,有时候我们只想有一个客户端收到数据。比如,数据量非常大时,我想用多个客户端来分担压力,这个时候就需要用到共享订阅。
简单来说,共享订阅类似Nginx的负载均衡,服务端会把数据随机分到到一个客户端。
1.2.4.1 单组共享订阅
订阅Topic加上前缀 $queue/
(请注意后面有个/
),当多个客户端订阅了Topic $queue/xxx
,发布者发布到 Topicxxx
时 ,则只有一个客户端会接收到消息。
1.2.4.1 分组共享订阅
订阅Topic加上前缀 $share/<group>/
(请注意后面有个/
,中间<group>
是分组的意思,可以用随便什么字符表示),当客户端订阅了Topic $share/aaa/xxx
、$share/bbb/xxx
,发布者发布到 Topicxxx
时 ,则每个分组中只有一个客户端会接收到消息。
相信大家肯定注意到共享订阅前缀最后的 /,所以如果你的Topic是以/开头,那么会出现两个/,比如Topic是/mqtt/xxx/xxx/live,共享订阅Topic就是$queue//mqtt/xxx/xxx/live,这样看起来比较奇怪。所以,一般自定义的共享订阅,我开头的/是不写的。大家一定注意⚠️!!!!!!!!!
1.3 QoS
这个其实挺重要的,但是我们物联网一般也不需要单独设置,大家可以参考下mica-mqtt
的文档了解下就行:mica-mqtt
1.4 消息体
MQTT传输的消息,一般收到是字节数组byte[]
,转成字符串就行,就能获取到真正的信息。
二、MQTT常用工具
工具的使用后面会单开一章,有些会有特殊用法。
2.1 EMQX
理论上说,EMQX不能说是一个工具,它是一个平台或者说一个系统。有开源版,也有更强的云服务和企业版,但是一般的小中型物联网平台,开源版足够了。
EMQX文档地址:EMQX文档
虽然EMQX很出名,使用的用户很多,但是正因如此。强烈建议大家不要把EMQX作为数据接收服务,暴露在公网,很可能因为EMQX的某些可能存在的漏洞影响整个平台。
2.1 MQTTX
通过网盘分享的文件:emqx-5.3.2-windows-amd64.zip
链接: https://pan.baidu.com/s/1BYmqQQaPHkshyf-vkFK5Sw?pwd=hpua 提取码: hpua
–来自百度网盘超级会员v9的分享
相关文章:
物联网协议之MQTT(一)基础概念和设备
前言: 本文内容均以实战出发,像MQTT概念这种基础内容建议大家自行百度。 推荐资料: mica-mqtt文档 一、MQTT简单介绍 作为当今物联网的主流协议,MQTT的使用范围非常广,如果你想了解甚至是从事物联网行业,…...

「Java教案」Java程序的构成
课程目标 1.知识目标 能够按照Java标识符的命名规则,规范变量的命名。能够区分Java中的关键字与保留字。能够对注释进行分类,根据注释的用途合理的选择注释方式。 2.能力目标 能编写符合规范的标识符。能识别Java中的关键字和…...
还原Windows防火墙
还原Windows防火墙 1. 背景2. 为何“还原”完胜“关闭”?三大核心优势3. 还原防火墙默认值操作步骤4. 还原防火墙时,系统背后的工作5. 需要还原防火墙场景一招拯救混乱网络!还原Windows防火墙,找回你的“安全速度”1. 背景 你是否曾因一时误操作关闭了Windows防火墙?是…...

区块链可投会议CCF B--EDBT 2026 截止10.8 附录用率
Conference:EDBT: 29th International Conference on Extending Database Technology CCF level:CCF B Categories:数据库/数据挖掘/内容检索 Year:2026 Conference time:24th March - 27th…...

经典ReLU回归!重大缺陷「死亡ReLU问题」已被解决
来源 | 机器之心 在深度学习领域中,对激活函数的探讨已成为一个独立的研究方向。例如 GELU、SELU 和 SiLU 等函数凭借其平滑梯度与卓越的收敛特性,已成为热门选择。 尽管这一趋势盛行,经典 ReLU 函数仍因其简洁性、固有稀疏性及…...

在VSCode中开发一个uni-app项目
创建项目 使用命令行工具(例如 vue-cli)来创建一个新的 uni-app 项目。 创建以JavaScript开发的工程 npx degit dcloudio/uni-preset-vue#vite my-vue3-project //或者 npx degit dcloudio/uni-preset-vue#vite-alpha my-vue3-project创建以TypeScript…...
quic为什么没有被大规模应用?
一、成本 将应用程序从 HTTP/2 迁移到 HTTP/3,或从 TCP 迁移到 UDP 需要付出一定的努力。它需要将整个应用层实现和传输层实现转换到UDP,并在服务器端和客户端构建一个全新的解决方案。对于资源有限的小型流媒体供应商来说,这是一个不小的挑…...
Delft3D软件介绍及建模原理和步骤;Delft3D数值模拟溶质运移模型建立;地表水环境影响评价报告编写思路
📚 教程以地表水数值模拟软件 Delft3D 4.03.00 的操作为核心内容,系统涵盖地表水水动力建模、基础资料获取、边界条件设定、模型率定与验证以及数据分析处理等关键环节。通过全面讲解,学员将掌握地表水数值模拟的全过程实际操作技术。 &…...
书籍在其他数都出现k次的数组中找到只出现一次的数(7)0603
题目 给定一个整型数组arr和一个大于1的整数k。已知arr中只有1个数出现了1次,其他的数都出现了k次,请返回只出现了1次的数。 解答: 对此题进行思路转换,可以将此题,转换成k进制数。 k进制的两个数c和d,…...
开源模型应用落地-OpenAI Agents SDK-集成Qwen3-8B-function_tool(二)
一、前言 在人工智能技术迅猛发展的今天,OpenAI Agents SDK 为开发者提供了一个强大的工具集,用于构建基于 Python 的智能代理应用。这些代理可以执行从简单任务到复杂决策的一系列操作,极大地提升了应用程序的智能化水平。 通过 OpenAI Agents SDK,可以利用 Python 编程语…...

Python - 爬虫;Scrapy框架之插件Extensions(四)
阅读本文前先参考 https://blog.csdn.net/MinggeQingchun/article/details/145904572 在 Scrapy 中,扩展(Extensions)是一种插件,允许你添加额外的功能到你的爬虫项目中。这些扩展可以在项目的不同阶段执行,比如启动…...

Spark实战能力测评模拟题精析【模拟考】
1.println(Array(1,2,3,4,5).filter(_%20).toList() 输出结果是(B) A. 2 4 B. List(2,4) C. List(1,3,5) D. 1 3 5 2.println(Array("tom","team","pom") .filter(_.matches("")).toList) 输出结果为(List(tom,…...

【OSG学习笔记】Day 15: 路径动画与相机漫游
本章来学习下漫游相机。 路径动画与相机漫游 本届内容比较简单,其实就是实现物体的运动和相机的运动 当然这两个要一起执行。 贝塞尔曲线 贝塞尔曲线(Bzier curve)是一种在计算机图形学、动画制作、工业设计等领域广泛应用的参数曲线&am…...

PostgreSQL(PostGIS)触发器+坐标转换案例
需求,只录入一份坐标参考为4326的数据,但是发布的数据要求坐标必须是3857 对这种需求可以利用数据库触发器实现数据的同步 步骤: 1. 使用ArcGIS Pro创建一个名字为testfc_4326的图层,坐标参考为4326 2. 使用Pro再创建一个名字…...

Constraints and Triggers
目录 Kinds of Constraints Single-Attribute Keys Multiattribute Key Foreign Keys Expressing Foreign Keys Enforcing Foreign-Key Constraints Actions Taken Attribute-Based Checks Timing of Checks Tuple-Based Checks Assertions Timing of Assertion Ch…...
基于windows系统的netcore架构与SqlServer数据库,实现双机热备。
以下是基于 SQL Server Always On 可用性组 和 故障转移群集 的详细配置步骤,用于实现双机热备。 步骤 1:准备环境 1.1 硬件和软件准备 两台服务器:分别作为主服务器和备用服务器。SQL Server版本:确保两台服务器上安装的SQL S…...
【转bin】EXCEL数据转bin
如果DEC2BIN函数的默认设置无法满足需求(它最多只能处理10位的二进制转换),可以通过VBA宏方法来处理较大数的二进制转换并提取特定位置的数字: 十进制转二进制(不限位宽) 1、打开VBA编辑器(Al…...

BERT:让AI真正“读懂”语言的革命
BERT:让AI真正“读懂”语言的革命 ——图解谷歌神作《BERT: Pre-training of Deep Bidirectional Transformers》 2018年,谷歌AI团队扔出一篇核弹级论文,引爆了整个NLP领域。这个叫BERT的模型在11项任务中屠榜,甚至超越人类表现…...
【计算机组成原理】SPOOLing技术
SPOOLing技术 关键点内容核心思想通过输入/输出井虚拟化独占设备,实现共享,即让多个作业共享一台独占设备依赖条件1. 外存(井文件)2. 多道程序设计虚拟实现多道程序技术磁盘缓冲数据流方向输入设备 → 输入井 → CPU → 输出井 →…...

冷雨泉教授团队:新型视觉驱动智能假肢手,拟人化抓握技术突破,助力截肢者重获生活自信
研究背景:日常生活中,健康人依靠手完成对物体的操作。对于手部截肢患者,手部的缺失导致他们难以有效地操作物体,进而影响正常的日常生活。拥有一个能够实现拟人地自然抓取多种日常物体的五指动力假手是手部截肢患者的夙愿…...
CanvasGroup篇
🎯 Unity UI 性能优化终极指南 — CanvasGroup篇 🧩 什么是 CanvasGroup? CanvasGroup 是UGUI的透明控制器,用于整体控制一组UI元素的: 可见性 (alpha)交互性 (interactable)射线检测 (blocksRaycasts) 🎯…...
[Java 基础]银行账户程序
编写一个 Java 控制台应用程序,模拟一个简单的银行账户。该程序应允许用户执行以下操作: 查询账户余额。 账户初始余额设置为 1000.0 元。向账户存入资金。 用户可以输入存款金额,程序应更新账户余额。存款金额必须为正数。从账户提取资金。…...
2025.6.4总结
工作:今天效率比较高,早上回归4个问题,下午找了3个bug,晚上二刷了科目一(贪吃蛇系统),写了四个点,唯一没达标的就是两自动化没完成。美中不足的是电脑上下载不了PC版的番茄工作软件。…...
将音频数据累积到缓冲区,达到阈值时触发处理
实现了音频处理中的 AEC(声学回声消除)和 AES(音频增强)功能,其核心功能是: 数据缓冲管理:将输入的麦克风和扬声器音频数据块累积到缓冲区中块处理机制:当缓冲区填满预设大小&#…...

pikachu靶场通关笔记14 XSS关卡10-XSS之js输出(五种方法渗透)
目录 一、源码分析 1、进入靶场 2、代码审计 二、渗透实战 1、根据提示输入tmac 2、XSS探测 3、注入Payload1 4、注入Payload2 5、注入Payload3 6、注入Payload4 7、注入Payload5 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合&#x…...
5.Promise,async,await概念(1)
Promise 是 JavaScript 原生提供的异步处理机制,而 async 和 await 是基于 Promise 的语法糖,由 JavaScript 语言和其运行时环境(如浏览器、Node.js)支持,用于更清晰地编写异步代码,从而避免回调地狱。 Pr…...

李沐-动手学深度学习:RNN
1.RNN从零开始实现 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l#8.3.4节 #batch_size:每个小批量中子序列样本的数目,num_steps:每个子序列中预定义的时间步数 #loa…...
Windows系统下npm报错node-gyp configure got “gyp ERR“解决方法
感谢原博主,此文参考网址:https://zhuanlan.zhihu.com/p/398279220 确保已经安装node.js (官方网址:https://nodejs.org/zh-cn/download) 首先在命令窗口执行命令安装windows-build-tools: npm install -…...
Elasticsearch中的文档(Document)介绍
在Elasticsearch(ES)中,文档(Document)是最基本的数据单元,类似于关系型数据库中的“行”。它以JSON格式存储,包含多个字段(Field),每个字段可以是不同类型(如文本、数值、日期等)。文档是索引(Index)的组成部分,通过唯一ID标识,并支持动态映射(Dynamic Mappi…...
15个基于场景的 DevOps 面试问题及答案
第一部分:持续集成和部署 (CI/CD) 场景 1:构建中断 “您的 CI 流水线突然出现‘找不到依赖项’的错误。您会如何处理这个问题?” 回答:首先,我会检查是否有新的依赖项被添加到需求文件中,但这些依赖项并未包含在需求文件中。我还会验证构建服务器是否可以访问互联网来下…...