MQTT-SN 协议网关

简介

MQTT-SN 网关基于 MQTT-SN v1.2MQTT-SN 协议网关 - 图1 (opens new window) 版本实现。

快速开始

EMQX 5.0 中,可以通过 Dashboard 配置并启用 MQTT-SN 网关。

也可以通过 HTTP API 或 emqx.conf 来启用,例如:

  1. curl -X 'PUT' 'http://127.0.0.1:18083/api/v5/gateway/mqttsn' \
  2. -u <your-application-key>:<your-security-key> \
  3. -H 'Content-Type: application/json' \
  4. -d '{
  5. "name": "mqttsn",
  6. "enable": true,
  7. "gateway_id": 1,
  8. "mountpoint": "mqttsn/",
  9. "listeners": [
  10. {
  11. "type": "udp",
  12. "bind": "1884",
  13. "name": "default",
  14. "max_conn_rate": 1000,
  15. "max_connections": 1024000
  16. }
  17. ]
  18. }'
  1. gateway.mqttsn {
  2. mountpoint = "mqtt/sn"
  3. gateway_id = 1
  4. broadcast = true
  5. enable_qos3 = true
  6. listeners.udp.default {
  7. bind = 1884
  8. max_connections = 10240000
  9. max_conn_rate = 1000
  10. }
  11. }

提示

注:通过配置文件进行配置网关,需要在每个节点中进行配置;通过 Dashboard 或者 HTTP API 管理则会在整个集群中生效。

MQTT-SN 网关支持 UDP, DTLS 类型的监听器,其完整可配置的参数列表参考:网关配置 - 监听器

认证

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

其客户端信息生成规则如下:

  • Client ID:为 CONNECT 报文中的 Client ID 字段。
  • Username:默认为空
  • Password:默认为空

例如,通过 HTTP API 或 emqx.conf 为 MQTT-SN 网关创建一个 HTTP 认证:

  1. curl -X 'POST' 'http://127.0.0.1:18083/api/v5/gateway/mqttsn/authentication' \
  2. -u <your-application-key>:<your-security-key> \
  3. -H 'Content-Type: application/json' \
  4. -d '{
  5. "method": "post",
  6. "url": "http://127.0.0.1:8080",
  7. "headers": {
  8. "content-type": "application/json"
  9. },
  10. "body": {
  11. "clientid": "${clientid}"
  12. },
  13. "pool_size": 8,
  14. "connect_timeout": "5s",
  15. "request_timeout": "5s",
  16. "enable_pipelining": 100,
  17. "ssl": {
  18. "enable": false,
  19. "verify": "verify_none"
  20. },
  21. "backend": "http",
  22. "mechanism": "password_based",
  23. "enable": true
  24. }'
  1. gateway.mqttsn {
  2. authentication {
  3. enable = true
  4. backend = "http"
  5. mechanism = "password_based"
  6. method = "post"
  7. connect_timeout = "5s"
  8. enable_pipelining = 100
  9. url = "http://127.0.0.1:8080"
  10. headers {
  11. "content-type" = "application/json"
  12. }
  13. body {
  14. clientid = "${clientid}"
  15. }
  16. pool_size = 8
  17. request_timeout = "5s"
  18. ssl.enable = false
  19. }
  20. }

发布订阅

MQTT-SN 协议已经定了发布/订阅的行为,MQTT-SN 网关未对其进行额外的定义,例如:

  • MQTT-SN 协议的 PUBLISH 报文,作为消息发布,其主题和 QoS 都由该报文指定。
  • MQTT-SN 协议的 SUBSCRIBE 报文,作为订阅操作,其主题和 QoS 都由该报文指定。
  • MQTT-SN 协议的 UNSUBSCRIBE 报文,作为取消订阅操作,其主题由该报文指定。

网关内无独立的发布订阅的权限控制,其对主题的权限控制需要统一在 授权(Authorization) 中管理。

用户层接口

客户端库