物联网实战|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" }

操作

相关推荐
程序员JerrySUN1 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
杨杨杨大侠2 小时前
RAG 到底是怎么工作的?从用户提问到模型回答的完整链路
spring·openai·ai编程
Joy T2 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
linmengmeng_13144 小时前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
高级程序源4 小时前
django大学生创新创业项目管理系统94923-计算机课程设计、毕业设计
javascript·vue.js·spring boot·后端·python·django·课程设计
wno7045 小时前
Spring Security短信验证码登录
java·python·spring
步行cgn5 小时前
Spring util 命名空间详解
java·后端·spring
暮雨哀尘6 小时前
JAVA基础练习(四):SpringBoot 实现简易登录功能
java·spring boot·eclipse·maven
VXbishe7 小时前
【课程设计】基于SpringBoot的乡村政务服务系统的设计与实现-计算机毕设77011
javascript·vue.js·spring boot·python·php·课程设计·政务