/** * @file mqtt_manager.h * @brief MQTT 通信管理器 (协议规范 V0.08) * * 上行: report/allpoints, status/{gateid}/online, status/{gateid}/offline, * status/{gateid}/provision, response/{gateid}/cmd, response/{gateid}/provision * 下行: cmd/{gateid}/alarm, cmd/{gateid}/alarm/restore, * cmd/{gateid}/control, cmd/{gateid}/provision/wifi */ #ifndef MQTT_MANAGER_H #define MQTT_MANAGER_H #include #include #include #include #include "config.h" // ============================================================ // 回调函数类型 // ============================================================ // 告警指令回调 (alarm / alarm_restore) typedef void (*MQTTAlarmCallback)(const AlarmCommand& cmd); // 控制指令回调 typedef void (*MQTTControlCallback)(const ControlCommand& cmd); // 配网指令回调 (WiFi 凭证下发) typedef void (*MQTTProvisionCallback)(const ProvisionCommand& cmd); // ============================================================ // MQTTManager 类 // ============================================================ class MQTTManager { public: MQTTManager(); ~MQTTManager(); /** 初始化 */ bool begin(const char* gateid); /** 主循环 */ void loop(); /** 连接/断开 */ bool connect(); void disconnect(); bool isConnected(); /** 设置服务器 */ void setServer(const char* host, uint16_t port, const char* user, const char* pass); // ============================================================ // 上行: 发布方法 (协议规范 §4) // ============================================================ /** 全量遥测上报 report/allpoints (§4.1) */ void publishAllPoints(const TelemetryData& data, uint32_t sequence); /** 设备上线通知 status/{gateid}/online (§4.2) */ void publishOnline(); /** 设备离线通知 status/{gateid}/offline (§4.3) — 主动调用 */ void publishOffline(); /** 配网状态通知 status/{gateid}/provision (§4.4) */ void publishProvisionStatus(const char* state, const char* bleName); /** 指令执行响应 response/{gateid}/cmd (§4.5) */ void publishCmdResponse(const char* cmdId, const char* cmdType, const char* alarmType, bool success, const char* errorCode, const char* errorMsg); /** 配网指令响应 response/{gateid}/provision (§4.6) */ void publishProvisionResponse(const char* cmdId, bool success, const char* errorCode, const char* errorMsg, const char* wifiSignal = ""); /** 本地报警上报 status/{gateid}/alarm (§4.7 扩展) */ void publishLocalAlarm(uint8_t alarmType, bool triggered, const char* desc); // ============================================================ // 回调注册 (协议规范 §5) // ============================================================ void onAlarmCommand(MQTTAlarmCallback cb); void onControlCommand(MQTTControlCallback cb); void onProvisionCommand(MQTTProvisionCallback cb); /** 获取 gateid */ const char* getGateId() const { return _gateid; } private: static void _mqttCallback(char* topic, byte* payload, unsigned int length); static MQTTManager* _instance; // 主题构建 String _buildTopic(const char* tmpl) const; // 下行报文解析 void _handleMessage(const char* topic, const char* payload); void _parseAlarm(const char* payload, bool isRestore); void _parseControl(const char* payload); void _parseProvision(const char* payload); // 发布辅助 bool _publish(const char* topicTmpl, const char* payload, uint8_t qos, bool retain = false); WiFiClient _wifiClient; PubSubClient _mqtt; char _gateid[16]; // 服务器配置 char _server[64]; uint16_t _port; char _user[32]; char _pass[32]; // 重连 uint32_t _reconnectInterval; uint32_t _lastReconnectAttempt; bool _connected; // 回调 MQTTAlarmCallback _alarmCb; MQTTControlCallback _controlCb; MQTTProvisionCallback _provisionCb; }; #endif // MQTT_MANAGER_H