kunlang_tbox/src/business/tbox/tbox_messages_encode.cpp

133 lines
4.9 KiB
C++

#include "tbox_messages.h"
template <typename F>
static std::string build_packet(uint8_t command_id, F&& fill_data_unit)
{
FullPacket pkt;
pkt.command_id = command_id;
pkt.response_flag = 0xFE;
pkt.vin = TboxConfigManager::instance().getVin();
pkt.encryption_method = 0x01;
pkt.data_unit.clear();
// 用户负责填充 data_unit
fill_data_unit(pkt.data_unit);
pkt.data_length = pkt.data_unit.size();
auto encoded = ProtocolCodec::encode_full_packet(pkt);
return {encoded.begin(), encoded.end()};
}
static std::string build_gateway_address_request()
{
return build_packet(0xC1,
[](std::vector<uint8_t>& du)
{
auto time_bytes = ProtocolCodec::get_current_time_bytes();
du.insert(du.end(), time_bytes.begin(), time_bytes.end());
du.insert(du.end(), 7, 0x00);
});
}
static std::string build_login_request()
{
return build_packet(0x01,
[](std::vector<uint8_t>& du)
{
auto time_bytes = ProtocolCodec::get_current_time_bytes();
du.insert(du.end(), time_bytes.begin(), time_bytes.end());
// --- 日流水号逻辑保留原样 ---
std::ostringstream oss;
oss << std::setw(2) << std::setfill('0') << (int)time_bytes[0] << std::setw(2)
<< std::setfill('0') << (int)time_bytes[1] << std::setw(2) << std::setfill('0')
<< (int)time_bytes[2];
std::string date_str = oss.str();
auto last_login_date = TboxConfigManager::instance().getLoginSeqDate();
int last_login_seq = TboxConfigManager::instance().getLoginSeq();
uint16_t login_seq = 1;
if (last_login_date == date_str)
{
login_seq = (last_login_seq >= 65531) ? 1 : last_login_seq + 1;
}
TboxConfigManager::instance().setLoginSeqDate(date_str);
TboxConfigManager::instance().setLoginSeq(login_seq);
TboxConfigManager::instance().commit();
du.push_back((login_seq >> 8) & 0xFF);
du.push_back(login_seq & 0xFF);
// ICCID
std::string iccid = ICCID;
if (iccid.size() < 20)
iccid.resize(20, '0');
else if (iccid.size() > 20)
iccid.resize(20);
du.insert(du.end(), iccid.begin(), iccid.end());
du.insert(du.end(), 2, 0x00); // 预留字节
});
}
static std::string build_heartbeat_packet()
{
return build_packet(0x07, [](std::vector<uint8_t>& /*du*/) {});
}
static std::string build_time_sync_request()
{
return build_packet(0x08, [](std::vector<uint8_t>& /*du*/) {});
}
// 实时信息上报
static std::string build_realtime_msg_request()
{
return build_packet(0x02,
[](std::vector<uint8_t>& du)
{
auto time_bytes = ProtocolCodec::get_current_time_bytes();
du.insert(du.end(), time_bytes.begin(), time_bytes.end());
auto payload = buildTboxRealtimePayload();
du.insert(du.end(), payload.begin(), payload.end());
});
}
// 构建命令包
std::string build_command_packet(uint8_t command_id, std::span<const uint8_t> payload)
{
switch (command_id)
{
case 0xC1: // 网关地址获取
return build_gateway_address_request();
case 0x01: // 车辆登入请求
return build_login_request();
case 0x02: // 实时信息上报
return build_realtime_msg_request();
case 0x07: // 心跳包
return build_heartbeat_packet();
case 0x08: // 终端校时请求
return build_time_sync_request();
case 0xD5: // v2v broadcat消息下发
{
if (payload.empty())
{
LOG_WARN(tbox_logger, "[tbox_messages] payload required for cmd: " + std::to_string(command_id));
return "";
}
return build_packet(command_id,
[&](std::vector<uint8_t>& du) { du.insert(du.end(), payload.begin(), payload.end()); });
}
default:
LOG_WARN(tbox_logger,
"[tbox_messages] Unknown command ID for command packet: " + std::to_string(command_id));
return "";
}
}