实现MQTT功能, 修改HTTP接口

This commit is contained in:
lixiaoyuan
2025-09-04 19:31:04 +08:00
parent 61ed4f355f
commit d81bcd9983
30 changed files with 2029 additions and 697 deletions

View File

@@ -10,10 +10,10 @@ using namespace std;
class MqttClient
{
public:
int init(string addr, string client_id, string username, string password, std::vector<std::string> vecTopic);
void subscribe(std::vector<std::string> topics, std::function<void(int)> callback);
int init(string addr, string clientId, string username, string password);
void destory();
void subscribe();
int publish(string topic, string text);
void onConnectionLost(char* cause);
@@ -23,13 +23,15 @@ public:
void onConnectSuccess(MQTTAsync_successData* resp);
void onConnectFaiure(MQTTAsync_failureData* resp);
void parseEMS_YC(std::string& text);
void parsePCU_YX(std::string& text);
public:
std::string clientId;
MQTTAsync client = nullptr;
std::vector<std::string> vecTopic;
std::string addr; // "tcp://localhost:1883"
int qos {1};
std::string clientId;
bool isConnected {false};
bool isSubscribed {false};
};
@@ -52,317 +54,11 @@ public:
#define TOPIC_PCS_YC "up/json/预制舱01/PCS_YC"
#define MQTT_TOPIC_NOTIFY_STATION "notification_stationInfo" // 充(换)电站信息变化推送
#define MQTT_TOPIC_QUERY_STATION "query_stations_info" // 查询充(换)电站信息
#define MQTT_TOPIC_NOTIFY_ALARM "notification_alarmInfo" // 告警信息推送
#define MQTT_TOPIC_NOTIFY_CHARGE_STATUS "notification_connectorStatus" //充电设备状态变化推送
#define MQTT_TOPIC_NOTIFY_SWAP_STATUS "notification_swapStatus" //换电设备状态变化推送
#define MQTT_TOPIC_QUERY_STATUS "query_station_status" //查询站内设备接口状态
#define MQTT_TOPIC_NOTIFY_CHARGE_ORDER "notification_orderInfo" //充电电量信息推送
#define MQTT_TOPIC_QUERY_ORDER "query_order_info" //查询充电电量信息
#define MQTT_TOPIC_NOTIFY_SWAP_ORDER "notification_swapInfo" //换电记录信息推送
#define MQTT_TOPIC_QUERY_SWAP_ORDER "query_swap_info" //查询换电电量信息
namespace mqtt
{
// 充(换)电运营商信息
struct OperatorInfo
{
string OperatorID; // 运营商ID 组织机构代码 是 字符串 9 字符
string OperatorName; // 运营商名称 机构全称 是 字符串 <= 64 字符
string OperatorTel1; // 运营商电话1 运营商客服电话 1 是 字符串 <= 32 字符
string OperatorTel2; // 运营商电话2 运营商客服电话 2 否 字符串 <= 32 字符
string OperatorRegAddress; // 运营商注册地址 运营商注册地址 否 字符串 <= 64 字符
string OperatorNote; // 备注 备注信息 否 字符串 <= 255 字符
};
// 充(换)电站信息
struct StationInfo
{
string StationID; // 充(换)电站 ID 运营商自定义的唯一编码 是 字符串 <= 20 字 符
string OperatorID; // 运营商 ID 电动汽车充(换)电服务平台的运营商 ID 是 字符串 9 字符
string EquipmentOwnerID; // 设备所属方 ID 设备所属方组织机构代码,所属方为个人时可不填 否 字符串 9 字符
string StationName; // 充(换)电站名称 充(换)电站名称的描述 是 字符串 <= 50 字
string CountryCode; // 充(换)电站国家代码 比如 CN 是 字符串 2 字符
string AreaCode; // 充(换)电站省市辖区编码 填写内容为参照 GB / T2260以民政部发布最新数据为准 是 字符串 <= 20 字符
string Address; // 详细地址 是 字符串<= 100字符
string StationTel; // 站点电话 能够联系场站工作人员进行协助的联系电话 否 字符串<= 30 字符
string ServiceTel; // 服务电话 平台服务电话,例如 400 电话 是 字符串<= 30字符
string ServiceType; // *服务类型 1充电 2换电 3充换电 255其他 是 整型
string StationType; // 站点类型 1公共充电站 2专用充电站 3居民充电站 255其他 是 整型
string StationStatus; // 站点状态 0未知 1建设中 5关闭下线 6维护中 50正常使用 是 整型
string ParkNums; // 车位数量 可停放进行充电的车位总数, 默认0 未知 是 整型
float StationLng; // 经度 GCJ - 02 坐标系 是 浮点型 保留小数点后6 位
float StationLat; // 纬度 GCJ - 02 坐标系 是 浮点型保留小数点后6 位
string SiteGuide; // 站点引导描述性文字,用于引导车主找到充电车位 否 字符串<= 255字符
int Construction; // 建设场所
//101公共服务场所
//102公共停车场
//103城市交通节点
//104加油站
//105具备停车条件的充电区域
//106高速服务区
//201政府机关
//202公共机构
//203企业事业单位
//204公交
//205环卫
//206物流
//207出租车
//208港口码头
//209重卡换电场所
//210矿卡换电场所
//301居民
//255其他
// 是 整型
string Pictures; // 站点照片 充(换)电设备照片、充(换)电车位照片、停车场入口照片 是 字符串数组 无照片时可传空数组
string MatchCars; // 服务车型描述 描述该站点可充(换)电服务 的车辆类型:如大巴、物流车、私家乘用车、出租车、重卡型卡车等 否 字符串<= 255字符
string ParkInfo; // 车位楼层及数量描述车位楼层以及数量信息 否 字符串<= 100字符
int OpenAllDay; // *全天开放 0否 1是 是 整型
string OpenForBusinessDate; // *投运日期 站点投运日期 yyyy - MM - dd 格式 是 字符串
string BusineHours; // 营业时间 营业时间描述 否 字符串<=255字符
string ElectricityFee; // *电费费率 示例 [{"StartTime":"000000","Price":"1.0000"},{"StartTime":"120000","Price":"1.2000"}] 否 字符串 <= 2000 字符
string ServiceFee; // *服务费率 示例[{"StartTime":"000000","Price":"1.0000"},{"StartTime":"120000","Price":"1.2000"}] 否 字符串 <= 2000 字符
string ParkOwner; // *停车场产权方 停车场产权人 否 字符串
string ParkManager; // *停车场管理方 停车场管理人XX 物业) 否 字符串
int ParkType; // 停车费类型 0免费 1不免费 2限时免费停车 3充电限时减免 255参考场地实际收费标准 否 整型
string ParkFee; // 停车费描述 停车费率描述 否 字符串 <= 255字符
string Payment; // 支付方式 支付方式: 刷卡、线上、现金其中电子钱包类卡为刷卡,身份鉴权卡、微信 / 支付宝等在线支付、APP 支付为线上否 字符串<= 20 字符
int SupportOrder; // 是否支持预约 0不支持预约 1支持预约。不填默认为 0 否 整型
string Remark; // 备注 其他备注信息 否 字符串<= 100字符
string EquipmentInfos; // 充电设备信息列表 该充(换)电站所有充电设备 信息对象数组 是 EquipmentInfos[],参照 4.4
string SwapEquipmentInfos; // *换电设备信息列表 该充(换)电站所有换电设备。换电站以及充换电站提供此数据,充电站默认空数组。 是 SwapEquipmentInfo[],参照 4.6 换电工位信息
int BatteryNo; // *备用电池数量换电站内可提供更换最大电池数量。换电站以及充换电站提供此数据充电站默认填0。 是 整型
};
// 充电设备信息
struct EquipmentInfo
{
string EquipmentID;
string ManufacturerID;
string EquipmentModel;
string ProductionDate;
string OpenForBusinessDate;
int EquipmentType;
int EquipmentStatus;
vector<int> ConnectorInfos;
float EquipmentLng;
float EquipmentLat;
float Power;
string EquipmentName;
};
// 充电设备接口信息
struct ConnectorInfo
{
string ConnectorID; // 充电设备接口编码 充电设备接口编码,同一运营商内唯一 是 字符串 <= 64 字符
string ConnectorName; // 充电设备接口名称 否 字符串 <= 30 字符
int ConnectorType; // 充电设备接口类型
//1家用插座模式 2
//2交流接口插座模式 3连接方式 B
//3交流接口插头带枪线模式 3连接方式 C
//4直流接口枪头带枪线模式 4
//5无线充电座
//6其他
//7对换电站电池箱的接口
//是 整型
int VoltageUpperLimits; // 额定电压上限 单位V 是 整型
int VoltageLowerLimits; // 额定电压下限 单位V 交流可与额定电压上限相同 是 整型
int ConstantVoltageUpperLimits; // *恒功率电压上限 单位V 否 整型
int ConstantVoltageLowerLimits; // *恒功率电压下限 单位V 否 整型
int Current; // 额定电流 单位A 是 整型
float Power; // 额定功率 单位kW 是 浮点型 保留小数点后一位
string ParkNo; // 车位号 停车场车位编号,或充电架编号 否 字符串 <= 10 字符
int NationalStandard; // 国家标准 1:2011 2 : 2015 3 : 兼容 2011 和 2015 是 整型
};
// 换电设备信息(SwapEquipmentInfo)
class SwapEquipmentInfo
{
string EquipmentID; // 设备编码 换电设备唯一编码,同一运营商下唯一 是 字符串 <= 64 字符
string ManufacturerID; // 设备生产商组织机构代码 设备生产商组织机构代码 否 字符串 9 字符
string EquipmentModel; // 设备型号 由设备生厂商定义的设备型号 否 字符串 <= 20 字符
string ProductionDate; // 设备生产日期 YYYY - MM - DD 否 字符串 10 字符
string OpenForBusinessDate; // *投运日期 充电桩投运日期 yyyy - MM - dd 格式 是 字符串
string OpreateStatus; // 运营状态 0未知 1建设中 5关闭下线 6维护中 50正常使用 是 整型
int EquipmentType; // 换电设备类型 填写内容为参照GB29317 - 2021 4.3节中的描述 1侧向换电 2底部换电 3顶部换电 4端部换电 5中置换电 255其他 是 整型
string MatchCars; // 服务车型描述 描述该设备可服务的车辆类型以及 型号等 否 字符串<= 1000 字符
string SupplyBattery; // 提供电池描述 描述该设备提供的电池类型以及型号等 否 字符串<= 100 字符
};
//电池箱信息
struct BatteryInfo
{
string BatteryNo; // 电池箱编号 运营商自定义唯一编码 是 字符串 <= 32 字
string BatteryOwnerID; // 电池所属方ID 设备所属方组织机构代码,所属方为个人时可不填 否 字符串 9 字符
string ManufacturerID; // 设备生产商组织机构代码 设备生产商组织机构代码 否 字符串 9 字符
string BatteryModel; // 电池型号 由设备生厂商定义的设备型号 否 字符串 <= 20 字符
string ProductionDate; // 设备生产日期 YYYY - MM - DD 否 字符串 10 字符
string OpenForBusinessDate; // 投运日期 电池投运日期 yyyy - MM - dd 格式 是 字符串
int CellNum; // 电池箱所含单体电池个数 电池箱所含单体个数 是 整型
int SeriesNum; // 单体电池串联总数 串联总数 否 整型
int ParallelNum; // 单体电池并联总数 并联总数 否 整型
int BatteryType; // 电池类型
//1磷酸铁锂电池
//2锰酸锂电池
//3钴酸锂电池
//4三元材料电池
//5聚合物锂离子电池
//6钛酸锂电池
//7燃料电池
//255其它
//是 整型
float RatedCapacity; // 电池箱额定容量 单位Ah小数点后 1 位 是 浮点型
float RatedVoltage; // 电池箱额定电压 单位V小数点后 1 位 是 浮点型
};
// 充电设备接口状态
struct ConnectorStatusInfo
{
string ConnectorID; // 充电设备接口编码 充电设备接口编码,同一运营商内唯一 是 字符串<= 64 字符
string UpdateTime; // 状态更新时间 本次状态变化的时间格式“yyyy -MM - dd HH : mm:ss” 是 字符串 <= 20 字符
int Status; // 接口状态 0离线 1空闲 2占用未充电 3占用充电中 4占用预约锁定 255故障 是 整型
int ParkStatus; // 车位状态 0未知 10空闲 50占用 否 整型
int LockStatus; // 地锁状态 0未知 10已解锁 50已上锁 否 整型
int CurrentA; // A 相电流 单位A默认0 含直流(输出) 是 整型
int CurrentB; // B 相电流 单位A默认0 否 整型
int CurrentC; // C 相电流 单位A默认0 否 整型
int VoltageA; // A 相电压 单位V默认0 含直流(输出) 是 整型
int VoltageB; // B 相电压 单位V默认0 否 整型
int VoltageC; // C 相电压 单位V默认0 否 整型
float SOC; // *剩余电量 默认0 交流充电桩采集不到SOC 值的填 0 是 浮点型
string Begin_time; // *开始充电时间 格式 为 yyyy-MM-dd HH:mm:ss 是 字符串
float Current_kwh; // *本次已充电量 单位kWh 是 浮点型
float Current_meter; // *当前电表读数 单位kWh 否 浮点型
string Vin; // *车架号 否 字符串 <= 20 字符
//BatteryStatusInfo //*电池状态信息 充电设备有电池情况下需上报 是 BatteryStatusInfo参照4.9
};
// 电池箱状态
struct BatteryStatusInfo
{
string BatteryNo; // 电池箱编号 (充电设备有电池情况下需上报) 是 字符串<= 32 字符
string UpdateTime; // 状态更新时间 本次状态变化的时间格式“yyyy -MM - dd HH : mm:ss” 是 字符串 <= 20 字符
float Voltage; // 当前电压 单位V小数点后 2 位 (充电设备有电池情况下需上报) 是 浮点型
float Current; // 当前电流 单位V小数点后 2 位 (充电设备有电池情况下需上报) 是 浮点型
float SOC; // 当前 Soc 当前电池电量百分比范围0100小数点后 1 位 (充电设备有电池情况下需上报) 是 浮点型
float SOH; // 当前 Soh 当前电池健康度范围0100小数点后 1 位(充电设备有电池情况下需上报)是 浮点型
int BatteryIsFault; // 电池箱是否故障 0未知 1是 2否 (充电设备有电池情况下需上报) 是 整型
int MaxVoltageBatteryNo; // 最高电压单体电池编号 充电设备有电池情况下需上报 否 整型
float MaxVoltage; // 最高电压单体电池电压值单位: V小数点后3位 充电设备有电池情况下需上报 否 浮点型
int MinVoltageBatteryNo; // 最低电压单体电池编号 充电设备有电池情况下需上报 否 整型
float MinVoltage; // 最低电压单体电池电压值 单位: V小数点后 3 位 充电设备有电池情况下需上报 否 浮点型
float MaxTempBatteryNo; // 最高温度测温点编号 充电设备有电池情况下需上报 否 整型
int MaxTemp; // 最高温度测温点温度值 单位:℃ 充电设备有电池情况下需上报 否 整型
int MinTempBatteryNo; // 最低温度测温点编号 充电设备有电池情况下需上报 否 整型
int MinTemp; // 最低温度测温点温度值 单位:℃ 充电设备有电池情况下需上报 否 整型
};
// 换电设备状态SwapEquipmentStatusInfo
struct SwapEquipmentStatusInfo
{
string EquipmentID; // 换电设备编码 换电设备编码,同一运营商内唯一 是 字符串 <= 64 字符
string UpdateTime; // 状态更新时间 本次状态变化的时间格式“yyyy - MM - dd HH : mm:ss” 是 字符串 <= 20 字符
int Status; // 换电设备状态 0离线 1空闲 2工作 255故障 是 整型
int SwapMode; // 换电模式 0手动模式 1半自动模式 2全自动模式 3检修模式 否 整型
};
// 充电站状态StationStatusInfo
struct StationStatusInfo
{
string StationID; // 充(换)电站 ID 运营商自定义的唯一编码 是 字符串 <= 20 字符
string ConnectorStatusInfos; // 充电设备接口状态列表 充(换)电站下所有充电设备接口的状态对象数组 是 ConnectorStatusInfos[] 参照 5.6
string SwapEquipmentStatusInfo; // 换电设备状态列 所有充电设备接口的是 SwapEquipmentStatusInfo[]表 状态 参照4.10
};
//充电电量信息OrderInfo
struct OrderInfo
{
string OperatorID; // 运营商 ID 统一社会信用代码 是 字符串 9 字符
string ConnectorID; // 充电设备接口编码 充电设备接口编码,同一充(换)电运营平台内唯一 是 字符串 <= 26 字符
string StartChargeSeq; // 充电业务编号 运营商充电业务编号 是 字符串 <= 32 字符
int UserChargeType; // 用户发起充电类型 1:充(换)电运营平台注册用户 2 : 监管平台注册用户 3 : 其他 否 整型
string MobileNumber; // 用户手机号 若用户发起充电类型为APP用户手机号必填否 字符串
float Money; // 本次充电消费总金额 单位:元 若通过苏e充APP启动此字段为必填项。 否 浮点型
float ElectMoney; // 本次充电电费总金额 单位:元 若通过苏e充APP启动此字段为必填项。 否 浮点型
float ServiceMoney; // 本次充电服务费金额 单位:元 若通过苏e充APP启动此字段为必填项。 否 浮点型
float Elect; // 本次充电电量 单位 kWh精度0.001,如果不设置峰谷电价,平电量等于本次充电电量,其他分电量为零。 是 浮点型
float CuspElect; // *尖阶段电量 单位 kWh精度0.001 是 浮点型
float PeakElect; // *峰阶段电量 单位 kWh精度0.001 是 浮点型
float FlatElect; // *平阶段电量 单位 kWh精度0.001 是 浮点型
float ValleyElect; // *谷阶段电量 单位 kWh精度0.001 是 浮点型
float StartTime; // 本次充电开始时间 格式“yyyy - MM - ddHH : mm:ss” 是 字符串
float EndTime; // 本次充电结束时间 格式“yyyy - MM - ddHH : mm: ss” 是 字符串
float PaymentAmount; // 支付金额 支付金额 若通过苏e充APP启动此字段为必填项。 否 浮点型 保留小数点后 2 位
float MeterValueStart; // *电表总起值 单位 kWh精度0.001 是 浮点型 保留小数点后三位
float MeterValueEnd; // *电表总止值 单位 kWh精度0.001 是 浮点型 保留小数点后三位
float Vin; // *本次充电车架号 充电设备有车辆VIN码需上报 否 字符串 <= 64 字符
float BatteryNo; // *本次充电电池编号 充电设备有电池情况下需上报 否 字符串 <= 64 字符
float ExchangeChargeSeq;// *换电记录编号 格式“运营商 ID + 唯一编号”27 字符,如果有对应的换电记录需要填写是 字符串 <= 40 字符
};
// 换电记录信息SwapInfo
struct SwapInfo
{
string OperatorID; //运营商 ID 统一社会信用代码 是 字符串 9 字符
string EquipmentID; // 换电设备编码 换电设备接口编码,同一充(换)电运营平台内唯一 是 字符串 <= 40 字符
string ExchangeChargeSeq; // 换电记录编号 格式“运营商 ID + 唯一编号”27 字 符 是 字符串
string SwapMode; // 换电模式 0手动模式 1半自动模式 2全自动模式 3检修模式 否 整型
string CarNo; // 车牌号 否 字符串 <= 16 字符
string Vin; // 车辆VIN码 车辆识别码见GB - T - 27930 - 2015国标PGN512 BMS 和车辆辨识报文BRM约定 否 字符串
string RepDownBatteryNo;// 换下电池箱编号 运营商自定义唯一 编码, 是 字符串 <= 32 字符
string RepDownBatterySoc;// 换下电池箱SOC 电池电量百分比范围0100 是 整型
string RepOnBatteryNo;//换上电池箱编号 运营商自定义唯一编码,是 字符串 <= 32 字符
int RepOnBatterySoc; //换上电池箱SOC 电池电量百分比范围0100 是 整型
float TotalPower; //换上电池箱总充入电量 单位:度(kWh) 是 浮点型 保留小数点后两位
string StartTime; //换电开始时间 格式“yyyy - MM - dd HH : mm:ss” 是 字符串
string EndTime; //换电结束时间 格式“yyyy - MM - dd HH : mm: ss” 是 字符串
};
// 充电设备告警信息AlarmInfo
struct AlarmInfo
{
string EquipmentID; // 设备编码 充电接口唯一编码,对同一运营商,保证唯一 是 字符串 23 字符
int EquipmentType; //设备类型 1充电设备 2换电设备 整型
string Alert_time; //告警时间 格 式 为 yyyy - MMdd HH : mm:ss 是 字符串
int Alert_code; //告警代码 告警代码 是 整型
string Describe; //描述 文字描述,最大长度 256字符。是 字符串 256 字符
int Status; //状态 告警发生0告警 恢复: 1默认为 0。是 整型
};
}
class MQTT
{
public:
static string packEquipmentInfo(mqtt::EquipmentInfo& info);
static string packSwapEquipmentStatusInfo(string node_name);
// 充(换)电站信息变化推送
static string packNotifyStationInfo();
// 告警信息推送
static string packNotifyAlarm();
// 充电设备状态变化推送, 充电启停或者离线状态改变时推送,充电过程中每分钟一次推送
static string packNotifyChargeStatus();
// 换电设备状态变化推送
static string packNotifySwapStatus();
// 充电电量信息推送chon 充电结束后5分钟内推送
static string packNotifyChargeOrder();
// 换电记录信息推送, 换电结束后5分钟内推送
static string packNotifySwapOrder();
public:
static string packEquipmentInfo();
};