Files
aiot-platform-cloud/viewsh-module-iot/viewsh-module-iot-gateway/src/test/resources/tcp-binary-packet-examples.md
lzh 8ccfafe2bb
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
first commit
2025-12-31 11:48:19 +08:00

7.2 KiB
Raw Blame History

TCP 二进制协议数据包格式说明

1. 协议概述

TCP 二进制协议是一种高效的自定义协议格式,采用紧凑的二进制格式传输数据,适用于对带宽和性能要求较高的 IoT 场景。

1.1 协议特点

  • 高效传输:完全二进制格式,减少数据传输量
  • 版本控制:内置协议版本号,支持协议升级
  • 类型安全:明确的消息类型标识
  • 简洁设计:去除冗余字段,协议更加精简
  • 兼容性:与现有 IotDeviceMessage 接口完全兼容

2. 协议格式

2.1 整体结构

+--------+--------+--------+---------------------------+--------+--------+
| 魔术字 | 版本号 | 消息类型|         消息长度(4字节)          |
+--------+--------+--------+---------------------------+--------+--------+
|           消息 ID 长度(2字节)        |      消息 ID (变长字符串)         |
+--------+--------+--------+--------+--------+--------+--------+--------+
|           方法名长度(2字节)        |      方法名(变长字符串)         |
+--------+--------+--------+--------+--------+--------+--------+--------+
|                        消息体数据(变长)                              |
+--------+--------+--------+--------+--------+--------+--------+--------+

2.2 字段详细说明

字段 长度 类型 说明
魔术字 1字节 byte 0x7E - 协议识别标识,用于数据同步
版本号 1字节 byte 0x01 - 协议版本号,支持版本控制
消息类型 1字节 byte 0x01=请求, 0x02=响应
消息长度 4字节 int 整个消息的总长度(包含头部)
消息 ID 长度 2字节 short 消息 ID 字符串的字节长度
消息 ID 变长 string 消息唯一标识符UTF-8编码
方法名长度 2字节 short 方法名字符串的字节长度
方法名 变长 string 消息方法名UTF-8编码
消息体 变长 binary 根据消息类型的不同数据格式

⚠️ 重要说明deviceId 不包含在协议中,由服务器根据连接上下文自动设置

2.3 协议常量定义

// 协议标识
private static final byte MAGIC_NUMBER = (byte) 0x7E;
private static final byte PROTOCOL_VERSION = (byte) 0x01;

// 消息类型
private static final byte REQUEST = (byte) 0x01;   // 请求消息
private static final byte RESPONSE = (byte) 0x02;  // 响应消息

// 协议长度
private static final int HEADER_FIXED_LENGTH = 7;      // 固定头部长度
private static final int MIN_MESSAGE_LENGTH = 11;      // 最小消息长度

3. 消息类型和格式

3.1 请求消息 (REQUEST - 0x01)

请求消息用于设备向服务器发送数据或请求。

3.1.1 消息体格式

消息体 = params 数据(JSON格式)

3.1.2 示例:设备认证请求

消息内容:

  • 消息 ID: auth_1704067200000_123
  • 方法名: auth
  • 参数: {"clientId":"device_001","username":"productKey_deviceName","password":"device_password"}

二进制数据包结构:

7E                              // 魔术字 (0x7E)
01                              // 版本号 (0x01)
01                              // 消息类型 (REQUEST)
00 00 00 89                     // 消息长度 (137字节)
00 19                           // 消息 ID 长度 (25字节)
61 75 74 68 5F 31 37 30 34 30   // 消息 ID: "auth_1704067200000_123"
36 37 32 30 30 30 30 30 5F 31 
32 33
00 04                           // 方法名长度 (4字节)
61 75 74 68                     // 方法名: "auth"
7B 22 63 6C 69 65 6E 74 49 64   // JSON参数数据
22 3A 22 64 65 76 69 63 65 5F   // {"clientId":"device_001",
30 30 31 22 2C 22 75 73 65 72   //  "username":"productKey_deviceName",
6E 61 6D 65 22 3A 22 70 72 6F   //  "password":"device_password"}
64 75 63 74 4B 65 79 5F 64 65
76 69 63 65 4E 61 6D 65 22 2C
22 70 61 73 73 77 6F 72 64 22
3A 22 64 65 76 69 63 65 5F 70
61 73 73 77 6F 72 64 22 7D

3.1.3 示例:属性数据上报

消息内容:

  • 消息 ID: property_1704067200000_456
  • 方法名: thing.property.post
  • 参数: {"temperature":25.5,"humidity":60.2,"pressure":1013.25}

3.2 响应消息 (RESPONSE - 0x02)

响应消息用于服务器向设备回复请求结果。

3.2.1 消息体格式

消息体 = 响应码(4字节) + 响应消息长度(2字节) + 响应消息(UTF-8) + 响应数据(JSON)

3.2.2 字段说明

字段 长度 类型 说明
响应码 4字节 int HTTP状态码风格0=成功,其他=错误
响应消息长度 2字节 short 响应消息字符串的字节长度
响应消息 变长 string 响应提示信息UTF-8编码
响应数据 变长 binary JSON格式的响应数据可选

3.2.3 示例:认证成功响应

消息内容:

  • 消息 ID: auth_response_1704067200000_123
  • 方法名: auth
  • 响应码: 0
  • 响应消息: 认证成功
  • 响应数据: {"success":true,"message":"认证成功"}

二进制数据包结构:

7E                              // 魔术字 (0x7E)
01                              // 版本号 (0x01)
02                              // 消息类型 (RESPONSE)
00 00 00 A4                     // 消息长度 (164字节)
00 22                           // 消息 ID 长度 (34字节)
61 75 74 68 5F 72 65 73 70 6F   // 消息 ID: "auth_response_1704067200000_123"
6E 73 65 5F 31 37 30 34 30 36
37 32 30 30 30 30 30 5F 31 32
33
00 04                           // 方法名长度 (4字节)
61 75 74 68                     // 方法名: "auth"
00 00 00 00                     // 响应码 (0 = 成功)
00 0C                           // 响应消息长度 (12字节)
E8 AE A4 E8 AF 81 E6 88 90 E5   // 响应消息: "认证成功" (UTF-8)
8A 9F
7B 22 73 75 63 63 65 73 73 22   // JSON响应数据
3A 74 72 75 65 2C 22 6D 65 73   // {"success":true,"message":"认证成功"}
73 61 67 65 22 3A 22 E8 AE A4
E8 AF 81 E6 88 90 E5 8A 9F 22
7D

4. 编解码器标识

public static final String TYPE = "TCP_BINARY";

5. 协议优势

  • 数据紧凑:二进制格式,相比 JSON 减少 30-50% 的数据量
  • 解析高效:直接二进制操作,减少字符串转换开销
  • 类型安全:明确的消息类型和字段定义
  • 设计简洁:去除冗余字段,协议更加精简高效
  • 版本控制:内置版本号支持协议升级

6. 与 JSON 协议对比

特性 二进制协议 JSON协议
数据大小 节省30-50%
解析性能 中等
网络开销
可读性 优秀
调试难度
扩展性 良好 优秀

推荐场景

  • 高频数据传输:传感器数据实时上报
  • 带宽受限环境:移动网络、卫星通信
  • 性能要求高:需要低延迟、高吞吐的场景
  • 设备资源有限:嵌入式设备、低功耗设备
  • 开发调试阶段:调试困难,建议使用 JSON 协议
  • 快速原型开发:开发效率低