# 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 系统更加健壮和灵活！