# iot-mqtt-demo **Repository Path**: wugemen/iot-mqtt-demo ## Basic Information - **Project Name**: iot-mqtt-demo - **Description**: 对接etung 联网宝 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2021-12-06 - **Last Updated**: 2025-08-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: mqtt, Netty, WebSocket ## README # SpringBoot获取MQTT数据 ------ #### 技术栈 springboot + mqtt + mybatis + websocket #### 说明 > 本项目主要获取MQTT数据,并使用Websock推送实时数据到前端VUE项目中,同时存储数据到数据库中 > 本项目mqtt 用户认证采用emq的http认证插件,请在emq配置文件/etc/plugins/emq_auth_http.conf中配置,配置信息如下: > > ```ba > auth.http.auth_req = http://127.0.0.1:8989/etung_iot/mqtt/auth > > auth.http.super_req = http://127.0.0.1:8989/etung_iot/mqtt/superuser > > auth.http.acl_req = http://127.0.0.1:8989/etung_iot/mqtt/acl > ``` > > 详细认证过程在etung-iot-demo目录中MqttController模块。 > > **http认证是其中一种方式,其他认证方式参见文档**https://docs.emqx.cn/broker/v4.2/getting-started/start.html > 开发环境采用idea,java8 #### 目录结构 ------ ```b |--/etung-iot-demo #项目的主要入口 | |--/com.etung.iot.demo.config #mqtt配置等 | |--/com.etung.iot.demo.controller #api请求接口 | |--/com.etung.iot.demo.handler #mqtt 各类型topic处理函数 | |--/com.etung.iot.demo.mqtt #mqtt客户端,连接,订阅,发布 | |--/com.etung.iot.demo.storage #存储类型,周期存储,波动存储,条件存储,变量间条件触发存储 ``` #### **MQTT 认证过程** *** 1、PLC网关发送clientid、username、password 连接EMQ服务器,EMQ在开启http认证的情况下,根据配置文件中指定auth.http.auth_req的地址,调用本项目中的**/etung_iot/mqtt/auth**接口,进行账号密码认证,认证过程如下: ```ba input: productKey, deviceName, deviceSecret output: clientId, username, password clientId = productKey + timestamp username = deviceName key = deviceSecret password = MD5((clientId + uname) ^ key) ``` **clientid格式如下**(productKey|timestmap,signmethod): ​ YCspp0b9|timestamp=1616136806053,signmethod=md5 **username就是deviceName,同时是网关IMEI号** 认证过程从clientid中获取productKey,并根据productKey从数据库中找出对应的deviceSecret,通过MD5((clientId + deviceName) ^ deviceSecret)和输入的password进行比较,来判断是否认证通过 2、如果不适用http认证过程,采用mysql,redis等,请根据productKey,deviceName,deviceSecret计算好加密密码,存储在数据库中,EMQ开启数据库认证方式。 #### Topic配置及数据格式 *** Topic定义在com.etung.iot.demo.configs.TopicConfig类中 ```java //实时数据上传topic public static final String REAL_DATA_TOPIC = "/dtu/+/+/data"; //plc状态上传topic public static final String PLC_STATUS_TOPIC = "/dtu/+/+/plcStatus"; //网关信息上传topic public static final String COLLECTOR_INFO_TOPIC = "/dtu/+/+/collectorInfo"; //报警信息上传topic public static final String ALARM_INFO_TOPIC = "/dtu/+/+/alarmInfo"; //控制变量下发设备端topic public static final String VARIANT_CONTROL_TOPIC = "/dtu/+/+/control"; //控制变量结果topic public static final String VARIANT_REPLY_TOPIC = "/dtu/+/+/controlReply"; //远程下载topic public static final String DOWNLOAD_TOPIC = "/dtu/+/+/download"; //远程下载回复topic public static final String DOWNLOAD_REPLY_TOPIC = "/dtu/+/+/downloadReply"; //远程更新topic public static final String REMOTE_UPDATE_TOPIC = "/dtu/+/+/ota/upgrade"; //远程更新结果topic public static final String REMOTE_UPDATE_REPLY_TOPIC = "/dtu/+/+/ota/upgradeReply"; //时间校准topic public static final String TIME_SYNS_TOPIC = "/dtu/+/+/time"; //系统级topic(box断开连接和上线连接提醒) public static final String SYS_TOPIC = "$SYS/brokers/+/clients/#"; ``` 网关上报数据格式如下: ```json #网关信息上报格式 { "version":"1.0", "imei":"240305002000001", "phonenumber":"13312345678", "quality":"80", "modifyTime":"1592532287" "deviceName":"xxxx" } #PLC状态信息上报格式 { "imei":"240305002000001", "time":1595321297975, "30000":1, "30001":1 } #实时数据上报格式 { "imei":"240305002000001", "time":1595321297975, "1":123, "2":456 } #报警信息上报格式(0:解除报警,1:报警) { "imei":"240305002000001", "time":1595321297975, "1":1, "2":0 } #变量控制下发格式 { "variants":[ { "id":1, "value":"9.9" }, { "id":2, "value":"true" } ] } #变量控制返回格式 { "result":1 } ``` #### 接口功能定义 *** **接口文档的Swagger接口请访问http://127.0.0.1:8989/etung_iot/doc.html 账号密码:admin/admin** 1、 **/etung_iot/demo/pushConfig** 此接口由工程配置软件在下载配置至BOX时触发,把当前BOX各种配置信息推送至该接口,并进行存储 2、**/etung_iot/demo/genAccessInfo** 此接口由工程配置软件在下载配置至BOX时触发,调用该接口生成productKey和deviceSecret,并返回mqtt的信息和topic信息 3、 **/etung_iot/demo/variantControl** 此接口由WEB端项目调用,控制变量的值,通过MQTT发布并下发至网关 4、 **/etung_iot/demo/variantDataList** 此接口由WEB端项目调用,获取各个变量的详细信息 5、**/etung_iot/mqtt/auth** 此接口由EMQ服务器调用,主要对网关的mqtt连接进行认证 6、**/etung_iot/mqtt/alc** 此接口由EMQ服务器调用,主要是认证网关对各个topic订阅和发布的权限,用户根据自己实际需求设计,demo返回所有发布订阅权限 7、**/etung_iot/mqtt/superuser** 此接口由EMQ服务器调用,判断当前网关接入是否是super账号,认证通过,则跳过alc鉴权,默认拥有所有topic的发布订阅权限 #### 完成功能 - [x] 注册、登录 -- 完成 - [x] token权限认证 -- 完成 - [x] mqtt数据订阅与发布、存储 -- 完成 - [x] WebSocket 推送mqtt订阅数据 --完成 #### 运行项目 *** 1、安装JDK8,并配置环境变量 2、使用Maven打jar包,在demo根目录下执行clean在执行install,jar包生成在子模块etung-iot-demo/target/目录下 3、执行java -jar etung-iot-demo-0.0.1-SNAPSHOT.jar命令