

©️版权声明
本协议是 瞳赋® Tofu Intelligence® 独家财产,受版权法和条约的保护,未经授权不得转载或复制他用。
协议提供对接测试客户端与源码,方便客户快速应用。
TJSON测试软件说明:

部分功能说明:
🟢图像抓拍: 点选“显示抓拍图像”,并启动“抓拍上传开”后抓拍图像存储到软件所在目录中,如下图所示。

🟢保存数据: 开始接收/发送数据后点选“保存数据”,数据将保存到软件所在目标 log文件夹下,可查看数据发送/接收的16进制原始数据。
🟢数据透传: 透传数据包括PELCO_D,VISCA,VISCA_IR三种模式,分别对应云台、可见光相机、热红外相机通道,详细说明请查看本页4.2.2章节。
支持数据循环发送。
本协议规定了AI端与操控端、AI端与吊舱之间的通信方式和协议。
⚠️注意,本协议中所指的吊舱专指Tofu型号吊舱,其他吊舱与云台不适用PV协议通信方式。
本协议适用于任何操作系统,可用于客户端软件的二次开发。

(非吊舱用户请忽略此部分🔻)
AI端在运行过程中直接控制云台和镜头。AI端作为服务器端(Server端),吊舱与镜头控制端作为客户端(Client端),AI端口号为8090。采用PelcoD协议与VISCA协议,以下简称PV协议。控制与查询周期默认为200ms一次。若您使用云台相机,此部分可忽略,只需要使用JSON协议即可,网络通信全部基于TCP/IP方式。
(非吊舱用户请忽略此部分🔺)
操控端中支持AI端的算法模式切换与参数配置;识别、跟踪过程中信息接收;云台与镜头的手动控制,AI端作为服务器端(Server端),操控端作为客户端(Client端),AI端口号为8089。采用JSON协议。所有JSON数据上下帧间隔不得小于100毫秒。
AI端采用 RTSP 协议传输视频,视频默认采用H.264编码(可通过T-JSON协议控制修改为H.265),端口号为554。当AI相机节点开机时即启动RTSP Server等待视频点播。操控终端需要查看视频时,通过 RTSP URL 的形式点播视频。T-JSON协议不包含视频流部分,视频流解析请自行使用RTSP视频解析方式,暂不提供此部分相关代码与技术支持。
网络链路中,所有连接到AI端的设备都必须遵循心跳帧规则。
(非吊舱用户请忽略此节)
AI端与吊舱采用PV协议通信,其中云台运动与查询相关指令采用PelcoD协议,镜头变倍、聚焦、查询相关指令采用VISCA协议。
通信不包含其他指令之外的数据,直接通过网络端口发送接收即可。此处列举几个常用协议指令,完整协议请参考 PelcoD云台控制与VISCA镜头控制协议文档。若您使用云台相机,此部分可忽略,只需要使用JSON协议即可。
T-JSON通信协议适用于客户端与AI端之间的通信,用于控制和配置AI端,获取AI端的状态消息,以及手动控制云台和镜头,获取目标截图。
T-JSON协议分为JSON指令协议与图像抓拍协议,均通过同一个8089端口进行通信。
以下数据帧说明中,Tofu产品代表服务器端,客户端软件/平台软件代表客户端。
🟢 JSON指令 协议格式:
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 见帧类型表 | 帧内容长度N | JSON |
帧类型表:
| 帧类型 | 类型名 | 格式 | 章节 |
|---|---|---|---|
| 0xEB 0x92 0x04(S→C) | 图像抓拍 | JPEG Socket | 3.1 |
| 0xEB 0x90 0x0D(S→C) | 48M-Tofu7图像 | JPEG Socket | 3.2 |
| 0x01(S→C) | 状态帧 | JSON | 4.1 |
| 0x03(C→S) | 控制指令 | JSON | 4.2 |
| 0x05(C→S→C) | 查询图像信息 | JSON | 4.3 |
| 0x06(C→S) | 设置目标检测区域 | JSON | 4.4 |
| 0x20(C→S) | 设置设备经纬度 | JSON | 4.5 |
| 0x07(C→S) | 设置显示模式 | JSON | 4.6 |
| 0x0A(C→S) | 设置数字变倍开关 | JSON | 4.7 |
| 0x0B(C→S) | 设置位置复位开关 | JSON | 4.8 |
| 0x08(C→S) | 设置算法模型 | JSON | 4.9 |
| 0x09(C→S) | 设置目标截图状态 | JSON | 4.10 |
| 0x0C(C→S) | 查询48M-Tofu7参数 | JSON | 4.11 |
| 0x0D(C→S) | 设置48M-Tofu7参数 | JSON | 4.12 |
| 0x0E(C→S) | 查询48M-Tofu7屏蔽区域 | JSON | 4.13 |
| 0x0F(C→S) | 设置48M-Tofu7屏蔽区域 | JSON | 4.14 |
| 0x12(双向) | ACK | Socket | 5.1 |
| 0x11(双向) | 心跳 | Socket | 5.2 |
S→C: 设备到客户端
C→S: 客户端到设备
C→S→C:客户端向设备查询,设备回复
双向:客户端查询,设备回复
🟢 图像抓拍 协议格式:
开启图像抓拍(目标截图)功能后,识别后的目标区域截图会以Socket方式与JSON同一个端口实时发送。 目标图像抓拍为每个目标单独组包,发送周期为300ms (Tofu6/7 抓拍间隔为150ms)。例如,图像中有3个目标,协议将发送三个独立的Socket包。
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 位置信息 | 帧内容 | 帧校验 | 帧尾标识1 | 帧尾标识2 |
|---|---|---|---|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | 8Byte | N Byte | 1Byte | 1Byte | 1Byte |
| 0xEB | 0x92 | 0x04 | JPEG Size | Location | JPEG | Sum | 0xFB | 0x92 |
位置信息: 截取图像在原始图像中的坐标位置,其中按顺序包括左X-coordinate(2Byte)、上Y-coordinate(2Byte),截取图像的宽Width(2Byte)、高Height(2Byte)。Coordinate坐标原点在画面的左上角,为(X=1,Y=1)。
帧长度: JPEG图像数据的Byte数量,对应上表的 N。
帧校验: 0xEB+0x92+0x04+帧长度 的7Byte 合校验。
🟢 48M-Tofu7 图像协议格式:
此协议仅适用于 48M-Tofu7。
48M-Tofu7 需要查阅 4.1.1, 4.11~4.14, 5.1~5.2章节, 已在文件中用 深蓝色 标记标题。
48M-Tofu7 以 JPG图片文件方式传输TCP数据,端口号为独立的 8091,设备端为 TCP Server。
| 标识码 1 |
标识码 2 |
标识码 3 |
帧头 | 图片数据 | 帧校验 | 帧尾 标识1 |
帧尾 标识2 |
帧尾 标识3 |
|---|---|---|---|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 22Byte | NByte | 1Byte | 1Byte | 1Byte | 1Byte |
| 0xEB | 0x90 | 0x0D | 见帧头 信息表 |
JPG数据 | 帧头前10字节 合校验 |
0xEB | 0x90 | 0x0A |
帧头信息表:
| 全帧图片 序号 |
全帧数据包 总大小 |
全帧数据 分包数量 |
当前数据 Byte数 |
当前数据 包号 |
当前数据 偏移字节数 |
|---|---|---|---|---|---|
| 8Byte | 4Byte | 2Byte | 2Byte | 2Byte | 4Byte |
为保障百兆网络环境中数据无阻塞,仅推送识别当前帧的图像数据。
一帧全图将分成若干个单包不大于1400Byte 的小包进行传输,接收后进行全图重组。
同一张全帧图像的分包数据中帧头信息表的头部14个Byte应保持一致。
当前数据包号从0开始,帧头信息变量数据采用 little-endian方式。
全帧图片序号与目标信息发送的48M图像序号相对应,序号以5作为间隔(对应识别帧)。
AI运行过程信息推送包括算法信息与设备状态信息。
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x01 | 帧内容长度N | JSON |
算法信息JSON结构说明:
| Key | Disp. | Value | Type |
|---|---|---|---|
| ControlType | 控制类型 | AIInfo | String |
| WorkMode | 工作模式 | 0x00:关闭AI 0x01:识别 0x02:自动跟踪 0x03:点选跟踪 0x04:波门/框选跟踪🪄 |
Int |
| ObjectCount | 目标总数 | N | Int |
| Index 🪄 | 48M图像序号 | N | Int |
| Object | 目标信息 | 见下表 | JSON |
🪄
波门跟踪是固定尺寸大小正方形区域的框选跟踪。
🪄
Index信息仅在 48M-Tofu7 产品里使用。
Object格式说明:
| Key | Disp. | Value | Type |
|---|---|---|---|
| Class | 目标类型🪄1 | 0xA1:人/飞机,0xA2:车/直升机, 0xA3:船/鸟,0xA4:无人机, 0xB1:跟踪正常, 0xB2:跟踪丢失 |
Int |
| Point | 位置信息🪄2 | Left:左X, Top:上Y, Right:右X, Bottom:下Y |
Int |
| Distance | 距离信息🪄3 | N | Double |
| Angle | 角度信息🪄4 | Hor:水平角度 Ver:垂直角度 |
Double |
| TrackChain | 跟踪链数组🪄5 | 仅在 48M-Tofu7 中使用,数组元素同Point信息格式, 当前帧下的坐标信息放置于数组末尾 |
Array |
🪄1
目标类型最多为4个类,编号对应名称根据选择的模型变化。
🪄2
Point目标框的位置,左上角为零点0,0。
取值范围:
可见光:Left、Right 0-1919;Top、Bottom 0-1079。
热红外:Left、Right 0-719;Top、Bottom 0-575。
当跟踪状态时只推送跟踪目标的坐标,当跟踪丢失时坐标均为0,0,0,0。
🪄3
非所有设备具备Distacne信息,若有,单位为 m(米),保留小数点后一位。
🪄4
Angle角度信息默认关闭,仅支持部分整机类设备,以云台原点为(0°,0°),单位为 °(度),保留小数点后一位。
🪄5
48M-Tofu7 中识别/跟踪的新目标将增加 Object ID 编号推送,范围是1-65535,超出范围后重新从1计数。
JSON目标识别推送示例:
{
"ControlType": "AIInfo", // 控制类型,表示这是一个 AI 算法信息推送
"WorkMode": 1, // 工作模式,0x01 表示识别模式
"ObjectCount": 2, // 目标总数,表示当前检测到的目标数量
"Object": { // 目标信息集合,每个目标用一个唯一的 ID 标识
"01": { // 目标 ID 为 "01"
"Class": 161, // 目标类型,0xA1 表示人
"Points": { // 目标在图像中的位置信息(坐标框)
"Left": 100, // 目标框左上角的 X 坐标
"Top": 100, // 目标框左上角的 Y 坐标
"Right": 200, // 目标框右下角的 X 坐标
"Bottom": 200 // 目标框右下角的 Y 坐标
},
"Distance": 1066.0, // 目标距离(单位:米)
"Angle":{ // 目标方位(单位:度)
"Hor": 12.3,
"Ver": 1.3
}
},
"02": { // 目标 ID 为 "02"
"Class": 162, // 目标类型,0xA2 表示车
"Points": { // 目标在图像中的位置信息(坐标框)
"Left": 300, // 目标框左上角的 X 坐标
"Top": 100, // 目标框左上角的 Y 坐标
"Right": 400, // 目标框右下角的 X 坐标
"Bottom": 200 // 目标框右下角的 Y 坐标
},
"Distance": 1182.0, // 目标距离(单位:米)
"Angle":{ // 目标方位(单位:度)
"Hor": 17.1,
"Ver": -1.0
}
}
}
}
48M-Tofu7 JSON目标识别推送示例:
{
"ControlType": "AIInfo", // 控制类型,表示这是一个 AI 算法信息推送
"WorkMode": 1, // 工作模式,0x01 表示识别模式
"ObjectCount": 3, // 目标总数,表示当前检测到的目标数量
"Index": 32240, // 48M图像序号
"Object": { // 目标信息集合,每个目标用一个唯一的 ID 标识
"01": { // 目标 ID 为 "01"
"Class": 164, // 目标类型,0xA4 表示无人机
"Points": { // 当前帧目标在图像中的位置信息(坐标框)
"Left": 400, // 目标框左上角的 X 坐标
"Top": 1200, // 目标框左上角的 Y 坐标
"Right": 420, // 目标框右下角的 X 坐标
"Bottom": 1220 // 目标框右下角的 Y 坐标
},
"TrackChain": [ // 跟踪链数组,按时间顺序存储跟踪点
{ // 跟踪链 0 位置坐标
"Left": 400, // 目标框左上角的 X 坐标
"Top": 1200, // 目标框左上角的 Y 坐标
"Right": 420, // 目标框右下角的 X 坐标
"Bottom": 1220 // 目标框右下角的 Y 坐标
}
]
},
"02": { // 目标 ID 为 "02"
"Class": 164, // 目标类型,0xA4 表示无人机
"Points": { // 当前帧目标在图像中的位置信息(坐标框)
"Left": 1600, // 目标框左上角的 X 坐标
"Top": 4900, // 目标框左上角的 Y 坐标
"Right": 1620, // 目标框右下角的 X 坐标
"Bottom": 4930 // 目标框右下角的 Y 坐标
},
"TrackChain": [ // 跟踪链数组,按时间顺序存储跟踪点
{ // 跟踪链 0 位置坐标
"Left": 1950, // 目标框左上角的 X 坐标
"Top": 4950, // 目标框左上角的 Y 坐标
"Right": 1970, // 目标框右下角的 X 坐标
"Bottom": 4970 // 目标框右下角的 Y 坐标
},
{ // 跟踪链 1 位置坐标
"Left": 1800, // 目标框左上角的 X 坐标
"Top": 4960, // 目标框左上角的 Y 坐标
"Right": 1820, // 目标框右下角的 X 坐标
"Bottom": 4980 // 目标框右下角的 Y 坐标
},
{ // 跟踪链 2 位置坐标
"Left": 1700, // 目标框左上角的 X 坐标
"Top": 4990, // 目标框左上角的 Y 坐标
"Right": 1720, // 目标框右下角的 X 坐标
"Bottom": 5010 // 目标框右下角的 Y 坐标
},
{ // 跟踪链 3 位置坐标
"Left": 1600, // 目标框左上角的 X 坐标
"Top": 4900, // 目标框左上角的 Y 坐标
"Right": 1620, // 目标框右下角的 X 坐标
"Bottom": 4930 // 目标框右下角的 Y 坐标
}
]
},
"03": { // 目标 ID 为 "03"
"Class": 164, // 目标类型,0xA4 表示无人机
"Points": { // 当前帧目标在图像中的位置信息(坐标框)
"Left": 3300, // 目标框左上角的 X 坐标
"Top": 1500, // 目标框左上角的 Y 坐标
"Right": 3400, // 目标框右下角的 X 坐标
"Bottom": 1600 // 目标框右下角的 Y 坐标
},
"TrackChain": [ // 跟踪链数组,按时间顺序存储跟踪点
{ // 跟踪链 0 位置坐标
"Left": 3180, // 目标框左上角的 X 坐标
"Top": 1550, // 目标框左上角的 Y 坐标
"Right": 3260, // 目标框右下角的 X 坐标
"Bottom": 1640 // 目标框右下角的 Y 坐标
},
{ // 跟踪链 1 位置坐标
"Left": 3300, // 目标框左上角的 X 坐标
"Top": 1500, // 目标框左上角的 Y 坐标
"Right": 3400, // 目标框右下角的 X 坐标
"Bottom": 1600 // 目标框右下角的 Y 坐标
}
]
}
}
}
在跟踪过程中推送JSON示例:
{
"ControlType": "AIInfo", // 控制类型,表示这是一个 AI 算法信息推送
"WorkMode": 2, // 工作模式,0x02 表示自动跟踪模式
"ObjectCount": 1, // 目标总数,表示当前检测到的目标数量为 1
"Object": { // 目标信息集合,包含每个检测到的目标的详细信息
"01": { // 目标 ID 为 "01",跟踪时仅推送跟踪目标坐标
"Class": 177, // 目标类型,0xB1 表示跟踪正常(具体分类需根据实际定义)
"Points": { // 目标在图像中的位置信息(坐标框)
"Left": 220, // 目标框左上角的 X 坐标
"Top": 450, // 目标框左上角的 Y 坐标
"Right": 250, // 目标框右下角的 X 坐标
"Bottom": 490 // 目标框右下角的 Y 坐标
},
"Distance": 1055.0, // 目标距离(单位:米),表示目标距离相机的距离
"Angle":{ // 目标方位(单位:度)
"Hor": 122.8,
"Ver": -30.9
}
}
}
}
设备状态信息JSON结构说明:
| Key | Name | Value | Type | Disp. |
|---|---|---|---|---|
| ControlType | 控制类型 | ZoomInfo | String | |
| ZoomInfo | 镜头倍率 | 精确到小数点后一位/两位 | Double | |
| ZoomInfoIR | 热红外镜头倍率 | 精确到小数点后一位/两位 | Double | 非双光输入设备,无此项 |
| PTZInfoH | 云台横向角度 | 精确到小数点后一位/两位 | Double | 需串口服务器 |
| PTZInfoV | 云台垂直角度 | 精确到小数点后一位/两位 | Double | 需串口服务器 |
| LaserRange | 测距🪄1 | 精确到小数点后一位 | Double | 部分设备支持 |
| CamShowMode | 相机显示模式 | 0:彩色;1:黑白 | Int | 部分设备支持 |
| Latitude | 纬度🪄1 | 精确到小数点后七位+N/S | String | 部分设备支持 |
| Longitude | 经度🪄1 | 精确到小数点后七位+E/W | String | 部分设备支持 |
| Height | 高度🪄1 | 精确到小数点后一位 | Double | 部分设备支持 |
🪄1
经纬度、测距等信息需要设备支持,非所有设备自带此功能,默认关闭。传递经纬度、测距信息至设备的协议详见 T-Ser协议
JSON示例:
{
"ControlType": "ZoomInfo", // 控制类型,表示这是一个设备状态信息推送
"ZoomInfo": 3.6, // 镜头倍率
"ZoomInfoIR": 1.5, // 热红外镜头倍率,非双光输入无此项
"PTZInfoH": -50.3, // 云台横向角度
"PTZInfoV": 16.4, // 云台垂直角度
"LaserRange": 810.0, // 测距信息,表示激光测距的结果,单位为米
"CamShowMode": 0, // 相机显示模式,0 表示彩色模式
"Latitude": "39.8365025N", // 纬度信息,N 表示北纬
"Longitude": "116.2874531E",// 经度信息,E 表示东经
"Height": 589.0 // 高度信息
}
包含工作模式配置与数据透传。
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x03 | 帧内容长度N | JSON |
工作模式配置指令格式:
| Key | Disp. | Value | Type |
|---|---|---|---|
| ControlType | 控制类型 | SetWorkMode | String |
| SetWorkMode | 工作模式 | 0x00:关闭AI 0x01:识别 0x02:自动跟踪 0x03:点选跟踪 0x04:波门/框选跟踪 0x05:自动变焦开🪄1 0x06:自动变焦关 |
Int |
| P2Track | 配置 | 下表说明 | Int |
🪄1
自动变焦功能是指跟踪过程中随目标大小自动变焦的功能。
P2Track配置在点选跟踪、波门/框选跟踪时需要。具体说明如下表。
| Key | Disp. | Value | Type |
|---|---|---|---|
| Center | 中心点🪄1 | X:横坐标,Y:纵坐标 | Int |
| Distance | 搜索范围/区域大小🪄2 | N | Int |
| DistanceX | 搜索范围/区域大小🪄2 | N | Int |
| DistanceY | 搜索范围/区域大小🪄2 | N | Int |
🪄1
画面左上为1,1源点;Center对应目标中心点坐标。
🪄2
点选跟踪模式下默认Distacne=30;
波门/框选跟踪模式下可使用Distance(跟踪框为正方形)或DistanceX/Y(跟踪框为任意大小长方形)。
JSON示例:
{
"ControlType": "SetWorkMode", // 控制类型
"SetWorkMode": 1 // 设置的工作模式,0x01 表示识别模式
}
P2Track信息仅在点选跟踪模式与波门跟踪模式下输入,点选跟踪需要提供点击的坐标,Distance默认用30,如果坐标在识别到的目标区域内即会锁定跟踪。
波门跟踪提供的是中心坐标与跟踪框宽度(高度)信息。
点选跟踪JSON示例:
{
"ControlType": "SetWorkMode", // 控制类型
"SetWorkMode": 3, // 设置的工作模式,0x03 表示点选跟踪模式
"P2Track": { // 点选跟踪配置
"Center": { // 目标中心点的坐标
"X": 310, // 目标中心点的 X 坐标
"Y": 660 // 目标中心点的 Y 坐标
},
"Distance": 64 // 搜索范围,表示以中心点为中心的搜索半径
}
}
框选跟踪JSON示例:
{
"ControlType": "SetWorkMode", // 控制类型
"SetWorkMode": 4, // 设置的工作模式,0x04 表示波门/框选跟踪模式
"P2Track": { // 波门/框选跟踪配置
"Center": { // 目标中心点的坐标
"X": 240, // 目标中心点的 X 坐标
"Y": 330 // 目标中心点的 Y 坐标
},
"DistanceX": 36, // 跟踪区域的宽度
"DistanceY": 28 // 跟踪区域的高度
}
}
数据透传指令格式:
| Key | Disp. | Value | Type |
|---|---|---|---|
| ControlType | 控制类型 | SerialControl | String |
| SerialType | 串口选择🪄1 | PELCO_D:云台485 VISCA:可见光 VISCAIR:红外🪄2 |
String |
| SerialData | 数据 | Lens:数据长度 Data:数据内容 |
Int String |
🪄1
可见光设备中SerialType选择PELCO_D则数据会发送至云台,选择VISCA则数据发送至相机。
🪄2
在使用Tofu提供的LIR热红外机芯时, 使用 SerialType=VISCA,
实际指令采用PELCO_D协议发送,此时注意发送的PELCO_D协议的 ID号需要改为 0x02。
双光输入(Tofu6)的设备中,热红外机芯透传请使用 SerialType=VISCAIR。
Pelco-D与VISCA指令协议详见,[PELCO-D云台控制与VISCA镜头控制协议]。
Pelco-D透传接口也可以用来发送[非标ExPelco-D高精度云台控制协议] (需云台支持)。
JSON示例:
{
"ControlType": "SerialControl", // 控制类型,表示这是一条用于串口通信控制的指令
"SerialType": "PELCO_D", // 串口协议类型,指定使用 PELCO-D 协议
"SerialData": { // 串口数据内容
"Lens": 7, // 数据长度,表示后续数据的字节数
"Data": "FF01000800FF08" // 实际发送的串口数据,以十六进制字符串表示
}
}
/*
指令 FF01000800FF08 的具体含义是:
• 设备地址:0x01
• 操作:向上移动(Up),垂直速度为最大速度,水平速度为停止。
• 校验和:0x08
*/
JSON控制热红外镜头变倍加示例:
{
"ControlType": "SerialControl", // 控制类型,表示这是一条用于串口通信控制的指令
"SerialType": "VISCAIR", // 串口协议类型,指定使用 VISCAIR 协议
"SerialData": {
"Lens": 7, // 数据长度,表示后续数据的字节数
"Data": "FF020020000022" // 实际发送的串口数据,以十六进制字符串表示
/*
• FF:同步字节(固定值)。
• 02:设备地址(这里为 0x02)。
• 00:命令类别(控制命令)。
• 20:具体命令(变倍加操作)。
• 22:校验和
*/
}
}
查询帧发送格式如下,长度为7Byte。
| 标识码 | 帧类型 | 帧内容 |
|---|---|---|
| 0xEC 0x91 | 0x05 | 0x00 0x00 0x00 0x00 |
查询信息反馈:
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x05 | 帧内容长度N | JSON |
JSON内容:
| Key | Name | Value | Type | Disp. |
|---|---|---|---|---|
| ControlType | 控制类型 | ImageSetting | String | |
| ImageSize | 图像分辨率 | 0:1080P 1:720P 2:D1 3:1440P |
int | 小于等于实际分辨率 |
| ImageBit | 图像码率 | 512~4096 | Int | 单位为Kb/S |
| ImageCode | 编码格式 | 0:H264 1:H265 |
int | |
| WorkMode | 工作模式 | 0:关闭AI 1:识别 2:自动跟踪 3:点选跟踪 4:波门/框选跟踪 |
Int | 部分设备支持输出 |
| PipShow | 显示类型 | 0:大图可见光 1:红外 2:可见光 3:融合 4:大图红外 |
Int | 仅双光单AI Tofu6设备支持 |
| Model | 算法类型🪄1 | 高段数值: 0:可见光模型 1:红外模型 低段数值: 2:人车识别 3:船识别 4:无人机识别 5:飞机,直升机识别 6:鸟识别 最终值 = 高段数值 × 10 + 低段数值 |
Int | 仅Tofu6/7支持 |
| MaxVisFL | 放大倍率,分辨率, 可见光最大焦距🪄2 |
倍率整数x 2/4M 焦距整数 | String | 仅一体设备支持 |
| MaxIRFL | 放大倍率,分辨率, 红外最大焦距🪄2 |
倍率整数x S/U 焦距整数 | String | 仅一体设备支持 |
🪄1
典型场景取值示例:
可见光人车识别:0×10 + 2 = 2
红外无人机识别:1×10 + 4 = 14🪄2
仅相机+AI一体模组或云台相机设备带此信息
可见光分辨率:2M:200万分辨率,4M:400万分辨率;
热红外分辨率:S:640x512, U:1280x1024.
JSON示例:
{
"ControlType": "ImageSetting", // 控制类型,表示这是一条用于设置图像参数的指令
"ImageSize": 0, // 图像分辨率设置,0 表示 1080P (1920x1080)
"ImageBit": 4096, // 图像码率设置,4096 表示码率为 4096 Kb/S
"ImageCode": 0, // 图像编码格式设置,0 表示使用 H.264 编码
"WorkMode": 1, // 当前工作模式,部分设备支持查询输出
"PipShow": 4, // 当前画中画显示模式,红外大图,可见光小图模式
"Model": 13, // 当前算法模型,红外船识别
"MaxVisFL": "40x4M264", //400万像素,40倍,最大焦距264mm
"MaxIRFL": "5xS150" //640x512分辨率,5倍,最大焦距150mm
}
设置目标检测区域
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x06 | 帧内容长度N | JSON |
JSON内容:
| Key | Disp. | Value | Type |
|---|---|---|---|
| ControlType | 控制类型 | SetAreaDot | String |
| WarnArea | 区域设置🪄1 | AreaItem:区域标记 AreaPoint:X、Y坐标 |
Int |
🪄1
区域设置时,画面左上角坐标为(1,1),AreaPoint最多为6个, 区域数量 AreaItem最多8个。
JSON示例:
1.设置检测区域:
{
"ControlType": "SetAreaDot", // 控制类型,表示这是一条用于设置目标检测区域的指令
"WarnArea": { // 目标检测区域的配置
"AreaItem": 1, // 区域标记,表示这是第一个检测区域
"AreaPoint": [ // 区域的四个顶点坐标,定义一个矩形检测区域
{
"X": 120, // 第一个顶点的 X 坐标
"Y": 100 // 第一个顶点的 Y 坐标
},
{
"X": 310, // 第二个顶点的 X 坐标
"Y": 100 // 第二个顶点的 Y 坐标
},
{
"X": 310, // 第三个顶点的 X 坐标
"Y": 360 // 第三个顶点的 Y 坐标
},
{
"X": 120, // 第四个顶点的 X 坐标
"Y": 360 // 第四个顶点的 Y 坐标
}
]
}
}
3.取消检测区域:
{
"ControlType": "SetAreaDot", // 控制类型,表示这是一条用于设置或取消目标检测区域的指令
"WarnArea": { // 目标检测区域的配置
"AreaItem": 0 // 区域标记,0 表示取消所有检测区域
}
}
设置目标检测区域
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x20 | 帧内容长度N | JSON |
JSON内容:
| Key | Disp. | Value | Type |
|---|---|---|---|
| ControlType | 控制类型 | SetLatlng | String |
| Latitude | 纬度🪄1 | 精确到小数点后七位+N/S | String |
| Longitude | 经度🪄1 | 精确到小数点后七位+E/W | String |
🪄1
适用于固定按照设备,与地图联动使用。
设置经纬度:
{
"ControlType": "SetLatlng", // 控制类型,表示这是一条用于设置目标检测区域的指令
"Latitude": "39.8365020N", // 纬度信息,N 表示北纬
"Longitude": "116.2874510E" // 经度信息,E 表示东经
}
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x07 | 帧内容长度N | JSON |
JSON内容:
| Key | Name | Value | Type | Disp. |
|---|---|---|---|---|
| ControlType | 控制类型 | PipShowSetting | String | |
| PipShow | 显示类型 | 0:大图可见光,小图红外 1:红外 2:可见光 3:融合 4:大图红外,小图可见光 |
Int | 非双光设备不支持此协议 |
JSON示例:
{
"ControlType": "PipShowSetting", // 控制类型,表示这是一条用于设置显示模式的指令
"PipShow": 0 // 显示模式设置,0 表示“大图显示可见光,小图显示红外”
}
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x0A | 帧内容长度N | JSON |
JSON内容:
| Key | Name | Value | Type | Disp. |
|---|---|---|---|---|
| ControlType | 控制类型 | DigitalZoomSetting | String | |
| DigitalZoom | 数字变倍🪄1 | 0: 关闭数字变倍 1: 开启数字变倍 |
Int | 仅Tofu6/7支持此协议 |
🪄1
数字变倍是1X~2X的无级变倍。
JSON示例:
{
"ControlType": "DigitalZoomSetting", // 控制类型,表示这是一条用于设置数字变倍模式的指令
"DigitalZoom": 0 // 数字变倍模式设置,0 表示“关闭数字变倍”
}
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x0B | 帧内容长度N | JSON |
JSON内容:
| Key | Name | Value | Type | Disp. |
|---|---|---|---|---|
| ControlType | 控制类型 | ResetPosition | String | |
| ResetPosition | 位置复位🪄1 | 0: 关闭位置复位 1: 开启位置复位 |
Int | 仅Tofu6/7支持此协议 |
🪄1
位置复位开启后自动跟踪模式下跟踪结束超过3秒,无新目标则自动调用 100号 预置位。仅Tofu6/7支持。
JSON示例:
{
"ControlType": "ResetPosition", // 控制类型,表示这是一条用于位置复位模式的指令
"ResetPosition": 1 // 位置复位模式设置,1 表示“开启位置复位”
}
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x08 | 帧内容长度N | JSON |
JSON内容:
| Key | Name | Value | Type | Disp. |
|---|---|---|---|---|
| ControlType | 控制类型 | ModelSetting | String | |
| Model | 算法模型🪄1 | 0:切换可见光模型 1:切换红外模型 2:人车识别 3:船识别 4:无人机识别 5:飞机,直升机识别 6:鸟识别 |
Int |
🪄1
1)2,3,4 模型为标准提供的模型,5,6 模型为非标准提供的模型,详情请咨询。
2)0,1 为模型波段切换。需要切换波段时发送,同一个波段切换模型无须发此指令。仅支持双光同时输入的Tofu3和Tofu6版本。
JSON示例:
//从可见光人车模型切换到红外无人机模型
//Step1:
{
"ControlType": "ModelSetting", // 控制类型,表示这是一条用于设置算法模型的指令
"Model": 1 // 算法模型波段切换到红外
}
//Step2:
{
"ControlType": "ModelSetting", // 控制类型,表示这是一条用于设置算法模型的指令
"Model": 4 // 算法模型设置,4 表示“无人机识别”模型
}
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x09 | 帧内容长度N | JSON |
JSON内容:
| Key | Name | Value | Type | Disp |
|---|---|---|---|---|
| ControlType | 控制类型 | ImageUpload | String | |
| Upload | 目标截图状态 | 0:目标抓拍关闭 1:目标抓拍开启 |
Int |
JSON示例:
{
"ControlType": "ImageUpload", // 控制类型,表示这是一条用于设置目标截图状态的指令
"Upload": 1 // 目标截图状态设置,1 表示开启目标截图功能
}
客户帧发送格式:
| 标识码1 | 标识码2 | 帧类型 | 帧长度 |
|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte |
| 0xEC | 0x91 | 0x0C | 0x00 0x00 0x00 0x00 |
查询信息反馈:
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x0C | 帧内容长度N | JSON |
JSON内容:
| Key | 名称 | Value | 类型 | 备注 |
|---|---|---|---|---|
| ControlType | 控制类型 | 48MTofu7Getting | String | |
| Tofu7PixSize | Tofu7相机的像元尺寸 | 精确到小数点后一位 | Double | |
| Tofu7MinFocalLength | Tofu7相机的最小焦距 | Int | ||
| Tofu6PixSize | Tofu6相机的像元尺寸 | 精确到小数点后一位 | Double | |
| Tofu6MinFocalLength | Tofu6相机的最小焦距 | Int | ||
| Tofu6ExpectedSize | Tofu6变倍时,期望像素数量 | Int | ||
| Tofu6ZeroOffsetX | Tofu6云台的零位相对于Tofu7零位的水平偏移 | 精确到小数点后一位 | Double | 顺时针为正 |
| Tofu6ZeroOffsetY | Tofu6云台的零位相对于Tofu7零位的垂直偏移 | 精确到小数点后一位 | Double | 向上为正 |
| PTZSerialportServerAddr | Tofu7云台角度的串口服务器ip地址 | String | ||
| Tofu6IPAddr | Tofu6云台相机的ip地址 | String |
JSON示例:
{
"ControlType": "48MTofu7Getting",
"Tofu7PixSize": 0.8,
"Tofu7MinFocalLength": 12,
"Tofu6PixSize": 2.9,
"Tofu6MinFocalLength": 264,
"Tofu6ExpectedSize": 30,
"Tofu6ZeroOffsetX": 0.2,
"Tofu6ZeroOffsetY": 2.4,
"PTZSerialportServerAddr": "192.168.1.66",
"Tofu6IPAddr": "192.168.1.200"
}
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x0D | 帧内容长度N | JSON |
JSON内容:
| Key | 名称 | Value | 类型 | 备注 |
|---|---|---|---|---|
| ControlType | 控制类型 | 48MTofu7Setting | String | |
| Tofu7PixSize | Tofu7相机的像元尺寸 | 精确到小数点后一位 | Double | |
| Tofu7MinFocalLength | Tofu7相机的最小焦距 | Int | ||
| Tofu6PixSize | Tofu6相机的像元尺寸 | 精确到小数点后一位 | Double | |
| Tofu6MinFocalLength | Tofu6相机的最小焦距 | Int | ||
| Tofu6ExpectedSize | Tofu6变倍时,期望像素数量 | Int | ||
| Tofu6ZeroOffsetX | Tofu6云台的零位相对于 Tofu7零位的水平偏移 |
精确到小数点后一位 | Double | 顺时针为正 |
| Tofu6ZeroOffsetY | Tofu6云台的零位相对于 Tofu7零位的垂直偏移 |
精确到小数点后一位 | Double | 向上为正 |
| PTZSerialportServerAddr | Tofu7云台角度的 串口服务器ip地址 |
String | ||
| Tofu6IPAddr | Tofu6云台相机的ip地址 | String |
JSON示例:
{
"ControlType": "48MTofu7Setting",
"Tofu7PixSize": 0.8,
"Tofu7MinFocalLength": 12,
"Tofu6PixSize": 2.9,
"Tofu6MinFocalLength": 264,
"Tofu6ExpectedSize": 30,
"Tofu6ZeroOffsetX": 0.2,
"Tofu6ZeroOffsetY": 2.4,
"PTZSerialportServerAddr": "192.168.1.66",
"Tofu6IPAddr": "192.168.1.200"
}
客户帧发送格式:
| 标识码1 | 标识码2 | 帧类型 | 帧长度 |
|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte |
| 0xEC | 0x91 | 0x0E | 0x00 0x00 0x00 0x00 |
查询信息反馈:
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x0E | 帧内容长度N | JSON |
JSON内容:
| Key | 名称 | Value | 类型 | 备注 |
|---|---|---|---|---|
| ControlType | 控制类型 | GetIgnoreArea | String | |
| AreaCount | 屏蔽区域个数 | Number | Int | 最多六个区域 |
| IgnoreArea | 屏蔽区域 | AreaItem 区域标记 0:未使用 1:使用 AreaPoint 区域角点数组 X:横坐标 Y:纵坐标 |
Array | 1、画面左上角坐标为(0,0) 2、AreaPoint最多为8个 |
JSON示例:
{
"ControlType": "GetIgnoreArea",
"AreaCount": 2,
"IgnoreArea": [
{
"AreaItem": 1,
"AreaPoint": [
{
"X": 120,
"Y": 100
},
{
"X": 310,
"Y": 100
},
{
"X": 310,
"Y": 360
},
{
"X": 120,
"Y": 360
}
]
},
{
"AreaItem": 1,
"AreaPoint": [
{
"X": 400,
"Y": 200
},
{
"X": 650,
"Y": 200
},
{
"X": 650,
"Y": 450
},
{
"X": 400,
"Y": 450
}
]
}
]
}
客户帧发送格式:
| 标识码1 | 标识码2 | 帧类型 | 帧长度 | 帧内容 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | N |
| 0xEC | 0x91 | 0x0F | 帧内容长度N | JSON |
JSON内容:
| Key | 名称 | Value | 类型 | 备注 |
|---|---|---|---|---|
| ControlType | 控制类型 | SetIgnoreArea | String | |
| AreaCount | 屏蔽区域个数 | Number | Int | 最多六个区域 |
| IgnoreArea | 屏蔽区域 | AreaItem 区域标记 0:未使用 1:使用 AreaPoint 区域角点数组 X:横坐标 Y:纵坐标 |
Array | 1、画面左上角坐标为(0,0) 2、AreaPoint最多为8个 |
设置区域JSON示例:
{
"ControlType": "SetIgnoreArea",
"AreaCount": 2,
"IgnoreArea": [
{
"AreaItem": 1,
"AreaPoint": [
{
"X": 120,
"Y": 100
},
{
"X": 310,
"Y": 100
},
{
"X": 310,
"Y": 360
},
{
"X": 120,
"Y": 360
}
]
},
{
"AreaItem": 1,
"AreaPoint": [
{
"X": 400,
"Y": 200
},
{
"X": 650,
"Y": 200
},
{
"X": 650,
"Y": 450
},
{
"X": 400,
"Y": 450
}
]
}
]
}
删除区域JSON示例:
{
"ControlType": "SetIgnoreArea",
"IgnoreArea": {
"AreaItem": 0
}
}
| 标识码 | 标识码 | 帧类型 | 帧长度 | 状态码 |
|---|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte | 2Byte |
| 0xEC | 0x91 | 0x12 | 0x00 00 00 02 | 0x00 XX |
状态码类型见下表。
| 状态码 | 描述 |
|---|---|
| 0x00 00 | 执行正常 |
| 0x00 01 | 包不完整 |
| 0x00 02 | 协议内容错误 |
| 标识码 | 标识码 | 帧类型 | 帧长度 |
|---|---|---|---|
| 1Byte | 1Byte | 1Byte | 4Byte |
| 0xEC | 0x91 | 0x11 | 0x00 00 00 00 |
客户端在15秒之内需要给服务器端发送心跳帧,当服务器收到客户端心跳帧后,将在1s内回复心跳,若客户端超时未收到回复,客户端需重新发送该帧。
当服务器连续15s内未收到客户端的心跳帧时,服务器将判定客户端已自动离线,将停止数据发送和接收。
当客户端连续15s内未收到服务器回复时,应判定本次连接已被中断,需重新连接。

