砍材农夫砍材农夫
  • 微信记账小程序
  • java
  • redis
  • mysql
  • 场景类
  • 框架类
  • vuepress搭建
  • hexo搭建
  • 云图
  • llm wiki

    • 基于karpathy
    • gradle
  • 常用工具

    • git
    • gradle
    • Zadig
    • it-tools
    • 开源推荐
    • curl
  • 大前端

    • nodejs
    • npm
    • webpack
    • 微信
    • 正则
    • uniapp
  • java

    • java基础
    • jdk体系
    • jvm
    • spring
    • spring_cloud
    • spring_boot
    • 分库分表
    • zookeeper
  • python

    • python基础
    • python高级
    • python框架
  • 算法

    • 算法
  • 网关

    • spring_cloud_gateway
    • openresty
  • 高可用

    • 秒杀
    • 分布式
    • 缓存一致
  • MQ

    • MQ
    • rabbitMQ
    • rocketMQ
    • kafka
  • 其它

    • 设计模式
    • 领域驱动(ddd)
  • 关系型数据库

    • mysql5.0
    • mysql8.0
  • 非关系型数据库

    • redis
    • mongoDB
  • 分布式/其他

    • ShardingSphere
    • 区块链
  • 向量数据库

    • M3E
    • OPEN AI
  • Jmeter
  • fiddler
  • wireshark
  • AI入门
  • AI大模型
  • AI插件
  • AI集成框架
  • 相关算法
  • AI训练师
  • 量化交易
  • gitee
  • github
  • infoq
  • osc
  • 砍材工具
  • 关于
  • 相关运营
  • docker
  • k8s
  • devops
  • nginx
  • 元宇宙
  • 区块链
  • 物联网
  • linux
  • webrtc
  • web3.0
  • gitee
  • github
  • infoq
  • osc
  • 砍材工具
  • 关于
  • 中考
  • 投资
  • 保险
  • 思
  • 微信记账小程序
  • java
  • redis
  • mysql
  • 场景类
  • 框架类
  • vuepress搭建
  • hexo搭建
  • 云图
  • llm wiki

    • 基于karpathy
    • gradle
  • 常用工具

    • git
    • gradle
    • Zadig
    • it-tools
    • 开源推荐
    • curl
  • 大前端

    • nodejs
    • npm
    • webpack
    • 微信
    • 正则
    • uniapp
  • java

    • java基础
    • jdk体系
    • jvm
    • spring
    • spring_cloud
    • spring_boot
    • 分库分表
    • zookeeper
  • python

    • python基础
    • python高级
    • python框架
  • 算法

    • 算法
  • 网关

    • spring_cloud_gateway
    • openresty
  • 高可用

    • 秒杀
    • 分布式
    • 缓存一致
  • MQ

    • MQ
    • rabbitMQ
    • rocketMQ
    • kafka
  • 其它

    • 设计模式
    • 领域驱动(ddd)
  • 关系型数据库

    • mysql5.0
    • mysql8.0
  • 非关系型数据库

    • redis
    • mongoDB
  • 分布式/其他

    • ShardingSphere
    • 区块链
  • 向量数据库

    • M3E
    • OPEN AI
  • Jmeter
  • fiddler
  • wireshark
  • AI入门
  • AI大模型
  • AI插件
  • AI集成框架
  • 相关算法
  • AI训练师
  • 量化交易
  • gitee
  • github
  • infoq
  • osc
  • 砍材工具
  • 关于
  • 相关运营
  • docker
  • k8s
  • devops
  • nginx
  • 元宇宙
  • 区块链
  • 物联网
  • linux
  • webrtc
  • web3.0
  • gitee
  • github
  • infoq
  • osc
  • 砍材工具
  • 关于
  • 中考
  • 投资
  • 保险
  • 思
  • 首页
    • 开发板介绍
    • micropython环境搭建
    • esp32开发板
    • 面包板
    • 万能表使用
  • 面包板
    • 点灯
  • esp32
    • 点亮开发板led灯
    • 点亮外接led
    • 点亮外接oled文字
    • 红外传感器
    • 红外传感器+olde
    • esp32+面包板
  • MQTT编程

    • MQTT入门

      • 物联网 MQTT
      • 物联网 MQTT和Socket
      • 物联网 MQTT订阅性能优势
      • 物联网 MQTT简易版Broker
      • 物联网 MQTT简易版Broker基于Protobuf
    • HiveMQ

      • hivemq实战入门
    • Protobuf

      • Protobuf入门
      • Protobuf入门+梳理
      • Protobuf实战第一篇
      • Protobuf实战第二篇
      • Protobuf实战第三篇
    • emqx

      • emqx入门
    • mica

      • mica入门
  • 物联网 MQTT订阅性能优势
    • MQTT 订阅 推送
    • Socket 指定 IP 推送
    • 详细对比表
    • 具体场景
      • 控制 100 台智能灯
    • 什么时候用 Socket 直接推送
    • MQTT/订阅模式 设备端带来信息干扰
      • 精细的主题命名与订阅粒度
      • QoS 与消息速率控制
      • 设备端消息过滤与幂等设计

物联网 MQTT订阅性能优势

MQTT 订阅 推送

服务端不需要知道硬件设备的 IP 地址,也不需要关心设备在哪个网络、有没有换 IP。设备主动告诉 Broker “我想订阅某个主题”,之后所有发往该主题的消息,Broker 都会自动转发给它。服务端只管往主题上发指令,设备自己“认领”消息

Socket 指定 IP 推送

服务端必须明确知道设备的 IP 和端口,并且设备往往需要有一个固定或可访问的公网 IP(或通过反向连接、内网穿透辅助)。每次推送都是直接建立 Socket 连接到那个 IP 的设备。服务端必须维护一张“设备 → IP”的映射表,设备位置变了就得更新

详细对比表

维度MQTT 订阅(间接推送)Socket 指定 IP 推送(直接推送)
设备定位设备连接 Broker 即可,IP 可动态变化服务端必须知道设备当前的 IP 和可访问端口
网络要求设备只需能访问 Broker(通常是云或内网固定主机)设备通常需要公网 IP 或服务端与设备在同一内网(或做内网穿透)
服务端复杂度简单:服务端发布消息到主题,不关心设备列表复杂:服务端需维护在线设备 IP 表、处理设备掉线/重连、处理 NAT 穿透
扩展性高:一个主题可被任意数量设备订阅低:每增加一台设备,服务端可能需要修改推送逻辑
防火墙/NAT友好:设备主动发起连接,无需在路由器上开端口困难:设备作为 TCP 服务端监听端口,通常需要端口映射或反向代理
离线消息支持:Broker 可为离线设备缓存消息(QoS 1/2)需自行实现:设备不在线时消息直接丢失或需自行持久化
一对多推送天然支持:发布一条消息,所有订阅者同时收到需循环给每个 IP 建立连接发送,效率低
安全性集中认证:在 Broker 上统一管理设备认证和 TLS分散认证:每个设备需单独处理安全握手(或依赖内网信任)

具体场景

控制 100 台智能灯

  • 使用 MQTT 订阅
每盏灯上电时,连接 MQTT Broker(例如 mqtt.example.com),订阅主题 light/cmd
服务端发送一条消息到主题 light/cmd,内容为 {"state":"off"}
Broker 将这条消息复制 100 份,发送给所有订阅了该主题的灯
完全不需要知道灯的 IP 地址
  • 使用 Socket 直接指定 IP 推送
服务端必须提前知道或动态获取每盏灯的 IP 列表(例如灯主动上报 IP)
当需要关灯时,循环遍历 100 个 IP,对每个 IP 建立 Socket 连接(例如 192.168.1.101:8888),发送 off 命令
如果某一盏灯的 IP 变化了(例如 DHCP 重新分配),推送就会失败
如果灯处在不同子网,服务端可能无法直接连接

什么时候用 Socket 直接推送

极低延迟的点对点通信:例如两个设备在同一局域网内,需要微秒级响应(MQTT 经过 Broker 会多一跳)
不需要主题路由、离线缓存等高级特性:例如一个控制端对单个执行器的私有协议
硬件资源极度受限:跑不起 MQTT 协议栈(但通常也会选择更轻量的 UDP 或 CoAP)

MQTT/订阅模式 设备端带来信息干扰

精细的主题命名与订阅粒度

主题包含设备 ID 或类型:device/light/001/cmd 而不是 light/cmd
通配符使用克制:尽量用 + 而非 #。例如设备只需温度数据,订阅 sensor/+/temperature 而不是 sensor/#

QoS 与消息速率控制

对高频率发布的 topic,在 Broker 端配置消息速率限制(如 EMQX 支持限流)
设备端可根据需求忽略部分消息(例如每 10 秒只处理一次最新值)

设备端消息过滤与幂等设计

设备在回调函数内根据消息 payload 内容二次过滤(如只处理 state=ON 的消息)
使用消息 ID 或时间戳实现幂等,防止重复执行
最近更新: 2026/5/7 16:31
Contributors: jysemel, kcnf, Copilot
Prev
物联网 MQTT和Socket
Next
物联网 MQTT简易版Broker