在先前一系列精心策划的篇章中,我们已深入浅出地剖析了EMQX的安装流程、丰富功能及其独特优势,更详尽地探讨了如何在Java的SpringBoot应用框架中巧妙设计架构、精心编织代码。而今,本文旨在引领您跨越理论至实践的桥梁,聚焦于如何在真实应用场景中迅速部署EMQX以构建高效网关服务,并实现与具体业务逻辑的无缝数据交流与互动,从而加速您的项目落地与价值实现。
前提背景
- 安装好EMQX服务
- 编写好EMQX客户端的SpringBoot项目
- 准备好设备(可以通过MQTTX模拟)
EMQX在实际运用中最需要做什么配置?
在EMQX的实际运用中:
安全认证配置确实是首要考虑的配置之一。
如果使用到Http接口,那么http签名配置也是必不可少的。
需要用到EMQX系统功能,授权配置也是重中之重。
安全认证配置
一机一密
一机一密认证是一种高安全性的设备认证方式,也是物联网常用一种安全认证方式。
一机一密认证是指预先为每个设备烧录其唯一的设备证书(通常包括ProductKey、DeviceName和DeviceSecret)。当设备与物联网平台建立连接时,物联网平台会对其携带的设备证书信息进行认证。这一认证过程确保了设备的唯一性和合法性,防止了非法设备的接入。
优势:
高安全性:由于每个设备都拥有唯一的设备证书,因此可以有效防止非法设备的接入和数据的泄露。
易管理性:物联网平台可以方便地通过设备证书对设备进行管理和控制,降低了管理成本和维护难度。
可扩展性:随着物联网设备的不断增加,一机一密认证方式可以轻松地扩展到新的设备上,无需对原有系统进行大规模改造。
所以EMQX在实际运用中,首要做的配置-安全认证配置
认证配置
EMQX Dashboard 提供了开箱即用的认证与权限管理功能,用户仅通过用户界面,就可以快速实现客户端认证授权机制的配置,无需编写代码或手动编辑配置文件,即可对接各类数据源与认证服务,实现各个级别与各类场景下的安全配置,以更高的开发效率获得更安全的保障。
创建认证
在认证页面下的右上角,点击 创建 按钮,即可进入到创建认证的页面。创建一个认证需要选择一种认证方式,选择完成后需要选择一个存储或获取认证信息的数据源(JWT 认证方式除外),认证数据可以从这些数据源包括数据库或 HTTP 服务中获取,最后再配置连接到该数据源的连接信息即可。
认证方式:Password-Based,使用客户端 ID 或用户名加密码的认证方式;
数据源选择:redis
选择加密方式及加盐方式:加密方式md5 ,加盐方式prefix
初始化数据到redis:
HMSET “mqtt_user:username” “password_hash” “66ace8890090c2a50e729318d45fe53b” “salt” “abc”
验证
http签名配置
创建API秘钥
记录秘钥
appId: *************
appSecret: *************
授权配置
以开通EMQX系统消息为例。
在 EMQX Dashboard 页面,点击左侧导航目录的 访问控制 -> 授权 进入授权页面。
EMQX 已默认配置了基于文件的授权检查器。您可点击 File 数据源对应的操作栏下的 设置 按钮查看或更改 ACL 文件中配置的授权规则。
在 授权页面,单击创建,选择数据源为 File,点击下一步,进入配置参数页签:
{allow, {user, "clientdevice"}, subscribe, ["$SYS/#"]}.
clientdevice:客户端名字
日志与监控配置
日志配置:EMQX的日志系统非常灵活,可以配置日志级别、日志文件路径、日志滚动策略等。在etc/log.conf文件中,也可以在EMQX Dashboard 页面配置。
监控配置:EMQX提供了丰富的监控指标,如连接数、消息吞吐量、系统负载等。通过配置监控插件(如emqx_management),可以将这些指标暴露给外部监控系统(如Prometheus)进行实时监控和告警。
Redis初始化密码账号配置
一机一密
username: emqx-client
password: a123456
prefix: xmhxxx
密码加密方式:
前缀加密码生成字符串,并通过MD5加密
//加密方式
public String sign(String prefix, String password){
byte[] bytes = SignUtil.encryptMD5(prefix+password);
retrun SignUtil.byte2hex(bytes);
}
public class SignUtil {
public static byte[] encryptMD5(String data) throws IOException {
return encryptMD5(data.getBytes("UTF-8"));
}
public static String byte2hex(byte[] bytes) {
StringBuilder sign = new StringBuilder();
for(int i = 0; i < bytes.length; ++i) {
String hex = Integer.toHexString(bytes[i] & 255);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex);
}
return sign.toString();
}
}
执行Redis指令:
HMSET “mqtt_user:emqx-client” “password_hash” “8edc9f10b9618f65aebb3f529af93bbd” “salt” “xmhzzz”
HMSET “mqtt_user:8445211” “password_hash” “8edc9f10b9618f65aebb3f529af93bbd” “salt” “xmhzzz”
SpringBoot项目( emqx-example-service)
源码地址,gitee拉取代码
EMQX配置信息
application-dev.yml
emqx:
sdk:
enable: true
host: 127.0.0.1
tcpPort: 1883
httpPort: 18083
username: emqx-client
password: a123456
appId: 0c94e0423b409483
appSecret: e379f64e96d383ced430804512c3e7f1
ssl: false
sysSubscribeTopics:
- sys/+/+/thing/event/property/post
SpringBoot多环境启动配置
因为我们连接EMQX配置信息写在application-dev.yml中,需要在启动SpringBoot项目时候配置dev环境。
idea可以通过下面方式配置:
也可以application.yml配置环境信息
spring:
profiles:
active: dev
如果是jar包启动可以通过启动参数配置
java -jar emqx-example-service-1.0.0-SNAPSHOT.jar -Dspring.profiles.active=dev
项目启动
SpringBoot启动成功
连接EMQX成功
订阅topic成功
MQTTX模拟设备和服务器进行交互
设备连接
点击连接按钮,建立连接
设备成功连接EMQX
服务端接收到设备上线系统消息
SysMqttListener topic[$SYS/brokers/emqx@127.0.0.1/clients/SMART:8445211/connected] message[{“username”:“8445211”,“ts”:1721373363001,“sockport”:1883,“protocol”:“mqtt”,“proto_ver”:5,“proto_name”:“MQTT”,“keepalive”:60,“ipaddress”:“127.0.0.1”,“expiry_interval”:0,“connected_at”:1721373363001,“clientid”:“SMART:8445211”,“clean_start”:true}]
设备发送消息
服务端接收到消息:
topic[sys/SMART/8445211/thing/event/property/post]
message[{“id”:1716799607917,“params”:{“iccid”:142424,“temp”:“12”,“door”:1,“light”:20,“signal”:100,“lock”:0},“version”:“1.0”,“method”:“thing.event.property.post”}]
设备订阅topic
设备订阅topic【sys/SMART/8445211/thing/service/property/set】
服务端下发消息
设备接收到消息
设备断开连接
点击断开连接按钮,设备断开EMQX连接
EMQX发生设备断开连接的系统消,此时服务端将接收到设备断开消息,感知到设备下线。
topic[$SYS/brokers/emqx@127.0.0.1/clients/SMART:8445211/disconnected] message[{“username”:“8445211”,“ts”:1721375080342,“sockport”:1883,“reason”:“normal”,“protocol”:“mqtt”,“proto_ver”:5,“proto_name”:“MQTT”,“ipaddress”:“127.0.0.1”,“disconnected_at”:1721375080342,“connected_at”:1721373363001,“clientid”:“SMART:8445211”}]
其它
源码地址(https://gitee.com/xmhzzz/emqx-practice)
关注公众号【 java程序猿技术】获取EMQX实践系列文章