emqx如何做设备在离线监测

EMQX 是一个开源的 MQTT 消息代理(Broker),广泛用于物联网(IoT)设备之间的通信。要实现设备上线和离线的消息通知,可以通过以下几种方式来配置和实现:

1. 使用保留消息(Retained Messages)

EMQX 支持保留消息,可以利用保留消息来通知设备的状态变化。

上线通知

当设备上线时,设备可以发布一条保留消息到特定的主题,例如 device/status/online

PUBLISH device/status/online retain=true payload="device_id"

离线通知

当设备离线时,EMQX 可以自动发布一条保留消息到特定的主题,例如 device/status/offline。这需要在 EMQX 中配置规则引擎或使用插件来实现。

2. 使用规则引擎(Rule Engine)

EMQX 提供了强大的规则引擎,可以根据设备的连接和断开事件触发相应的动作。

配置规则

  1. 创建规则

    • 进入 EMQX 控制台。
    • 导航到 规则引擎 -> 规则
    • 创建一个新的规则,选择 设备连接设备断开 作为触发条件。
  2. 配置动作

    • 在规则中添加一个动作,例如 发布消息
    • 设置目标主题和消息内容,例如 device/status/offlinedevice_id

示例规则

  • 触发条件:设备断开连接。
  • 动作:发布消息到 device/status/offline,消息内容为 device_id

3. 使用 Webhook 插件

EMQX 的 Webhook 插件可以将设备的连接和断开事件发送到指定的 HTTP 服务器。

配置 Webhook

  1. 安装插件

    • 进入 EMQX 控制台。
    • 导航到 插件管理
    • 安装并启用 Webhook 插件。
  2. 配置规则

    • 进入 规则引擎 -> 规则
    • 创建一个新的规则,选择 设备连接设备断开 作为触发条件。
  3. 配置动作

    • 在规则中添加一个动作,选择 Webhook
    • 设置 HTTP 请求的 URL、方法和请求体。

示例规则

  • 触发条件:设备断开连接。
  • 动作:向 http://example.com/device/offline 发送 POST 请求,请求体为 {"device_id": "device_id"}

4. 使用 MQTT 客户端库

在应用程序中使用 MQTT 客户端库来监听设备的连接和断开事件,并手动发送通知消息。

示例代码(Python)

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("$SYS/broker/connection/#")

def on_message(client, userdata, msg):
    if "connected" in msg.topic:
        print(f"Device {msg.payload.decode()} connected")
        client.publish("device/status/online", msg.payload)
    elif "disconnected" in msg.topic:
        print(f"Device {msg.payload.decode()} disconnected")
        client.publish("device/status/offline", msg.payload)

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("localhost", 1883, 60)
client.loop_forever()

在使用 EMQX 实现设备上线和离线的消息通知时,消息的顺序性是一个重要的考虑因素,特别是在需要确保消息处理的可靠性和一致性的情况下。以下是关于消息顺序性的详细解释和建议:

消息顺序性概述

  1. MQTT 协议保证

    • QoS 0:不保证消息的顺序,可能会丢失或重复。
    • QoS 1:保证消息至少被接收一次,但不保证顺序。
    • QoS 2:保证消息恰好被接收一次,并且保证顺序。
  2. EMQX 特性

    • EMQX 本身支持 QoS 0、QoS 1 和 QoS 2,可以根据需求选择合适的 QoS 级别。
    • EMQX 的规则引擎和 Webhook 插件在处理消息时也会遵循 MQTT 协议的 QoS 规则。

设备上线和离线消息的通知顺序性

使用 QoS 2

如果你需要确保设备上线和离线的消息严格按顺序到达订阅者,可以使用 QoS 2。QoS 2 提供了最高级别的消息保证,包括消息的顺序性。

示例配置

  1. 设备上线通知

    • 设备上线时发布消息到 device/status/online,设置 QoS 为 2。
      PUBLISH device/status/online qos=2 payload="device_id"
      
  2. 设备离线通知

    • 使用 EMQX 的规则引擎或 Webhook 插件,在设备离线时发布消息到 device/status/offline,设置 QoS 为 2。

使用规则引擎配置 QoS 2

  1. 创建规则

    • 进入 EMQX 控制台。
    • 导航到 规则引擎 -> 规则
    • 创建一个新的规则,选择 设备连接设备断开 作为触发条件。
  2. 配置动作

    • 在规则中添加一个动作,例如 发布消息
    • 设置目标主题和消息内容,例如 device/status/offlinedevice_id
    • 设置 QoS 为 2。

示例规则

  • 触发条件:设备断开连接。
  • 动作:发布消息到 device/status/offline,消息内容为 device_id,QoS 为 2。

注意事项

  1. 性能影响

    • 使用 QoS 2 会增加网络开销和处理延迟,因为需要更多的握手和确认步骤。
  2. 系统资源

    • 高 QoS 级别会占用更多的系统资源,包括内存和 CPU。确保你的 EMQX 服务器有足够的资源来处理这些消息。
  3. 应用场景

    • 如果顺序性非常重要,例如在某些关键业务流程中,可以使用 QoS 2。
    • 如果顺序性不是绝对必要,可以使用 QoS 1 或 QoS 0 来提高性能和减少资源消耗。

总结

在 EMQX 中实现设备上线和离线的消息通知时,可以通过选择合适的 QoS 级别来控制消息的顺序性。QoS 2 提供了最高级别的消息保证,包括顺序性,但会增加一些性能开销。根据具体的应用场景和需求,选择合适的 QoS 级别来平衡性能和可靠性。


在 EMQX 中对设备连接进行权限验证是确保系统安全的重要步骤。EMQX 提供了多种方式来实现客户端连接的权限验证,包括基于用户名和密码的验证、基于客户端证书的验证以及自定义的认证插件。以下是详细的配置步骤和示例:

1. 基于用户名和密码的验证

1.1 配置内置认证

EMQX 内置了一个简单的用户名和密码认证机制,可以通过配置文件或 Web 管理界面来设置。

通过 Web 管理界面配置
  1. 进入 EMQX 控制台

    • 打开浏览器,访问 EMQX 的 Web 管理界面,通常是 http://<your_emqx_host>:18083
  2. 导航到认证管理

    • 登录后,点击左侧菜单中的 认证 -> 认证
  3. 添加认证源

    • 点击 添加认证源 按钮。
    • 选择 内置数据库 或其他认证源类型(如 HTTP APIMySQLPostgreSQL 等)。
  4. 配置认证源

    • 根据所选认证源类型,填写相应的配置信息。
    • 例如,选择 内置数据库 时,可以添加用户和密码。
  5. 启用认证源

    • 确认配置无误后,点击 保存 并启用该认证源。
通过配置文件配置
  1. 编辑配置文件

    • 打开 EMQX 的配置文件 etc/emqx.conf
  2. 启用内置认证

    • 找到 authn 部分,启用内置认证。
      authn {
        default_chain = [
          {mechanism = password_based,
           backend = built_in_database}
        ]
      }
      
  3. 添加用户

    • 使用 emqx_ctl 命令行工具添加用户。
      ./bin/emqx_ctl users add username password
      
  4. 重启 EMQX

    • 保存配置文件并重启 EMQX 服务。
      ./bin/emqx restart
      

1.2 配置 ACL 规则

ACL(访问控制列表)用于定义客户端对主题的访问权限。

通过 Web 管理界面配置
  1. 进入 EMQX 控制台

    • 打开浏览器,访问 EMQX 的 Web 管理界面。
  2. 导航到 ACL 管理

    • 点击左侧菜单中的 认证 -> ACL
  3. 添加 ACL 规则

    • 点击 添加 ACL 规则 按钮。
    • 配置规则,例如允许特定用户发布或订阅特定主题。
通过配置文件配置
  1. 编辑配置文件

    • 打开 EMQX 的配置文件 etc/emqx.conf
  2. 启用 ACL

    • 找到 acl 部分,启用 ACL。
      acl {
        file = etc/acl.conf
      }
      
  3. 配置 ACL 文件

    • 编辑 etc/acl.conf 文件,添加 ACL 规则。
      user username pubsub topic1/topic2
      user username subscribe topic3/topic4
      
  4. 重启 EMQX

    • 保存配置文件并重启 EMQX 服务。
      ./bin/emqx restart
      

2. 基于客户端证书的验证

2.1 配置 TLS/SSL

  1. 生成证书

    • 使用 OpenSSL 生成 CA 证书、服务器证书和客户端证书。
      openssl req -new -x509 -days 365 -nodes -out ca.crt -keyout ca.key
      openssl req -new -keyout server.key -out server.csr
      openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
      openssl req -new -keyout client.key -out client.csr
      openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365
      
  2. 配置 EMQX 使用 TLS/SSL

    • 编辑 etc/emqx.conf 文件。
      listener.ssl.external = 8883
      listener.ssl.external.certfile = etc/certs/server.crt
      listener.ssl.external.keyfile = etc/certs/server.key
      listener.ssl.external.cacertfile = etc/certs/ca.crt
      
  3. 启用客户端证书验证

    • etc/emqx.conf 文件中配置客户端证书验证。
      listener.ssl.external.require_certificate = true
      listener.ssl.external.verify_peer_cert = true
      listener.ssl.external.fail_if_no_peer_cert = true
      
  4. 重启 EMQX

    • 保存配置文件并重启 EMQX 服务。
      ./bin/emqx restart
      

3. 自定义认证插件

如果内置的认证机制无法满足需求,可以开发自定义的认证插件。

3.1 开发自定义插件

  1. 创建插件项目

    • 使用 EMQX 的插件模板创建一个新的插件项目。
      emqx plugin create my_auth_plugin
      
  2. 实现认证逻辑

    • 在插件项目中实现认证逻辑。
    • 例如,使用 HTTP API 进行认证。
      handle_authenticate(#{clientid := ClientId, username := Username, password := Password}, State) ->
          case http_request(Username, Password) of
              {ok, true} ->
                  {ok, State};
              _ ->
                  {error, not_authorized}
          end.
      
  3. 编译和部署插件

    • 编译插件并将其部署到 EMQX 节点。
      make
      cp _build/default/lib/my_auth_plugin.ez /path/to/emqx/plugins/
      
  4. 启用插件

    • 进入 EMQX 控制台,启用插件。
      ./bin/emqx_ctl plugins load my_auth_plugin
      

4. 示例配置

4.1 基于用户名和密码的认证

  1. 配置内置认证

    authn {
      default_chain = [
        {mechanism = password_based,
         backend = built_in_database}
      ]
    }
    
  2. 添加用户

    ./bin/emqx_ctl users add user1 password1
    ./bin/emqx_ctl users add user2 password2
    
  3. 配置 ACL

    acl {
      file = etc/acl.conf
    }
    
  4. 配置 ACL 文件

    user user1 pubsub topic1/topic2
    user user2 subscribe topic3/topic4
    

4.2 基于客户端证书的认证

  1. 配置 TLS/SSL
    listener.ssl.external = 8883
    listener.ssl.external.certfile = etc/certs/server.crt
    listener.ssl.external.keyfile = etc/certs/server.key
    listener.ssl.external.cacertfile = etc/certs/ca.crt
    listener.ssl.external.require_certificate = true
    listener.ssl.external.verify_peer_cert = true
    listener.ssl.external.fail_if_no_peer_cert = true
    

总结

在 EMQX 中对设备连接进行权限验证可以通过多种方式进行配置,包括基于用户名和密码的验证、基于客户端证书的验证以及自定义的认证插件。根据具体的需求和环境选择合适的认证方式,可以有效保障系统的安全性和稳定性。

posted @ 2025-06-06 10:24  好奇成传奇  阅读(412)  评论(0)    收藏  举报