138 lines
4.4 KiB
C++
138 lines
4.4 KiB
C++
/**
|
|
* @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 <Arduino.h>
|
|
#include <WiFi.h>
|
|
#include <PubSubClient.h>
|
|
#include <ArduinoJson.h>
|
|
#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);
|
|
|
|
/** 无人极简报文 (仅 Presence+RadarValid, 省4G流量) */
|
|
void publishPresenceOnly(bool presence, bool radarValid, uint32_t sequence);
|
|
|
|
// ============================================================
|
|
// 回调注册 (协议规范 §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
|