JT/T808 protocol,JT808 protocol, GB808 protocol (support 2011, 2013, 2019 version) JT/T808协议、JT808协议、GB808协议(支持2011、2013、2019版本)
JT/T808 protocol,JT808 protocol, GB808 protocol (support 2011, 2013, 2019 version) JT/T808协议、JT808协议、GB808协议(支持2011、2013、2019版本)
中文 |
English
| 头标识 | 数据头 | 数据体/分包数据体 | 校验码 | 尾标识 |
|---|---|---|---|---|
| Begin | JT808Header | JT808Bodies/JT808SubDataBodies | CheckCode | End |
| 7E | - | - | - | 7E |
| 消息 ID | 消息体属性 | 协议版本号(2019 版本) | 终端手机号 | 消息流水号 | 消息总包数(依赖是否分包) | 包序号(依赖是否分包) |
|---|---|---|---|---|---|---|
| MsgId | JT808HeaderMessageBodyProperty | ProtocolVersion | TerminalPhoneNo | MsgNum | PackgeCount | PackageIndex |
| 版本标识(2019 版本) | 是否分包 | 加密标识 | 消息体长度 |
|---|---|---|---|
| VersionFlag | IsPackge | Encrypt | DataLength |
根据对应消息 ID:MsgId
注意:数据内容(除去头和尾标识)进行转义判断
转义规则如下:
反转义的原因:确认 JT808 协议的 TCP 消息边界。
MsgId 0x0200:位置信息汇报
…………// 初始化配置
IJT808Config DT1JT808Config = new DT1Config();
IJT808Config DT2JT808Config = new DT2Config();
// 注册自定义消息外部程序集
DT1JT808Config.Register(Assembly.GetExecutingAssembly());
// 跳过校验和验证
DT1JT808Config.SkipCRCCode = true;
// 根据不同的设备终端号,添加自定义消息Id
DT1JT808Config.MsgIdFactory.SetMap();
DT1JT808Config.FormatterFactory.SetMap();
DT2JT808Config.MsgIdFactory.SetMap();
DT2JT808Config.FormatterFactory.SetMap();
// 初始化序列化实例
JT808Serializer DT1JT808Serializer = new JT808Serializer(DT1JT808Config);
JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config);场景: 一个设备厂商对应多个设备类型,不同设备类型可能存在相同的自定义位置附加信息 Id,导致自定义附加信息 Id 冲突,无法解析。
解决方式:
1.可以根据设备类型做个工厂,解耦对公共序列化器的依赖。
2.可以根据设备类型去实现(GlobalConfigBase)对应的配置,根据不同的 GlobalConfigBase 实例去绑定对应协议解析器。
要是哪位大佬还有其他的解决方式,请您告知我下,谢谢您了。
场景: 设备在上传多媒体数据的时候,由于数据比较多,一次上传不了,所以采用分包方式处理。
解决方式:
第一包数据上来采用平常的方式去解析数据;
当第二包上来跟第一包的分包数据体(SubDataBodies)进行合并
当 N 包数据上来,延续步骤 2 的方式。
普及知识点 1:由于消息体长度最大为 10bit 也就是 1023 的字节,所以这边就有个硬性条件不能超过最大长度。
普及知识点 2:一般行业分包是按 256 的整数倍,太多不行,太少也不行,必须刚刚好。
场景: 由于每个设备厂商不同,导致设备的私有协议可能使用相同的消息 ID 作为指令,导致平台解析不了。
解决方式:
可以根据设备类型去实现(GlobalConfigBase)对应的配置,根据不同的 GlobalConfigBase 实例去绑定对应协议解析器。
如何兼容 2019 版本
最新协议文档已经写好了如何做兼容,就是在消息体属性中第 14 位为版本标识。
当第 14 位为 0 时,标识协议为 2011 年的版本;
当第 14 位为 1 时,标识协议为 2019 年的版本。
协议分析器在数据出现异常和纠错的时候也是挺有用的,总不能凭借 24K 氪金眼去观察数据,那么可以在开发协议的同时就把协议分析器给写好,这样方便技术或者技术支持排查问题,提高效率。
增加行车记录仪序列化器,既可以单独的存在,也可以组装在 808 的数据包当中。
场景 1: 有些设备,不会按照国标的附加信息 Id 来搞,把附加信息 Id 搞为两个字节,这样在上报上来的数据就会存在重复的附加 Id,导致平台解析出错。
场景 2: 由于粤标的设备厂家自定义的附加信息长度可以为四 4 个字节的,所以需要兼容。
场景 3: 有些设备上报会出现两个相同的附加信息 Id,那么只能解析一个,另一个只能丢在异常附加信息里面去处理。
| 附加信息类说明 | 附加 ID 字节数 | 附加长度字节数 | 备注 |
|---|---|---|---|
| JT808_0x0200_CustomBodyBase | 1 BYTE | 1 BYTE | 标准 |
| JT808_0x0200_CustomBodyBase2 | 2 BYTE | 1 BYTE | 自定义 |
| JT808_0x0200_CustomBodyBase3 | 2 BYTE | 2 BYTE | 自定义 |
| JT808_0x0200_CustomBodyBase4 | 1 BYTE | 4 BYTE | 自定义 |
注意:默认都是以标准的去解析,要是出现未知的附加,不一定解析就是正确,最好还是需要依照协议文档去开发然后自行注册解析器去解析。
场景: 有些设备,补报的定位数据有异常数据包内容长度跟原始的内容长度不一致导致整包的数据的解析出错,再设备不升级,改不了的情况下,尽量能解析多少补报的数据量,就解析多少。
场景: 由于粤标的设备把 2019 版本的 0x8105 终端控制消息命令参数做了扩展,所以需要兼容。
场景: 由于协议库本身可能存在消息解析出错的情况,要么就提 PR 上来,但是不一定会及时发布,这时候就需要自己把原有的消息解析复制出来,改造好,然后重新注册。
场景: 由于某些厂商不按要求去做,明明使用的 2013 的协议但是在消息头部的版本标识位置为 1,导致程序认为是 2019 协议。从而解析报错。此时可以强制解析成 2013 后,然后修正版本标识,重新序列化消息,以供下游服务使用
场景: 兼容 2011 协议的注册消息
场景: 平台下发分包数据到设备
可以参考【举个栗子 5】中,设备上来的分包数据结构,然后举一反三的去实现。
场景: 由于 808 的 0x0200 标准协议的附加数据是有明确的表示对部分附加信息 Id 进行保留的,所以按照标准,有些设备厂商把标准的附加信息 Id 占用,所以需要解析这部分的数据,可以参考外部自定义附加信息注册的方式来解决解析问题。
可以参考举个栗子 10中的程序。
场景: 由于接入很多不同设备厂商的协议,但是每个协议对接又比较少,想同时放在一个类库下面进行统一管理,那么在各个厂家不冲突的情况下使用程序集方式的注册是没有问题的,一旦有冲突,那么使用程序集的方式进行注册会报 Id 冲突,本身库不支持这种方式进行隔离的,所以遇到这种情况自己使用 SetMap 的方式进行管理。
场景: 当数据体超过协议规定的 1023 个字节时,设备将会以分包的形式发送给服务,此时服务需要进行合并后才能正常解析
可以参考单元测试的JT808SerializerTest.MergerTest
注意事项:
Bodies不为空,反之亦然Jt808PackageMerger属性| Package Name | Version | Preview Version | Downloads | Remark |
|---|---|---|---|---|
| Install-Package JT808 | JT808 | |||
| Install-Package JT808.Protocol.Extensions.JT1078 | JT1078 扩展 JT808 | |||
| Install-Package JT808.Protocol.Extensions.SuBiao | 主动安全(苏标)扩展 JT808 | |||
| Install-Package JT808.Protocol.Extensions.YueBiao | 主动安全(粤标)扩展 JT808 | |||
| Install-Package JT808.Protocol.Extensions.GPS51 | GPS51 扩展JT808 |
BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.6584/25H2/2025Update/HudsonValley2)
Intel Core i7-8700K CPU 3.70GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
.NET SDK 10.0.100
[Host] : .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3
Job-SRTPUO : .NET 10.0.0 (10.0.0, 10.0.25.52411), X64 RyuJIT x86-64-v3
Platform=AnyCpu Server=False Toolchain=.NET 10.0
| Method | Categories | N | Mean | Error | StdDev | Gen0 | Gen1 | Allocated |
|---|---|---|---|---|---|---|---|---|
| 0x0100Serialize | 0x0100Serializer | 100 | 48.21 μs | 0.573 μs | 0.478 μs | 10.8032 | - | 66.41 KB |
| 0x0100Deserialize | 0x0100Serializer | 100 | 47.91 μs | 0.517 μs | 0.458 μs | 15.8081 | - | 96.88 KB |
| 0x0100Serialize | 0x0100Serializer | 10000 | 4,973.36 μs | 45.377 μs | 42.446 μs | 1078.1250 | - | 6640.63 KB |
| 0x0100Deserialize | 0x0100Serializer | 10000 | 4,942.77 μs | 30.663 μs | 28.682 μs | 1578.1250 | - | 9687.5 KB |
| 0x0100Serialize | 0x0100Serializer | 100000 | 49,646.55 μs | 206.313 μs | 172.280 μs | 10818.1818 | - | 66406.25 KB |
| 0x0100Deserialize | 0x0100Serializer | 100000 | 47,817.85 μs | 667.017 μs | 591.293 μs | 15727.2727 | - | 96875 KB |
| 0x0200_All_AttachId_Serialize | 0x0200Serializer | 100 | 105.50 μs | 0.566 μs | 0.529 μs | 29.4189 | 0.1221 | 180.47 KB |
| 0x0200_All_AttachId_Deserialize | 0x0200Serializer | 100 | 106.14 μs | 0.910 μs | 0.851 μs | 38.2080 | 0.2441 | 234.38 KB |
| 0x0200_All_AttachId_Serialize | 0x0200Serializer | 10000 | 10,165.89 μs | 65.478 μs | 61.248 μs | 2937.5000 | - | 18046.88 KB |
| 0x0200_All_AttachId_Deserialize | 0x0200Serializer | 10000 | 10,313.97 μs | 55.698 μs | 46.510 μs | 3812.5000 | 15.6250 | 23437.5 KB |
| 0x0200_All_AttachId_Serialize | 0x0200Serializer | 100000 | 100,048.62 μs | 667.978 μs | 592.145 μs | 29400.0000 | - | 180468.75 KB |
| 0x0200_All_AttachId_Deserialize | 0x0200Serializer | 100000 | 102,196.63 μs | 391.460 μs | 326.887 μs | 38200.0000 | 200.0000 | 234375 KB |
| 序号 | 消息 ID | 完成情况 | 测试情况 | 消息体名称 | 2019 版本 | 2011 版本 |
|---|---|---|---|---|---|---|
| 1 | 0x0001 | √ | √ | 终端通用应答 | ||
| 2 | 0x8001 | √ | √ | 平台通用应答 | ||
| 3 | 0x0002 | √ | √ | 终端心跳 | ||
| 4 | 0x8003 | √ | √ | 补传分包请求 | 被新增 | |
| 5 | 0x0100 | √ | √ |
No open issues yet, or sync has not completed.