使用 EMQX 接入 MQTT-SN 协议设备

简介: 本文将介绍如何在EMQX MQTT服务器中接入MQTT-SN协议设备,并通过认证及授权保障设备接入安全。

MQTT-SN 全名为 MQTT for Sensor Networks,其目标是为非 TCP/IP 协议栈的嵌入式设备(如 Zigbee、Bluetooth)提供应用层通信标准。MQTT-SN 是一个专为 WSN(Wireless Sensor Networks)网络设计的 Publish/Subscribe 的消息传输协议。

大规模分布式物联网 MQTT 消息服务器 EMQX 除了完整支持 MQTT 协议外,还可以通过网关处理所有非 MQTT 协议的连接、认证和消息收发,并为其提供统一的用户层接口。本文将介绍如何在 EMQX 中接入 MQTT-SN 协议设备,并通过认证及授权保障设备接入安全。

MQTT-SN 的优点是什么?

  • 与 MQTT 协议兼容: MQTT-SN 通信模型完全与 MQTT 相对应,例如发布、订阅、保留会话、遗嘱消息等。统一的模型有利于降低端到端的设计复杂度。
  • 轻量: 为了应对 WSN 网络中有限的传输带宽,协议设计非常精简。例如 PUBLISH 消息中的主题名称被一个短的、两字节长的 Topic ID 取代。
  • 支持休眠: MQTT-SN 协议新增了休眠逻辑,来应对低功耗的场景。例如设备进入到休眠后,所有发给它们的消息都会被缓存在服务器,并在唤醒后传递给它们。

MQTT-SN 常见的部署结构

MQTT-SN 常见的部署结构.png

MQTT-SN Architecture

  1. Client 和 Gateway 部署在同一个局域网中(例如 Zigbee)通过 MQTT-SN 协议进行通信,并且 Gateway 通过以太网和 MQTT 协议将数据上报到云端的 MQTT Broker。
  2. MQTT Broker 与 MQTT-SN Gateway 集成在一起,都部署在云端。Client 通过 UDP 和 MQTT-SN 直接与云端的 MQTT-SN 网关进行通信。
  3. 第三种部署方式与第一种类似,不同的是使用 MQTT-SN 协议与云端的 MQTT-SN 网关进行交互。

相对比而言:

  • 第一种方案是最为典型的 MQTT-SN 部署方案,该方案非常适用于终端无公网通信需求且需要部署网关来统一管理的场景,例如典型的智能家居场景。
  • 第二种方案常见于终端设备都部署在室外,它们通过移动网络例如(NB-IoT) 直接与云端直连,中间无法部署网关来处理设备请求。
  • 第三种部署比较少见,它仅是方案 1、2 的一种折中。仅在服务端仅能提供 MQTT-SN 接入服务时会用到。

因此,MQTT-SN 主要应用于具有短距离、带宽受限、低功耗等特点的应用场景,例如智慧城市、智能家具、水电气表等。

使用 EMQX 接入 MQTT-SN 协议

EMQX 的 MQTT-SN 网关基于 MQTT-SN 1.2 版本实现。MQTT-SN 网关作为一个组件集成在 EMQX,可以允许将其部署在边缘或云端来实现上文提到的第一和第二种部署结构。

启用 MQTT-SN 网关

在 EMQX 5.0 中,可以通过 Dashboard、HTTP-API 或配置文件来启用 MQTT-SN 网关。

例如,开启并配置监听 UDP 1884 端口的 MQTT-SN 网关:

gateway.mqttsn {

  mountpoint = "mqttsn/"

  listeners.udp.default {
    bind = 1884
    max_connections = 10240000
    max_conn_rate = 1000
  }
}

客户端测试

使用 C 语言编写的 MQTT-SN 客户端,来测试发布订阅,例如:

Client ID mqttsn1 连接并订阅主题 t/a

$ ./mqtt-sn-sub -i mqttsn1 -t t/a -p 1884 -d

使用 Client ID 为 mqttsn2 登录到 MQTT-SN 网关,并对 t/a 主题发布消息 Hi, This is mqttsn2

$ ./mqtt-sn-pub -i mqttsn2 -p 1884 -t t/a -m 'Hi, This is mqttsn2' -d

最终,能在 mqtt-sn-sub 端接收到该消息:

mqtt-sn 发布、订阅.png

更多高级功能配置

配置客户端接入认证

由于 MQTT-SN v1.2 协议的连接报文只定义了 Client ID,没有 Username 和 Password 。所以 MQTT-SN 网关目前仅支持 HTTP Server 认证

例如,通过配置文件,为 MQTT-SN 网关添加一个 HTTP 认证:

gateway.mqttsn {
  authentication {
    enable = true
    backend = "http"
    mechanism = "password_based"
    method = "post"
    connect_timeout = "5s"
    enable_pipelining = 100
    url = "<http://127.0.0.1:8080">
    headers {
      "content-type" = "application/json"
    }
    body {
      clientid = "${clientid}"
    }
    pool_size = 8
    request_timeout = "5s"
    ssl.enable = false
  }
}

在该认证方式中,将 Client ID 传递给 HTTP 服务,由 HTTP 服务来决定该客户端是否有接入系统的权限。

配置发布订阅权限

在 EMQX 5.0 中,所有主题的发布订阅权限都在授权(Authorization)中统一配置。例如,允许所有人发布订阅 mqttsn/ 开头的主题:

MQTT 服务器权限配置.png

在 Dashboard 中配置主题发布订阅权限

获取上下线事件

MQTT-SN 网关会将所有设备的上下线事件发布到两个专用的主题:

  • 上线事件主题:$SYS/brokers/<node>/gateway/mqtt-sn/clients/<clientid>/connected
  • 下线事件主题:$SYS/brokers/<node>/gateway/mqtt-sn/clients/<clientid>/disconnected

例如,一条上线事件消息内容为:

{
  "clientid": "abc",
  "username": "undefined",
  "ts": 1660285421750,
  "sockport": 1884,
  "protocol": "mqtt-sn",
  "proto_ver": "1.2",
  "proto_name": "MQTT-SN",
  "keepalive": 10,
  "ipaddress": "127.0.0.1",
  "expiry_interval": 7200000,
  "connected_at": 1660285421750,
  "clean_start": false
}

当然,也可以通过规则引擎中的 $event/client_connected$event/client_disconnected 事件来获取 MQTT-SN 网关的上下线事件,具体可以参考:Event topic available for FROM clause

引用

[1] OASIS Open: MQTT-SN spec v1.2

[2] Urs Hunkeler & Hong Linh Truong: MQTT-S – A Publish/Subscribe Protocol For Wireless Sensor Networks

[3] EMQX 5.0 MQTT-SN Gateway introduction

[4] OASIS Open: MQTT-SN v2.0-wd17.docx

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/connecting-mqtt-sn-devices-using-emqx

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1月前
|
消息中间件 Ubuntu Java
SpringBoot整合MQTT实战:基于EMQX实现双向设备通信
本教程指导在Ubuntu上部署EMQX 5.9.0并集成Spring Boot实现MQTT双向通信,涵盖服务器搭建、客户端配置及生产实践,助您快速构建企业级物联网消息系统。
470 1
|
1月前
|
数据采集 传感器 监控
Modbus 与 MQTT 协议兼容:MyEMS 的泛在能源数据采集技术实现
MyEMS深度融合Modbus与MQTT协议,破解能源数据采集中协议碎片化、网络异构、数据孤岛等难题。通过Modbus接入95%以上工业设备,实现现场数据精准“拉取”;依托MQTT构建高效物联网传输通道,支持多源数据主动“推送”与云端集成。边缘侧采集规整,中心侧汇聚分析,形成统一、可靠、低延迟的数据流。该架构兼具高兼容性、强扩展性与低运维成本,广泛应用于工业园区、商业楼宇及集团型企业,支撑实时监控、AI分析与跨系统融合,打造泛在互联的能源数据底座,助力企业实现全面智慧能源管理。
152 6
|
8月前
|
数据可视化 关系型数据库 MySQL
嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化
通过本文的介绍,我们详细讲解了如何结合嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议,实现数据的采集、传输、存储和可视化。这种架构在物联网项目中非常常见,可以有效地处理和展示实时数据。希望本文能帮助您更好地理解和应用这些技术,构建高效、可靠的数据处理和可视化系统。
446 82
|
4月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
673 0
|
消息中间件 API RocketMQ
消息队列 MQ产品使用合集之设备在国外收不到指令,是什么原因
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
EMQ
|
传感器 人工智能 安全
EMQX 与 MQTT: AI 大模型时代的分布式数据中枢
在以数据为核心的 AI 时代,基于 MQTT 协议的消息服务器 EMQX 能帮助企业更好的利用人工智能和机器学习模型,是智能化系统中核心的数据基础软件。
EMQ
513 124
|
10月前
|
数据采集 传感器 监控
多协议网关BL110钡铼6路RS485转MQTT协议云网关
BL110钡铼6路RS485转MQTT协议云网关是一款高性能、易配置的工业级设备,适用于各种需要远程监控和数据采集的物联网应用场景。通过将传统RS485设备的数据转换为MQTT协议并上传至云平台,实现了设备的远程管理和智能控制,极大地提升了系统的管理效率和响应速度。
269 2
|
12月前
|
网络协议 物联网 网络性能优化
物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
【10月更文挑战第18天】本文介绍了物联网领域中四种主要的通信协议:MQTT、CoAP、RESTful/HTTP和XMPP,分别从其特点、应用场景及优缺点进行了详细对比,并提供了简单的示例代码。适合开发者根据具体需求选择合适的协议。
358 5
|
消息中间件 监控 物联网
MQTT协议对接及RabbitMQ的使用记录
通过合理对接MQTT协议并利用RabbitMQ的强大功能,可以构建一个高效、可靠的消息通信系统。无论是物联网设备间的通信还是微服务架构下的服务间消息传递,MQTT和RabbitMQ的组合都提供了一个强有力的解决方案。在实际应用中,应根据具体需求和环境进行适当的配置和优化,以发挥出这两个技术的最大效能。
823 0
|
网络协议 Java 物联网
MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图
MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图
2116 3