自定义客户端协议
概述
自定义客户端的数据流格式为 Protobuf v3(Protocol Buffers),采用 MQTT 作为发布/订阅消息传输协议。MQTT 直接传输 Protobuf 序列化的二进制流。topic 为对应的指令名。
- 服务器 IP 地址:192.168.12.1
- 端口:3333
- 自定义客户端 IP 地址:DHCP 自动分配
通信流程
- 结合文档中的 Protobuf 消息格式编写
.proto文件,用 protoc 生成不同语言的类代码; - 在发布者端,将对象序列化成二进制;
- 通过 MQTT publish 把二进制发送到对应 Topic;
- 在订阅者端,接收消息并用 Protobuf 反序列化。
示例代码见附录三,其中
MyMqttClient的clientID需填入所连接机器人对应的 ID 编号。
图传码流数据
自定义客户端可通过 UDP 监听 3334 端口 获取图传码流数据。编码格式为 HEVC,每个 UDP 包的码流数据前 8 个字节固定为:
- 帧编号(递增):2 byte
- 当前帧内分片序号:2 byte
- 当前帧总字节数:4 byte
2.1 指令概览
| 指令(message)名 | 指令用途 | 发送方/接收方 | 最高 qos 等级 | 频率 |
|---|---|---|---|---|
| KeyboardMouseControl | 传输鼠标键盘输入 | 自定义客户端 → 图传链路 → 机器人 | 1 | 75 Hz |
| CustomControl | 最大 30 字节的自定义数据 | 自定义客户端 → 图传链路 → 机器人 | 1 | 75 Hz |
| GameStatus | 同步比赛全局状态信息 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| GlobalUnitStatus | 同步基地、前哨站和所有机器人状态 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| GlobalLogisticsStatus | 同步全局后勤信息 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| GlobalSpecialMechanism | 同步正在生效的全局特殊机制 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| Event | 全局事件通知 | 服务器 → 自定义客户端 | 1 | 触发式发送 |
| RobotInjuryStat | 机器人一次存活期间累计受伤统计 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| RobotRespawnStatus | 机器人复活状态同步 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| RobotStaticStatus | 机器人固定属性和配置 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| RobotDynamicStatus | 机器人实时数据 | 服务器 → 自定义客户端 | 1 | 10 Hz |
| RobotModuleStatus | 机器人各模块运行状态 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| RobotPosition | 机器人空间坐标和朝向 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| Buff | Buff 效果信息 | 服务器 → 自定义客户端 | 1 | 获得增益时触发发送,此后 1 Hz 定频发送直到失去增益 |
| PenaltyInfo | 判罚信息同步 | 服务器 → 自定义客户端 | 1 | 触发式发送 |
| RobotPathPlanInfo | 哨兵轨迹规划信息 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| MapClickInfoNotify | 云台手地图点击标记 | 自定义客户端 → 服务器 | 1 | 触发式发送,频率限制与 1.3.1 小节一致 |
| RadarInfoToClient | 雷达发送的机器人位置信息 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| CustomByteBlock | 机器人自定义上传数据流(对应 0x0310) | 机器人 → 图传链路 → 自定义客户端 | 1 | 50 Hz |
| AssemblyCommand | 工程装配指令 | 自定义客户端 → 服务器 | 1 | 1 Hz |
| TechCoreMotionStateSync | 科技核心运动状态同步 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| RobotPerformanceSelectionCommand | 地面机器人选择性能体系或控制方式 | 自定义客户端 → 服务器 | 1 | 1 Hz |
| RobotPerformanceSelectionSync | 步兵/英雄性能体系状态同步 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| CommonCommand | 机器人多种常用指令 | 自定义客户端 → 服务器 | 1 | 触发式发送,最高 10 Hz |
| HeroDeployModeEventCommand | 英雄部署模式相关指令 | 自定义客户端 → 服务器 | 1 | 1 Hz |
| DeployModeStatusSync | 英雄部署模式状态同步 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| RuneActivateCommand | 能量机关激活指令 | 自定义客户端 → 服务器 | 1 | 1 Hz |
| RuneStatusSync | 能量机关状态同步 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| SentryStatusSync | 哨兵姿态相关信息同步 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| DartCommand | 飞镖控制指令 | 自定义客户端 → 服务器 | 1 | 1 Hz |
| DartSelectTargetStatusSync | 飞镖目标选择状态同步 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| SentryCtrlCommand | 哨兵控制指令请求 | 自定义客户端 → 服务器 | 1 | 1 Hz |
| SentryCtrlResult | 哨兵控制指令结果反馈 | 服务器 → 自定义客户端 | 1 | 1 Hz |
| AirSupportCommand | 空中支援指令 | 自定义客户端 → 服务器 | 1 | 1 Hz |
| AirSupportStatusSync | 空中支援状态反馈 | 服务器 → 自定义客户端 | 1 | 1 Hz |
2.2 详细协议定义
2.2.1 KeyboardMouseControl
用途:传输鼠标键盘输入。该数据将通过相机图传模块(接收端)发送给机器人。实际比赛时,操作手需提前选择键鼠控制指令来源为官方选手端或自定义客户端,同时仅能通过一个来源生成发送给机器人的键鼠指令。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | int32 | 鼠标 x 轴移动速度,负值标识向左移动 |
| 2 | int32 | 鼠标 y 轴移动速度,负值标识向下移动 |
| 3 | int32 | 鼠标滚轮移动速度,负值标识向后滚动 |
| 4 | bool | 左键是否按下(false=抬起, true=按下) |
| 5 | bool | 右键是否按下(false=抬起, true=按下) |
| 6 | uint32 | 键盘按键位掩码(bit0~bit15) |
| 7 | bool | 中键是否按下(false=抬起, true=按下) |
键盘按键位掩码(每个 bit 对应一个按键,0=未按下,1=按下):
- bit0 : W
- bit1 : S
- bit2 : A
- bit3 : D
- bit4 : Shift
- bit5 : Ctrl
- bit6 : Q
- bit7 : E
- bit8 : R
- bit9 : F
- bit10: G
- bit11: Z
- bit12: X
- bit13: C
- bit14: V
- bit15: B
message KeyboardMouseControl {
int32 mouse_x = 1;
int32 mouse_y = 2;
int32 mouse_z = 3;
bool left_button_down = 4;
bool right_button_down = 5;
uint32 keyboard_value = 6;
bool mid_button_down = 7;
}
2.2.2 CustomControl
用途:最大 30 字节的自定义数据。该信息将通过常规链路以 0x0311 命令字发送给机器人。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | bytes | 最大 30 字节的自定义数据 |
message CustomControl {
bytes data = 1;
}
2.2.3 GameStatus
用途:同步比赛全局状态信息。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 当前局号(从 1 开始) |
| 2 | uint32 | 总局数 |
| 3 | uint32 | 红方得分 |
| 4 | uint32 | 蓝方得分 |
| 5 | uint32 | 当前阶段(枚举值见下表) |
| 6 | int32 | 当前阶段剩余时间(秒) |
| 7 | int32 | 当前阶段已过时间(秒) |
| 8 | bool | 是否暂停 |
current_stage 枚举值:
- 0:未开始比赛
- 1:准备阶段
- 2:十五秒裁判系统自检阶段
- 3:五秒倒计时
- 4:比赛中
- 5:比赛结算中
message GameStatus {
uint32 current_round = 1;
uint32 total_rounds = 2;
uint32 red_score = 3;
uint32 blue_score = 4;
uint32 current_stage = 5;
int32 stage_remain_time = 6;
int32 stage_passed_time = 7;
bool is_paused = 8;
}
2.2.4 GlobalUnitStatus
用途:同步基地、前哨站和所有机器人状态。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 己方基地当前血量(0=已摧毁) |
| 2 | uint32 | 己方基地状态(枚举值见下) |
| 3 | uint32 | 己方基地当前护盾值(0=无护盾) |
| 4 | uint32 | 己方前哨站当前血量(0=已摧毁) |
| 5 | uint32 | 己方前哨站状态(枚举值见下) |
| 6 | uint32 | 对方基地当前血量(0=已摧毁) |
| 7 | uint32 | 对方基地状态 |
| 8 | uint32 | 对方基地当前护盾值(0=无护盾) |
| 9 | uint32 | 对方前哨站当前血量(0=已摧毁) |
| 10 | uint32 | 对方前哨站状态 |
| 11 | repeated uint32 | 所有机器人血量(先己方后对方) |
| 12 | repeated int32 | 己方机器人剩余累计发弹量 |
| 13 | uint32 | 己方累计总伤害 |
| 14 | uint32 | 对方累计总伤害 |
base_status 枚举值:
- 0:无敌
- 1:解除无敌,护甲未展开
- 2:解除无敌,护甲展开
outpost_status 枚举值:
- 0:无敌
- 1:存活,解除无敌,中部装甲旋转
- 2:存活,解除无敌,中部装甲停转
- 3:被击毁,不可重建
- 4:被击毁,可重建
- 5:被击毁,重建中
message GlobalUnitStatus {
uint32 base_health = 1;
uint32 base_status = 2;
uint32 base_shield = 3;
uint32 outpost_health = 4;
uint32 outpost_status = 5;
uint32 enemy_base_health = 6;
uint32 enemy_base_status = 7;
uint32 enemy_base_shield = 8;
uint32 enemy_outpost_health = 9;
uint32 enemy_outpost_status = 10;
repeated uint32 robot_health = 11;
repeated int32 robot_bullets = 12;
uint32 total_damage_ally = 13;
uint32 total_damage_enemy = 14;
}
2.2.5 GlobalLogisticsStatus
用途:同步全局后勤信息。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 己方当前经济 |
| 2 | uint64 | 己方累计总经济 |
| 3 | uint32 | 己方科技等级(工程机器人曾装配最高难度) |
| 4 | uint32 | 己方加密等级(雷达解析信息波机制) |
message GlobalLogisticsStatus {
uint32 remaining_economy = 1;
uint64 total_economy_obtained = 2;
uint32 tech_level = 3;
uint32 encryption_level = 4;
}
2.2.6 GlobalSpecialMechanism
用途:同步正在生效的全局特殊机制。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | repeated uint32 | 正在生效的机制 ID 列表 |
| 2 | repeated int32 | 对应的时间参数(秒) |
mechanism_id 枚举值:
- 1:己方堡垒被对方占领计时
- 2:对方堡垒被己方占领计时
message GlobalSpecialMechanism {
repeated uint32 mechanism_id = 1;
repeated int32 mechanism_time_sec = 2;
}
2.2.7 Event
用途:全局事件通知。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | int32 | 事件编号(枚举值见下) |
| 2 | string | 事件参数(含义随 event_id 变化) |
event_id 枚举值:
- 1:击杀事件(参数为击杀者 id+被击毁机器人 id 的拼接)
- 2:基地、前哨站被摧毁事件(参数值为被击毁的目标 id,如蓝方前哨站为 111)
- 3:能量机关可激活次数变化(参数值为变化后可激活次数)
- 4:能量机关当前可进入正在激活状态(无参数值)
- 5:当前能量机关被成功激活的灯臂数量、平均环数(参数值为激活成功臂数+平均环数的拼接)
- 6:能量机关被激活(含激活类型)
- 7:己方英雄进入部署模式(无参数值)
- 8:己方英雄造成狙击伤害(参数值为累计造成狙击伤害数量)
- 9:对方英雄造成狙击伤害(参数值为累计造成狙击伤害数量)
- 10:己方呼叫空中支援(无参数值)
- 11:己方空中支援被打断(参数值为对方还剩余的可打断次数)
- 12:对方呼叫空中支援(无参数值)
- 13:对方空中支援被打断(参数值为己方还剩余的可打断次数)
- 14:飞镖命中(参数值为命中目标:1 前哨站,2 基地固定目标,3 基地随机固定目标,4 基地随机移动目标,5 基地末端移动目标)
- 15:双方飞镖闸门开启(参数值 1 为己方开启,2 为对方开启)
- 16:己方基地遭到攻击(无参数值,每次触发存在 5s 内置冷却)
- 17:双方前哨站停转(参数值 1 为己方前哨,2 为对方前哨)
- 18:双方基地护甲展开(参数值 1 为己方基地,2 为对方基地)
message Event {
int32 event_id = 1;
string param = 2;
}
2.2.8 RobotInjuryStat
用途:机器人一次存活期间累计受伤统计。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 该次存活累计受伤总计 |
| 2 | uint32 | 撞击伤害 |
| 3 | uint32 | 17mm 弹丸伤害 |
| 4 | uint32 | 42mm 弹丸伤害 |
| 5 | uint32 | 飞镖溅射伤害 |
| 6 | uint32 | 模块离线扣血 |
| 7 | uint32 | 异常离线扣血 |
| 8 | uint32 | 判罚扣血 |
| 9 | uint32 | 服务器强制使其战亡扣血 |
| 10 | uint32 | 击杀者 ID(若未检测到击杀者,值为 0) |
message RobotInjuryStat {
uint32 total_damage = 1;
uint32 collision_damage = 2;
uint32 small_projectile_damage = 3;
uint32 large_projectile_damage = 4;
uint32 dart_splash_damage = 5;
uint32 module_offline_damage = 6;
uint32 offline_damage = 7;
uint32 penalty_damage = 8;
uint32 server_kill_damage = 9;
uint32 killer_id = 10;
}
2.2.9 RobotRespawnStatus
用途:机器人复活状态同步。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | bool | 是否处于待复活状态 |
| 2 | uint32 | 复活所需总读条 |
| 3 | uint32 | 当前复活读条进度 |
| 4 | bool | 是否可以免费复活 |
| 5 | uint32 | 花费金币复活所需金币数 |
| 6 | bool | 是否允许花费金币复活 |
message RobotRespawnStatus {
bool is_pending_respawn = 1;
uint32 total_respawn_progress = 2;
uint32 current_respawn_progress = 3;
bool can_free_respawn = 4;
uint32 gold_cost_for_respawn = 5;
bool can_pay_for_respawn = 6;
}
2.2.10 RobotStaticStatus
用途:机器人固定属性和配置。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 连接状态(0=未连接,1=已连接) |
| 2 | uint32 | 上场状态(0=已上场,1=未上场) |
| 3 | uint32 | 存活状态(0=未知,1=存活,2=战亡) |
| 4 | uint32 | 机器人编号(见附录二) |
| 5 | uint32 | 机器人类型 |
| 6 | uint32 | 性能体系-发射机构(枚举值见下) |
| 7 | uint32 | 性能体系-底盘(枚举值见下) |
| 8 | uint32 | 当前等级 |
| 9 | uint32 | 最大血量 |
| 10 | uint32 | 最大热量 |
| 11 | float | 热量冷却速率(每秒) |
| 12 | uint32 | 最大功率 |
| 13 | uint32 | 最大缓冲能量 |
| 14 | uint32 | 最大底盘能量 |
performance_system_shooter 枚举值:
- 1:冷却优先
- 2:爆发优先
- 3:英雄近战优先
- 4:英雄远程优先
performance_system_chassis 枚举值:
- 1:血量优先
- 2:功率优先
- 3:英雄近战优先
- 4:英雄远程优先
message RobotStaticStatus {
uint32 connection_state = 1;
uint32 field_state = 2;
uint32 alive_state = 3;
uint32 robot_id = 4;
uint32 robot_type = 5;
uint32 performance_system_shooter = 6;
uint32 performance_system_chassis = 7;
uint32 level = 8;
uint32 max_health = 9;
uint32 max_heat = 10;
float heat_cooling_rate = 11;
uint32 max_power = 12;
uint32 max_buffer_energy = 13;
uint32 max_chassis_energy = 14;
}
2.2.11 RobotDynamicStatus
用途:机器人实时数据。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 当前血量 |
| 2 | float | 当前热量 |
| 3 | float | 上一次弹丸射速 |
| 4 | uint32 | 当前剩余底盘能量 |
| 5 | uint32 | 当前缓冲能量 |
| 6 | uint32 | 当前经验值 |
| 7 | uint32 | 距离下一次升级仍需获得的经验 |
| 8 | uint32 | 累计已发弹量 |
| 9 | uint32 | 剩余允许发弹量 |
| 10 | bool | 是否处于脱战状态 |
| 11 | uint32 | 脱战状态倒计时 |
| 12 | bool | 是否可以远程补血 |
| 13 | bool | 是否可以远程补弹 |
message RobotDynamicStatus {
uint32 current_health = 1;
float current_heat = 2;
float last_projectile_fire_rate = 3;
uint32 current_chassis_energy = 4;
uint32 current_buffer_energy = 5;
uint32 current_experience = 6;
uint32 experience_for_upgrade = 7;
uint32 total_projectiles_fired = 8;
uint32 remaining_ammo = 9;
bool is_out_of_combat = 10;
uint32 out_of_combat_countdown = 11;
bool can_remote_heal = 12;
bool can_remote_ammo = 13;
}
2.2.12 RobotModuleStatus
用途:机器人各模块运行状态(0=离线,1=在线,2=因安装不规范被视为离线)。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 电源管理模块状态 |
| 2 | uint32 | RFID 模块状态 |
| 3 | uint32 | 灯条模块状态 |
| 4 | uint32 | 17mm 发射机构状态 |
| 5 | uint32 | 42mm 发射机构状态 |
| 6 | uint32 | 定位模块状态 |
| 7 | uint32 | 装甲模块状态 |
| 8 | uint32 | 图传模块状态 |
| 9 | uint32 | 电容模块状态 |
| 10 | uint32 | 主控状态 |
| 11 | uint32 | 激光检测模块状态 |
message RobotModuleStatus {
uint32 power_manager = 1;
uint32 rfid = 2;
uint32 light_strip = 3;
uint32 small_shooter = 4;
uint32 big_shooter = 5;
uint32 uwb = 6;
uint32 armor = 7;
uint32 video_transmission = 8;
uint32 capacitor = 9;
uint32 main_controller = 10;
uint32 laser_detector = 11;
}
2.2.13 RobotPosition
用途:机器人空间坐标和朝向。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | float | 世界坐标 X 轴 |
| 2 | float | 世界坐标 Y 轴 |
| 3 | float | 世界坐标 Z 轴 |
| 4 | float | 本机器人测速模块的朝向,单位:度,正北为 0 度 |
message RobotPosition {
float x = 1;
float y = 2;
float z = 3;
float yaw = 4;
}
2.2.14 Buff
用途:Buff 效果信息。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 机器人 ID |
| 2 | uint32 | Buff 类型(枚举值见下) |
| 3 | int32 | Buff 增益值 |
| 4 | uint32 | Buff 最大剩余时间 |
| 5 | uint32 | Buff 剩余时间 |
buff 类型枚举值:
- 1:攻击增益
- 2:防御增益
- 3:射击热量冷却增益
- 4:底盘功率增益
- 5:回血增益
- 6:可兑换允许发弹量
- 7:地形跨越增益(预备)(指诸如检测到飞坡前半部分的场地交互模块,但未获取实际地形跨越增益的情况)
message Buff {
uint32 robot_id = 1;
uint32 buff_type = 2;
int32 buff_level = 3;
uint32 buff_max_time = 4;
uint32 buff_left_time = 5;
}
2.2.15 PenaltyInfo
用途:判罚信息同步。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 当前受罚类型(枚举值见下) |
| 2 | uint32 | 当前受罚效果时长(秒) |
| 3 | uint32 | 当前判罚数量 |
penalty_type 枚举值:
- 1:黄牌
- 2:双方黄牌
- 3:红牌
- 4:超功率
- 5:超热量
- 6:超射速
message PenaltyInfo {
uint32 penalty_type = 1;
uint32 penalty_effect_sec = 2;
uint32 total_penalty_num = 3;
}
2.2.16 RobotPathPlanInfo
用途:哨兵轨迹规划信息。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 哨兵意图(1=攻击,2=防守,3=移动) |
| 2 | uint32 | 起始点 X 坐标(分米) |
| 3 | uint32 | 起始点 Y 坐标(分米) |
| 4 | repeated int32 | 相对起始点 X 增量数组(-128~+127,长度 49) |
| 5 | repeated int32 | 相对起始点 Y 增量数组(-128~+127,长度 49) |
| 6 | uint32 | 发送者 ID |
message RobotPathPlanInfo {
uint32 intention = 1;
uint32 start_pos_x = 2;
uint32 start_pos_y = 3;
repeated int32 delta_x = 4;
repeated int32 delta_y = 5;
uint32 sender_id = 6;
}
2.2.17 MapClickInfoNotify
用途:云台手地图点击标记。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 发送范围(0=指定客户端,1=除哨兵,2=包含哨兵) |
| 2 | bytes | 目标机器人 ID 列表(固定 7 字节,如发送给自己方英雄和工程机器人,红方需要填入 1, 2;蓝方需要填入 101, 102,后续填 0) |
| 3 | uint32 | 标记类型(1=攻击,2=防御,3=警戒,4=自定义) |
| 4 | uint32 | 标定的对方 ID |
| 5 | uint32 | 自定义图标 ASCII 码 |
| 6 | uint32 | 标记模式(1=地图,2=对方机器人) |
| 7 | uint32 | 屏幕坐标 X(像素) |
| 8 | uint32 | 屏幕坐标 Y(像素) |
| 9 | float | 地图坐标 X |
| 10 | float | 地图坐标 Y |
message MapClickInfoNotify {
uint32 is_send_all = 1;
bytes robot_id = 2;
uint32 mode = 3;
uint32 enemy_id = 4;
uint32 ascii = 5;
uint32 map_mode = 6;
uint32 screen_x = 7;
uint32 screen_y = 8;
float map_x = 9;
float map_y = 10;
}
2.2.18 RadarInfoToClient
用途:雷达发送的机器人位置信息。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 目标机器人 ID |
| 2 | float | 目标位置 X(米) |
| 3 | float | 目标位置 Y(米) |
| 4 | float | 朝向角度 |
| 5 | uint32 | 是否特殊标识(0=否;1=是;2=是,但目标机器人此时定位模块为离线状态) |
message RadarInfoToClient {
uint32 target_robot_id = 1;
float target_pos_x = 2;
float target_pos_y = 3;
float forward_angle = 4;
uint32 is_high_light = 5;
}
2.2.19 CustomByteBlock
用途:自定义数据流(机器人端对应 0x0310)。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | bytes | 最大为 2.4 kbit 的自定义数据包 |
message CustomByteBlock {
bytes data = 1;
}
2.2.20 AssemblyCommand
用途:工程装配指令。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 装配操作类型(1=确认装配,2=取消装配) |
| 2 | uint32 | 选中的装配难度 |
message AssemblyCommand {
uint32 operation = 1;
uint32 difficulty = 2;
}
2.2.21 TechCoreMotionStateSync
用途:科技核心运动状态同步。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 当前可选择的最高装配难度等级 |
| 2 | uint32 | 科技核心状态(枚举值见下) |
| 3 | uint32 | 对方科技核心状态(仅己方四级装配可用时有效,0=对方没有正在装配,1=对方正在装配非四级难度,2=对方正在装配四级难度) |
| 4 | uint32 | 己方装配总剩余时长(仅己方正在四级装配时有效) |
| 5 | uint32 | 己方单个步骤装配间隔剩余时长(仅己方正在四级装配时有效) |
status 枚举值:
- 1:未进入装配状态
- 2:已选择装配难度,科技核心移动中
- 3:科技核心移动完成,可进行首个装配步骤
- 4:上一个装配步骤已完成,可进行下一个装配步骤
- 5:装配步骤已全部完成
- 6:已确认装配,科技核心移动中
message TechCoreMotionStateSync {
uint32 maximum_difficulty_level = 1;
uint32 status = 2;
uint32 enemy_core_status = 3;
uint32 remain_time_all = 4;
uint32 remain_time_step = 5;
}
2.2.22 RobotPerformanceSelectionCommand
用途:地面机器人选择性能体系或控制方式。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 发射机构性能体系(枚举值同 RobotStaticStatus) |
| 2 | uint32 | 底盘性能体系(枚举值同 RobotStaticStatus) |
| 3 | uint32 | 哨兵控制方式(0=自动控制,1=半自动控制) |
message RobotPerformanceSelectionCommand {
uint32 shooter = 1;
uint32 chassis = 2;
uint32 sentry_control = 3;
}
2.2.23 RobotPerformanceSelectionSync
用途:步兵/英雄性能体系状态同步。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 发射机构性能体系 |
| 2 | uint32 | 底盘性能体系 |
| 3 | uint32 | 哨兵控制方式选择 |
message RobotPerformanceSelectionSync {
uint32 shooter = 1;
uint32 chassis = 2;
uint32 sentry_control = 3;
}
2.2.24 CommonCommand
用途:机器人多种常用指令。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 指令类型(枚举值见下) |
| 2 | uint32 | 参数 |
cmd_type 枚举值:
- 1:兑换 17mm 发弹量(仅剩余金币足以兑换时有效;参数值必须为 10 的倍数)
- 2:兑换 42mm 发弹量(仅剩余金币足以兑换时有效)
- 3:确认复活(若此时复活读条完成将立即复活)
- 4:兑换立即复活(若此时符合规则要求,则会立即消耗金币兑换立即复活)
- 5:远程兑换允许发弹量(若此时符合规则要求,则会立即消耗金币远程兑换允许发弹量)
- 6:远程兑换血量(若此时符合规则要求,则会立即消耗金币远程兑换血量)
message CommonCommand {
uint32 cmd_type = 1;
uint32 param = 2;
}
2.2.25 HeroDeployModeEventCommand
用途:英雄部署模式指令。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 模式(0=退出,1=进入) |
message HeroDeployModeEventCommand {
uint32 mode = 1;
}
2.2.26 DeployModeStatusSync
用途:英雄部署模式状态同步。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 当前部署模式状态(0=未部署,1=已部署) |
message DeployModeStatusSync {
uint32 status = 1;
}
2.2.27 RuneActivateCommand
用途:能量机关激活指令。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 激活(1=开启) |
message RuneActivateCommand {
uint32 activate = 1;
}
2.2.28 RuneStatusSync
用途:能量机关状态同步。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 当前能量机关状态(枚举值见下) |
| 2 | uint32 | 当前已激活的灯臂数量 |
| 3 | uint32 | 总环数 |
rune_status 枚举值:
- 1:未激活
- 2:正在激活
- 3:已激活
message RuneStatusSync {
uint32 rune_status = 1;
uint32 activated_arms = 2;
uint32 total_rings = 3;
}
2.2.29 SentryStatusSync
用途:哨兵姿态和弱化状态。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 姿态 ID(1=进攻姿态,2=防御姿态,3=移动姿态) |
| 2 | bool | 是否弱化 |
message SentryStatusSync {
uint32 posture_id = 1;
bool is_weakened = 2;
}
2.2.30 DartCommand
用途:飞镖控制指令。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 目标 ID(1=前哨站,2=基地固定目标,3=基地随机固定目标,4=基地随机移动目标,5=基地末端移动目标) |
| 2 | bool | 闸门开关 |
| 3 | bool | 是否确认发射(默认为 0,1=确认发射) |
message DartCommand {
uint32 target_id = 1;
bool open = 2;
bool confirm_launch = 3;
}
2.2.31 DartSelectTargetStatusSync
用途:飞镖目标选择状态同步。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 目标 ID |
| 2 | uint32 | 闸门状态(0=关闭,1=开启中,2=已开启) |
message DartSelectTargetStatusSync {
uint32 target_id = 1;
uint32 open = 2;
}
2.2.32 SentryCtrlCommand
用途:哨兵控制指令请求。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 指令编号(枚举值见下) |
指令编号枚举值:
- 1:补血点补弹
- 2:补给站实体补弹
- 3:远程补弹
- 4:远程回血
- 5:确认复活
- 6:确认花费金币复活
- 7:地图标点
- 8:切换为进攻姿态
- 9:切换为防御姿态
- 10:切换为移动姿态
message SentryCtrlCommand {
uint32 command_id = 1;
}
2.2.33 SentryCtrlResult
用途:哨兵控制指令结果反馈。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 对应的指令编号 |
| 2 | uint32 | 执行结果码(0=成功,其他=失败) |
message SentryCtrlResult {
uint32 command_id = 1;
uint32 result_code = 2;
}
2.2.34 AirSupportCommand
用途:空中支援指令。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 指令类型(枚举值见下) |
command_id 枚举值:
- 1:免费呼叫空中支援
- 2:花费金币呼叫空中支援(仍优先使用免费时长)
- 3:中断空中支援
message AirSupportCommand {
uint32 command_id = 1;
}
2.2.35 AirSupportStatusSync
用途:空中支援状态反馈。
| 数据编号 | 数据类型 | 数据用途 |
|---|---|---|
| 1 | uint32 | 空中支援状态(0=未进行,1=正在空中支援) |
| 2 | uint32 | 免费空中支援剩余时间 |
| 3 | uint32 | 付费空中支援已花费金币 |
| 4 | uint32 | 当前激光检测模块是否正在检测到被照射(0=未被照射,1=被照射) |
| 5 | uint32 | 空中机器人被反制状态(0=发射机构因雷达反制而被锁定,1=发射机构正常) |
message AirSupportStatusSync {
uint32 airsupport_status = 1;
uint32 left_time = 2;
uint32 cost_coins = 3;
uint32 laser_detected = 4;
uint32 shooter_status = 5;
}
附录二:ID 编号说明
机器人 ID 编号
- 1 :红方英雄机器人
- 2 :红方工程机器人
- 3/4/5:红方步兵机器人(与机器人 ID 3~5 对应)
- 6 :红方空中机器人
- 7 :红方哨兵机器人
- 8 :红方飞镖
- 9 :红方雷达
- 10 :红方前哨站
- 11 :红方基地
- 101:蓝方英雄机器人
- 102:蓝方工程机器人
- 103/104/105:蓝方步兵机器人(与机器人 ID 3~5 对应)
- 106:蓝方空中机器人
- 107:蓝方哨兵机器人
- 108:蓝方飞镖
- 109:蓝方雷达
- 110:蓝方前哨站
- 111:蓝方基地
选手端 ID
- 0x0101:红方英雄机器人选手端
- 0x0102:红方工程机器人选手端
- 0x0103/0x0104/0x0105:红方步兵机器人选手端(与机器人 ID 3~5 对应)
- 0x0106:红方空中机器人选手端
- 0x016A:蓝方空中机器人选手端
- 0x0165:蓝方英雄机器人选手端
- 0x0166:蓝方工程机器人选手端
- 0x0167/0x0168/0x0169:蓝方步兵机器人选手端(与机器人 ID 3~5 对应)
- 0x8080:裁判系统服务器(用于哨兵和雷达自主决策指令)
附录三:自定义客户端示例通信代码
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Diagnostics;
using MQTTnet.Protocol;
using MQTTnet.Server;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
/// <summary>
/// MQTT客户端
/// </summary>
public class MyMqttClient {
private IMqttClient m_MqttClient = null;
private string m_ClientID;
/// <summary>
/// 创建客户端并连接服务器
/// </summary>
/// <param name="clientID"></param>
/// <param name="ip"></param>
/// <param name="port"></param>
public MyMqttClient(string clientID, string ip = "127.0.0.1", int port = 3333) {
m_ClientID = clientID;
// 客户端选项生成器
var options = new MqttClientOptionsBuilder()
.WithClientId(m_ClientID)
.WithTcpServer(ip, port)
.Build();
// 创建客户端
m_MqttClient = new MqttFactory().CreateMqttClient();
// 监测客户端连接/断开连接完成
m_MqttClient.ConnectedAsync += ClientConnected;
m_MqttClient.DisconnectedAsync += ClientDisConnected;
// 客户端接收到消息
m_MqttClient.ApplicationMessageReceivedAsync += ReceiveMsg;
// 连接服务器
m_MqttClient.ConnectAsync(options);
}
/// <summary>
/// 接收到消息
/// </summary>
private Task ReceiveMsg(MqttApplicationMessageReceivedEventArgs args) {
Debugger.Log(DEBUGLOGENUM.CustomClient, $"recv topic: {args.ApplicationMessage.Topic}");
// 消息post出现,以免出现消息堵塞
MqttSubProtoEvent ev = new MqttSubProtoEvent();
ev.topic = args.ApplicationMessage.Topic;
ev.data = args.ApplicationMessage.Payload;
ThreadPool.CustomClientLoop.PostEvent(ev);
return Task.CompletedTask;
}
/// <summary>
/// 断开连接完成
/// </summary>
private Task ClientDisConnected(MqttClientDisconnectedEventArgs args) {
return Task.CompletedTask;
}
/// <summary>
/// 连接完成
/// </summary>
private Task ClientConnected(MqttClientConnectedEventArgs args) {
Subscribe("KeyboardMouseControl");
Subscribe("CustomControl");
return Task.CompletedTask;
}
/// <summary>
/// 发布消息
/// </summary>
public void PublishMsg(string topic, string message, MqttQualityOfServiceLevel level = MqttQualityOfServiceLevel.ExactlyOnce, bool isRetain = false) {
long unixUs = DateTime.UtcNow.Ticks / 10; // 微秒级
m_MqttClient.PublishStringAsync(topic, message, level, isRetain);
}
/// <summary>
/// 发布消息(字节数组)
/// </summary>
public void PublishBytesMsg(string topic, byte[] message, MqttQualityOfServiceLevel level = MqttQualityOfServiceLevel.ExactlyOnce, bool isRetain = false) {
long unixUs = DateTime.UtcNow.Ticks / 10; // 微秒级
m_MqttClient.PublishBinaryAsync(topic, message, level, isRetain);
}
/// <summary>
/// 订阅主题
/// </summary>
public void Subscribe(string topic) {
m_MqttClient.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic(topic).Build());
}
}