【EMQX实践】EMQX 配置及运用

在先前一系列精心策划的篇章中,我们已深入浅出地剖析了EMQX的安装流程、丰富功能及其独特优势,更详尽地探讨了如何在Java的SpringBoot应用框架中巧妙设计架构、精心编织代码。而今,本文旨在引领您跨越理论至实践的桥梁,聚焦于如何在真实应用场景中迅速部署EMQX以构建高效网关服务,并实现与具体业务逻辑的无缝数据交流与互动,从而加速您的项目落地与价值实现。

前提背景

  • 安装好EMQX服务
  • 编写好EMQX客户端的SpringBoot项目
  • 准备好设备(可以通过MQTTX模拟)

EMQX在实际运用中最需要做什么配置?

在EMQX的实际运用中:
安全认证配置确实是首要考虑的配置之一。
如果使用到Http接口,那么http签名配置也是必不可少的。
需要用到EMQX系统功能,授权配置也是重中之重。

安全认证配置

一机一密

一机一密认证是一种高安全性的设备认证方式,也是物联网常用一种安全认证方式。
一机一密认证是指预先为每个设备烧录其唯一的设备证书(通常包括ProductKey、DeviceName和DeviceSecret)。当设备与物联网平台建立连接时,物联网平台会对其携带的设备证书信息进行认证。这一认证过程确保了设备的唯一性和合法性,防止了非法设备的接入。
优势
高安全性:由于每个设备都拥有唯一的设备证书,因此可以有效防止非法设备的接入和数据的泄露。
易管理性:物联网平台可以方便地通过设备证书对设备进行管理和控制,降低了管理成本和维护难度。
可扩展性:随着物联网设备的不断增加,一机一密认证方式可以轻松地扩展到新的设备上,无需对原有系统进行大规模改造。
所以EMQX在实际运用中,首要做的配置-安全认证配置

认证配置

EMQX Dashboard 提供了开箱即用的认证与权限管理功能,用户仅通过用户界面,就可以快速实现客户端认证授权机制的配置,无需编写代码或手动编辑配置文件,即可对接各类数据源与认证服务,实现各个级别与各类场景下的安全配置,以更高的开发效率获得更安全的保障。

创建认证

在认证页面下的右上角,点击 创建 按钮,即可进入到创建认证的页面。创建一个认证需要选择一种认证方式,选择完成后需要选择一个存储或获取认证信息的数据源(JWT 认证方式除外),认证数据可以从这些数据源包括数据库或 HTTP 服务中获取,最后再配置连接到该数据源的连接信息即可。
认证方式:Password-Based,使用客户端 ID 或用户名加密码的认证方式;
image.png
数据源选择:redis
image.png
选择加密方式及加盐方式:加密方式md5 ,加盐方式prefix
image.png
初始化数据到redis:
HMSET “mqtt_user:username” “password_hash” “66ace8890090c2a50e729318d45fe53b” “salt” “abc”

验证

image.png

http签名配置

创建API秘钥

image.png
image.png

记录秘钥

appId: *************
appSecret: *************

授权配置

以开通EMQX系统消息为例。
在 EMQX Dashboard 页面,点击左侧导航目录的 访问控制 -> 授权 进入授权页面。
EMQX 已默认配置了基于文件的授权检查器。您可点击 File 数据源对应的操作栏下的 设置 按钮查看或更改 ACL 文件中配置的授权规则。
在 授权页面,单击创建,选择数据源为 File,点击下一步,进入配置参数页签:
{allow, {user, "clientdevice"}, subscribe, ["$SYS/#"]}.
clientdevice:客户端名字
image.png

image.png

日志与监控配置

日志配置: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拉取代码
image.png

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可以通过下面方式配置:
image.png
也可以application.yml配置环境信息

spring: 
  profiles:
    active: dev

如果是jar包启动可以通过启动参数配置
java -jar emqx-example-service-1.0.0-SNAPSHOT.jar -Dspring.profiles.active=dev

项目启动

image.png
SpringBoot启动成功
连接EMQX成功
订阅topic成功
image.png

MQTTX模拟设备和服务器进行交互

image.png

设备连接

点击连接按钮,建立连接
image.png
设备成功连接EMQX
image.png
服务端接收到设备上线系统消息
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}]

设备发送消息

image.png
服务端接收到消息:
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】
image.png
服务端下发消息
image.png
设备接收到消息
image.png

设备断开连接

点击断开连接按钮,设备断开EMQX连接
image.pngEMQX发生设备断开连接的系统消,此时服务端将接收到设备断开消息,感知到设备下线。
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实践系列文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端马农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值