MQTT (Message Queuing Telemetry Transport) 是一种轻量级的消息传递协议,特别适用于需要低带宽和低延迟的物联网 (IoT) 应用。本文将介绍如何在 Spring Boot 应用中使用 MQTT 来构建实时数据传输系统。
前置条件
在开始之前,请确保你已经安装了以下软件:
- 一个 MQTT service,例如emqx
- 创建springboot项目
添加依赖
在 pom.xml 文件中添加以下依赖项(spring-integration-mqtt):
<dependencies>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
</dependencies>
配置 MQTT
application.yml 中添加 MQTT 的配置
mqtt:
url: tcp://localhost:1883
clientId: spring-boot-mqtt-client
topic: test/topic
编写配置类
创建一个新的配置类来配置 MQTT 客户端和集成:
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.core.MessageProducer;
import org.springframework.integration.handler.GenericHandler;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
@Configuration
public class MqttConfig {
@Value("${mqtt.url}")
private String mqttUrl;
@Value("${mqtt.clientId}")
private String clientId;
@Value("${mqtt.topic}")
private String topic;
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
MqttConnectOptions options = new MqttConnectOptions();
options.setServerURIs(new String[]{mqttUrl});
factory.setConnectionOptions(options);
return factory;
}
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
@Bean
public MessageProducer inbound() {
MqttPahoMessageDrivenChannelAdapter adapter =
new MqttPahoMessageDrivenChannelAdapter(clientId + "_inbound", mqttClientFactory(), topic);
adapter.setCompletionTimeout(5000);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setQos(1);
adapter.setOutputChannel(mqttInputChannel());
return adapter;
}
@Bean
public MessageHandler handler() {
return (message, headers) -> {
System.out.println("Received message: " + message.getPayload());
return null;
};
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
@Bean
public MessageHandler outbound() {
MqttPahoMessageHandler messageHandler =
new MqttPahoMessageHandler(clientId + "_outbound", mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic(topic);
return messageHandler;
}
}
创建消息网关
import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.stereotype.Component;
@Component
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {
void sendToMqtt(String data);
}
编写控制器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/mqtt")
public class MqttController {
@Autowired
private MqttGateway mqttGateway;
@PostMapping("/publish")
public String sendMessage(@RequestBody String message) {
mqttGateway.sendToMqtt(message);
return "Message sent to MQTT topic";
}
}
emqx docker 安装
EMQX 是一款高性能、开源的 MQTT 消息代理,广泛应用于物联网 (IoT) 系统中。通过 Docker 安装 EMQX,可以快速搭建一个 MQTT 消息代理服务,本文将详细介绍如何使用 Docker 安装和配置 EMQX。
前提条件
在开始之前,请确保你已经安装了以下工具:
- Docker:可以参考 Docker 官方文档 进行安装。
- Docker Compose(可选):用于定义和运行多容器 Docker 应用程序。可以参考 Docker Compose 官方文档 进行安装。
步骤一:拉取 EMQX Docker 镜像
docker pull emqx/emqx
步骤二:运行 EMQX 容器
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8080:8080 emqx/emqx
解释一下这条命令:
- -d:以后台模式运行容器。
- –name emqx:为容器命名为 emqx。
- -p 1883:1883:将容器的 1883 端口映射到主机的 1883 端口,这是 MQTT 协议的默认端口。
- -p 8083:8083:将容器的 8083 端口映射到主机的 8083 端口,这是 WebSocket 的默认端口。
- -p 8080:8080:将容器的 8080 端口映射到主机的 8080 端口,这是 EMQX 管理控制台的默认端口。
- emqx/emqx:使用之前下载的 EMQX 镜像。
步骤三:验证 EMQX 是否成功运行
运行以下命令查看 EMQX 容器的状态:
docker ps
你应该会看到类似于以下的输出,表示 EMQX 容器正在运行:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xxxxxxxxxxxx emqx/emqx "/opt/emqx/bin/emqx …" x minutes ago Up x minutes 0.0.0.0:1883->1883/tcp, 0.0.0.0:8083->8083/tcp emqx
步骤四:访问 EMQX 管理控制台
打开浏览器,访问 http://localhost:8080,你将看到 EMQX 的管理控制台登录页面。
默认的用户名和密码 admin/public,登录后,你可以在控制台中查看和管理 EMQX 的各种设置。
使用 Docker Compose 安装 EMQX(可选)
如果你需要配置更多选项,或者与其他服务一起运行 EMQX,Docker Compose 是一个不错的选择。下面是一个示例 docker-compose.yml 文件:
version: '3'
services:
emqx:
image: emqx/emqx
container_name: emqx
ports:
- "1883:1883"
- "8083:8083"
- "8080:8080"
environment:
- EMQX_NAME=my_emqx
- EMQX_ALLOW_ANONYMOUS=false
- EMQX_ADMIN_PASSWORD=public
你可以将上述内容保存为 docker-compose.yml 文件,然后在相同目录下运行以下命令启动 EMQX:
docker-compose up -d
配置 EMQX
你可以通过修改 docker-compose.yml 文件中的环境变量来配置 EMQX。例如:
- EMQX_NAME:设置 EMQX 的节点名称。
- EMQX_ALLOW_ANONYMOUS:是否允许匿名登录,默认值为 true。
- EMQX_ADMIN_PASSWORD:设置 EMQX 管理控制台的管理员密码。