133 lines
4.9 KiB
C++
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 "";
|
|
}
|
|
}
|