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 提供了强大的规则引擎,可以根据设备的连接和断开事件触发相应的动作。
配置规则
-
创建规则:
- 进入 EMQX 控制台。
- 导航到
规则引擎->规则。 - 创建一个新的规则,选择
设备连接或设备断开作为触发条件。
-
配置动作:
- 在规则中添加一个动作,例如
发布消息。 - 设置目标主题和消息内容,例如
device/status/offline和device_id。
- 在规则中添加一个动作,例如
示例规则
- 触发条件:设备断开连接。
- 动作:发布消息到
device/status/offline,消息内容为device_id。
3. 使用 Webhook 插件
EMQX 的 Webhook 插件可以将设备的连接和断开事件发送到指定的 HTTP 服务器。
配置 Webhook
-
安装插件:
- 进入 EMQX 控制台。
- 导航到
插件管理。 - 安装并启用
Webhook插件。
-
配置规则:
- 进入
规则引擎->规则。 - 创建一个新的规则,选择
设备连接或设备断开作为触发条件。
- 进入
-
配置动作:
- 在规则中添加一个动作,选择
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 实现设备上线和离线的消息通知时,消息的顺序性是一个重要的考虑因素,特别是在需要确保消息处理的可靠性和一致性的情况下。以下是关于消息顺序性的详细解释和建议:
消息顺序性概述
-
MQTT 协议保证:
- QoS 0:不保证消息的顺序,可能会丢失或重复。
- QoS 1:保证消息至少被接收一次,但不保证顺序。
- QoS 2:保证消息恰好被接收一次,并且保证顺序。
-
EMQX 特性:
- EMQX 本身支持 QoS 0、QoS 1 和 QoS 2,可以根据需求选择合适的 QoS 级别。
- EMQX 的规则引擎和 Webhook 插件在处理消息时也会遵循 MQTT 协议的 QoS 规则。
设备上线和离线消息的通知顺序性
使用 QoS 2
如果你需要确保设备上线和离线的消息严格按顺序到达订阅者,可以使用 QoS 2。QoS 2 提供了最高级别的消息保证,包括消息的顺序性。
示例配置
-
设备上线通知:
- 设备上线时发布消息到
device/status/online,设置 QoS 为 2。PUBLISH device/status/online qos=2 payload="device_id"
- 设备上线时发布消息到
-
设备离线通知:
- 使用 EMQX 的规则引擎或 Webhook 插件,在设备离线时发布消息到
device/status/offline,设置 QoS 为 2。
- 使用 EMQX 的规则引擎或 Webhook 插件,在设备离线时发布消息到
使用规则引擎配置 QoS 2
-
创建规则:
- 进入 EMQX 控制台。
- 导航到
规则引擎->规则。 - 创建一个新的规则,选择
设备连接或设备断开作为触发条件。
-
配置动作:
- 在规则中添加一个动作,例如
发布消息。 - 设置目标主题和消息内容,例如
device/status/offline和device_id。 - 设置 QoS 为 2。
- 在规则中添加一个动作,例如
示例规则
- 触发条件:设备断开连接。
- 动作:发布消息到
device/status/offline,消息内容为device_id,QoS 为 2。
注意事项
-
性能影响:
- 使用 QoS 2 会增加网络开销和处理延迟,因为需要更多的握手和确认步骤。
-
系统资源:
- 高 QoS 级别会占用更多的系统资源,包括内存和 CPU。确保你的 EMQX 服务器有足够的资源来处理这些消息。
-
应用场景:
- 如果顺序性非常重要,例如在某些关键业务流程中,可以使用 QoS 2。
- 如果顺序性不是绝对必要,可以使用 QoS 1 或 QoS 0 来提高性能和减少资源消耗。
总结
在 EMQX 中实现设备上线和离线的消息通知时,可以通过选择合适的 QoS 级别来控制消息的顺序性。QoS 2 提供了最高级别的消息保证,包括顺序性,但会增加一些性能开销。根据具体的应用场景和需求,选择合适的 QoS 级别来平衡性能和可靠性。
在 EMQX 中对设备连接进行权限验证是确保系统安全的重要步骤。EMQX 提供了多种方式来实现客户端连接的权限验证,包括基于用户名和密码的验证、基于客户端证书的验证以及自定义的认证插件。以下是详细的配置步骤和示例:
1. 基于用户名和密码的验证
1.1 配置内置认证
EMQX 内置了一个简单的用户名和密码认证机制,可以通过配置文件或 Web 管理界面来设置。
通过 Web 管理界面配置
-
进入 EMQX 控制台:
- 打开浏览器,访问 EMQX 的 Web 管理界面,通常是
http://<your_emqx_host>:18083。
- 打开浏览器,访问 EMQX 的 Web 管理界面,通常是
-
导航到认证管理:
- 登录后,点击左侧菜单中的
认证->认证。
- 登录后,点击左侧菜单中的
-
添加认证源:
- 点击
添加认证源按钮。 - 选择
内置数据库或其他认证源类型(如HTTP API、MySQL、PostgreSQL等)。
- 点击
-
配置认证源:
- 根据所选认证源类型,填写相应的配置信息。
- 例如,选择
内置数据库时,可以添加用户和密码。
-
启用认证源:
- 确认配置无误后,点击
保存并启用该认证源。
- 确认配置无误后,点击
通过配置文件配置
-
编辑配置文件:
- 打开 EMQX 的配置文件
etc/emqx.conf。
- 打开 EMQX 的配置文件
-
启用内置认证:
- 找到
authn部分,启用内置认证。authn { default_chain = [ {mechanism = password_based, backend = built_in_database} ] }
- 找到
-
添加用户:
- 使用
emqx_ctl命令行工具添加用户。./bin/emqx_ctl users add username password
- 使用
-
重启 EMQX:
- 保存配置文件并重启 EMQX 服务。
./bin/emqx restart
- 保存配置文件并重启 EMQX 服务。
1.2 配置 ACL 规则
ACL(访问控制列表)用于定义客户端对主题的访问权限。
通过 Web 管理界面配置
-
进入 EMQX 控制台:
- 打开浏览器,访问 EMQX 的 Web 管理界面。
-
导航到 ACL 管理:
- 点击左侧菜单中的
认证->ACL。
- 点击左侧菜单中的
-
添加 ACL 规则:
- 点击
添加 ACL 规则按钮。 - 配置规则,例如允许特定用户发布或订阅特定主题。
- 点击
通过配置文件配置
-
编辑配置文件:
- 打开 EMQX 的配置文件
etc/emqx.conf。
- 打开 EMQX 的配置文件
-
启用 ACL:
- 找到
acl部分,启用 ACL。acl { file = etc/acl.conf }
- 找到
-
配置 ACL 文件:
- 编辑
etc/acl.conf文件,添加 ACL 规则。user username pubsub topic1/topic2 user username subscribe topic3/topic4
- 编辑
-
重启 EMQX:
- 保存配置文件并重启 EMQX 服务。
./bin/emqx restart
- 保存配置文件并重启 EMQX 服务。
2. 基于客户端证书的验证
2.1 配置 TLS/SSL
-
生成证书:
- 使用 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
- 使用 OpenSSL 生成 CA 证书、服务器证书和客户端证书。
-
配置 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
- 编辑
-
启用客户端证书验证:
- 在
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
- 在
-
重启 EMQX:
- 保存配置文件并重启 EMQX 服务。
./bin/emqx restart
- 保存配置文件并重启 EMQX 服务。
3. 自定义认证插件
如果内置的认证机制无法满足需求,可以开发自定义的认证插件。
3.1 开发自定义插件
-
创建插件项目:
- 使用 EMQX 的插件模板创建一个新的插件项目。
emqx plugin create my_auth_plugin
- 使用 EMQX 的插件模板创建一个新的插件项目。
-
实现认证逻辑:
- 在插件项目中实现认证逻辑。
- 例如,使用 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.
-
编译和部署插件:
- 编译插件并将其部署到 EMQX 节点。
make cp _build/default/lib/my_auth_plugin.ez /path/to/emqx/plugins/
- 编译插件并将其部署到 EMQX 节点。
-
启用插件:
- 进入 EMQX 控制台,启用插件。
./bin/emqx_ctl plugins load my_auth_plugin
- 进入 EMQX 控制台,启用插件。
4. 示例配置
4.1 基于用户名和密码的认证
-
配置内置认证:
authn { default_chain = [ {mechanism = password_based, backend = built_in_database} ] } -
添加用户:
./bin/emqx_ctl users add user1 password1 ./bin/emqx_ctl users add user2 password2 -
配置 ACL:
acl { file = etc/acl.conf } -
配置 ACL 文件:
user user1 pubsub topic1/topic2 user user2 subscribe topic3/topic4
4.2 基于客户端证书的认证
- 配置 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 中对设备连接进行权限验证可以通过多种方式进行配置,包括基于用户名和密码的验证、基于客户端证书的验证以及自定义的认证插件。根据具体的需求和环境选择合适的认证方式,可以有效保障系统的安全性和稳定性。

浙公网安备 33010602011771号