Skip to content

自定义客户端协议

概述

自定义客户端的数据流格式为 Protobuf v3(Protocol Buffers),采用 MQTT 作为发布/订阅消息传输协议。MQTT 直接传输 Protobuf 序列化的二进制流。topic 为对应的指令名。

  • 服务器 IP 地址:192.168.12.1
  • 端口:3333
  • 自定义客户端 IP 地址:DHCP 自动分配

通信流程

  1. 结合文档中的 Protobuf 消息格式编写 .proto 文件,用 protoc 生成不同语言的类代码;
  2. 在发布者端,将对象序列化成二进制;
  3. 通过 MQTT publish 把二进制发送到对应 Topic;
  4. 在订阅者端,接收消息并用 Protobuf 反序列化。

示例代码见附录三,其中 MyMqttClientclientID 需填入所连接机器人对应的 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());
    }
}