feat: init

This commit is contained in:
yangzhijia
2026-07-22 11:27:37 +08:00
commit 49e3abbb34
23 changed files with 4388 additions and 0 deletions

131
include/mqtt_manager.h Normal file
View File

@@ -0,0 +1,131 @@
/**
* @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 = "");
// ============================================================
// 回调注册 (协议规范 §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