物联网实战|Spring Boot MQTT平台 |emqx broker实战

物联网实战|Spring Boot MQTT平台 |emqx broker实战

📑 目录

  1. 物联网实战|Spring Boot MQTT平台 |emqx broker实战

1.1 emqx官网

1.2 docker部署emqx

1.2.1 前期准备和权限开通

1.2.2 docker构建emqx broker应用

1.3 spring-boot接入emqx broker

1.3.1 pom依赖

1.3.2 源码

1.3.3 客户端注册部分代码

1.3.4 客户端注册信息

1.3.5 订阅部分代码

1.3.6 emqx 模拟下发

1.3.7 操作

EMQX 是一款「无限连接,任意集成,随处运行」的大规模分布式物联网接入平台 基于版本6.2.2

emqx官网

https://docs.emqx.com/zh/emqx/latest/

docker部署emqx

其中18083 为网页访问端口 (http://127.0.0.1:28084/#/dashboard/overview)

  • 账号

默认为 admin/public

前期准备和权限开通

bash

复制代码
mkdir -p /data/emqx/
chmod -R 777 /data/

docker构建emqx broker应用

bash

复制代码
  docker run -d   \
  --name emqx   \
  --restart always   \
  -p 1883:1883   \
  -p 8083:8083   \
  -p 8084:8084   \
  -p 8883:8883   \
  -p 28084:18083  \
  -p 18085:18085   \
  -v /data/emqx/data:/opt/emqx/data   \
  -v /data/emqx/log:/opt/emqx/log   \
  -e EMQX_COPY_CONF=true   \
  emqx/emqx:latest

spring-boot接入emqx broker

pom依赖

xml

复制代码
<class="tk-tag">dependencies>
    <!-- HiveMQ MQTT5 客户端(同时兼容 MQTT3.1.1) -->
    <class="tk-tag">dependency>
        <class="tk-tag">groupId>com.hivemq</class="tk-tag">groupId>
        <class="tk-tag">artifactId>hivemq-mqtt-client</class="tk-tag">artifactId>
        <class="tk-tag">version>1.3.15</class="tk-tag">version>
    </class="tk-tag">dependency>
</class="tk-tag">dependencies>

<class="tk-tag">dependencyManagement>
    <class="tk-tag">dependencies>
        <!-- Spring Boot Starter -->
        <class="tk-tag">dependency>
            <class="tk-tag">groupId>org.springframework.boot</class="tk-tag">groupId>
            <class="tk-tag">artifactId>spring-boot-dependencies</class="tk-tag">artifactId>
            <class="tk-tag">version>3.5.11</class="tk-tag">version>
            <class="tk-tag">type>pom</class="tk-tag">type>
            <class="tk-tag">scope>import</class="tk-tag">scope>
        </class="tk-tag">dependency>
    </class="tk-tag">dependencies>
</class="tk-tag">dependencyManagement>

源码

https://gitee.com/kcnf-iot/iot-sample/tree/master/emqx

客户端注册部分代码

java

复制代码
package com.jysemel.iot.client;

import com.hivemq.client.mqtt.mqtt5.Mqtt5AsyncClient;
import com.hivemq.client.mqtt.mqtt5.Mqtt5Client;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.UUID;

@Slf4j
@Configuration
public class MqttConfig {

    @Bean
    public Mqtt5AsyncClient mqtt5AsyncClient() {
        // 使用 Builder 模式创建异步客户端
        Mqtt5AsyncClient client = Mqtt5Client.builder()
                .identifier("client" + UUID.randomUUID()) // 设置客户端ID,需唯一
                .serverHost("192.168.0.19") // Broker 地址
                .serverPort(1883) // 默认非加密端口
                .buildAsync(); // 构建异步客户端

        // 连接到 Broker
        client.connect()
                .whenComplete((connAck, throwable) -> {
                    if (throwable != null) {
                        System.err.println("MQTT 连接失败: " + throwable.getMessage());
                        // 可以在这里添加重试逻辑
                    } else {
                        System.out.println("MQTT 连接成功!");
                    }
                });
        return client;
    }
}

客户端注册信息

订阅部分代码

java

复制代码
package com.jysemel.iot.client;

import com.hivemq.client.mqtt.datatypes.MqttQos;
import com.hivemq.client.mqtt.mqtt5.Mqtt5AsyncClient;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.nio.charset.StandardCharsets;

@Service
public class MqttSubscribeService {

    @Autowired
    private Mqtt5AsyncClient mqttClient;

    // 使用 @PostConstruct 在 Bean 初始化后自动订阅
    @PostConstruct
    public void subscribe() {
        String topic = "server/v1/test";
        mqttClient.subscribeWith()
                .topicFilter(topic) // 订阅的主题
                .qos(MqttQos.AT_LEAST_ONCE)
                .callback(publish -> {
                    // 处理收到的消息
                    String payload = new String(publish.getPayloadAsBytes(), StandardCharsets.UTF_8);
                    System.out.println("收到消息,主题: " + publish.getTopic() + ", 内容: " + payload);
                })
                .send()
                .whenComplete((subAck, throwable) -> {
                    if (throwable != null) {
                        System.err.println("订阅失败: " + throwable.getMessage());
                    } else {
                        System.out.println("订阅主题 'test/topic' 成功!");
                    }
                });
    }
}

emqx 模拟下发

json

复制代码
{ "msg": "hello" }

操作

相关推荐
vx-程序开发2 小时前
django医院预约挂号系统---附源码23353
java·javascript·spring boot·python·eclipse·django·php
Crazy________3 小时前
Redis02:库切换、监控与安全配置
linux·redis·云原生·mybatis
vHelios4 小时前
【电商项目】测试 授权功能 遇到的问题与解决方案
java·spring boot·sql
2401_894915534 小时前
GEO 定位优化源码搭建常见报错排查:数据库、伪静态、接口调试
java·数据库·网络协议·tcp/ip·spring·unity
篮框坏了5 小时前
配置改了不生效?我翻出 8 个坑,没一个报错
后端·spring cloud
云烟成雨TD5 小时前
Micrometer 系列【28】Spring Boot Actuator | 其他指标速览
java·spring boot·云原生
wangjialelele6 小时前
Spring Cloud 全体系学习笔记(REST、Nacos、Feign、Gateway)
java·spring boot·笔记·学习·spring·spring cloud·gateway
玖石书6 小时前
ASP.NET Core迁移Spring对照系列:文件系统操作篇
spring·asp.net
weixin_BYSJ19876 小时前
springboot医疗信息管理系统---附源码17465
java·javascript·spring boot·python·django·flask·php