182 lines
4.6 KiB
Markdown
182 lines
4.6 KiB
Markdown
# MQTT 可选配置说明
|
||
|
||
## 概述
|
||
|
||
为了让项目在没有 MQTT 服务器的情况下也能正常启动,我们对 MQTT 功能进行了可选配置。现在您可以通过配置文件控制是否启用 MQTT 功能。
|
||
|
||
## 配置方式
|
||
|
||
### 1. 禁用 MQTT(默认)
|
||
|
||
在 `application.yml` 中设置:
|
||
|
||
```yaml
|
||
mqtt:
|
||
enabled: false # 禁用MQTT功能
|
||
host: tcp://localhost:1883
|
||
# ... 其他配置
|
||
```
|
||
|
||
当 `mqtt.enabled` 设置为 `false` 时:
|
||
- MQTT 配置类不会被加载
|
||
- MQTT 服务不会启动
|
||
- 项目可以正常启动,不会因为连接不到 MQTT 服务器而失败
|
||
|
||
### 2. 启用 MQTT
|
||
|
||
当您准备好 MQTT 服务器后,可以启用 MQTT 功能:
|
||
|
||
```yaml
|
||
mqtt:
|
||
enabled: true # 启用MQTT功能
|
||
host: tcp://your-mqtt-server:1883
|
||
clientId: evobms-client
|
||
username: your-username
|
||
password: your-password
|
||
# ... 其他配置
|
||
```
|
||
|
||
## 功能影响
|
||
|
||
### MQTT 禁用时
|
||
|
||
1. **正常功能**:
|
||
- 所有基础的 BMS 设备管理功能正常工作
|
||
- 数据库操作正常
|
||
- Web API 正常响应
|
||
- MyBatis-Plus 功能正常
|
||
|
||
2. **受限功能**:
|
||
- 无法发送 MQTT 消息
|
||
- 无法接收设备实时数据
|
||
- 以下 API 会返回友好的错误信息:
|
||
- `POST /bms/device/queryStatus/{deviceCode}` - 查询设备状态
|
||
- `POST /bms/device/restart/{deviceCode}` - 重启设备
|
||
- `POST /bms/device/config/{deviceCode}` - 配置设备
|
||
- `POST /bms/device/mqtt/send` - 发送 MQTT 消息
|
||
|
||
### MQTT 启用时
|
||
|
||
所有功能正常工作,包括:
|
||
- 实时设备数据接收
|
||
- 设备远程控制
|
||
- MQTT 消息发送和接收
|
||
- 设备状态查询
|
||
|
||
## 技术实现
|
||
|
||
### 1. 条件配置
|
||
|
||
使用 Spring Boot 的 `@ConditionalOnProperty` 注解:
|
||
|
||
```java
|
||
@Configuration
|
||
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true")
|
||
public class MqttConfig {
|
||
// MQTT配置只有在mqtt.enabled=true时才会加载
|
||
}
|
||
|
||
@Service
|
||
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true")
|
||
public class MqttService {
|
||
// MQTT服务只有在mqtt.enabled=true时才会加载
|
||
}
|
||
```
|
||
|
||
### 2. 可选依赖注入
|
||
|
||
在 Controller 中使用可选的依赖注入:
|
||
|
||
```java
|
||
@Autowired(required = false)
|
||
private MqttService mqttService;
|
||
|
||
public AjaxResult someMethod() {
|
||
if (mqttService != null) {
|
||
// MQTT功能可用
|
||
mqttService.doSomething();
|
||
return success("操作成功");
|
||
} else {
|
||
// MQTT功能不可用
|
||
return error("MQTT服务未启用");
|
||
}
|
||
}
|
||
```
|
||
|
||
## 使用建议
|
||
|
||
### 开发阶段
|
||
|
||
1. **初期开发**:设置 `mqtt.enabled: false`,专注于核心业务功能开发
|
||
2. **功能测试**:可以使用内存数据库或模拟数据进行测试
|
||
3. **集成测试**:准备好 MQTT 服务器后,设置 `mqtt.enabled: true` 进行完整测试
|
||
|
||
### 生产环境
|
||
|
||
1. **部署前**:确保 MQTT 服务器已准备就绪
|
||
2. **配置检查**:验证 MQTT 连接参数正确
|
||
3. **启用功能**:设置 `mqtt.enabled: true`
|
||
4. **监控日志**:观察 MQTT 连接状态和消息处理情况
|
||
|
||
## MQTT 服务器推荐
|
||
|
||
### 1. 开发测试
|
||
|
||
- **Eclipse Mosquitto**:轻量级,易于安装
|
||
```bash
|
||
# Docker 方式启动
|
||
docker run -it -p 1883:1883 eclipse-mosquitto
|
||
```
|
||
|
||
- **EMQX**:功能丰富,有 Web 管理界面
|
||
```bash
|
||
# Docker 方式启动
|
||
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx
|
||
```
|
||
|
||
### 2. 生产环境
|
||
|
||
- **EMQX Enterprise**:企业级功能,高可用
|
||
- **AWS IoT Core**:云服务,免运维
|
||
- **Azure IoT Hub**:微软云服务
|
||
- **阿里云 IoT Platform**:阿里云物联网平台
|
||
|
||
## 故障排除
|
||
|
||
### 常见问题
|
||
|
||
1. **项目启动失败**
|
||
- 检查 `mqtt.enabled` 是否设置为 `false`
|
||
- 确认没有其他 MQTT 相关的强制依赖
|
||
|
||
2. **MQTT 功能不工作**
|
||
- 检查 `mqtt.enabled` 是否设置为 `true`
|
||
- 验证 MQTT 服务器连接参数
|
||
- 查看应用日志中的 MQTT 连接信息
|
||
|
||
3. **API 返回错误**
|
||
- 确认是否需要 MQTT 功能
|
||
- 检查错误信息,判断是配置问题还是服务器问题
|
||
|
||
### 日志配置
|
||
|
||
在 `application.yml` 中添加 MQTT 相关日志:
|
||
|
||
```yaml
|
||
logging:
|
||
level:
|
||
com.evobms.framework.config.MqttConfig: debug
|
||
com.evobms.project.bms.service.MqttService: debug
|
||
org.springframework.integration.mqtt: debug
|
||
```
|
||
|
||
## 总结
|
||
|
||
通过这种可选配置方式,您可以:
|
||
|
||
1. **灵活开发**:在没有 MQTT 服务器时也能正常开发和测试
|
||
2. **渐进集成**:先完成核心功能,再集成 MQTT 功能
|
||
3. **环境适配**:不同环境可以有不同的 MQTT 配置
|
||
4. **故障隔离**:MQTT 服务器问题不会影响整个应用的启动
|
||
|
||
这样的设计让您的 EvoBMS 系统更加健壮和灵活! |