#include "tbox_messages.h" template 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& 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& 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& /*du*/) {}); } static std::string build_time_sync_request() { return build_packet(0x08, [](std::vector& /*du*/) {}); } // 实时信息上报 static std::string build_realtime_msg_request() { return build_packet(0x02, [](std::vector& 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 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& 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 ""; } }