NewLife/NewLife.JT808

Detail
Zip
Compare
大石头 authored at 2026-07-15 17:32:33
eb7ea4b
.github Loading... Loading... 0001-01-01 08:05:00
Client Loading... Loading... 0001-01-01 08:05:00
Client.Avalonia Loading... Loading... 0001-01-01 08:05:00
Doc Loading... Loading... 0001-01-01 08:05:00
JT808.Data Loading... Loading... 0001-01-01 08:05:00
JT808.Server Loading... Loading... 0001-01-01 08:05:00
JT808.Web Loading... Loading... 0001-01-01 08:05:00
JT808.Worker Loading... Loading... 0001-01-01 08:05:00
Newlife.JT808 Loading... Loading... 0001-01-01 08:05:00
XUnitTest Loading... Loading... 0001-01-01 08:05:00
.editorconfig Loading... Loading... 0001-01-01 08:05:00
.gitignore Loading... Loading... 0001-01-01 08:05:00
ChangeLog.md Loading... Loading... 0001-01-01 08:05:00
LICENSE Loading... Loading... 0001-01-01 08:05:00
NewLife.JT808.sln Loading... Loading... 0001-01-01 08:05:00
Readme.MD Loading... Loading... 0001-01-01 08:05:00
Readme.MD
# NewLife.JT808 - JT/T 808 车辆定位协议 ![GitHub top language](https://img.shields.io/github/languages/top/newlifex/newlife.jt808?logo=github) ![GitHub License](https://img.shields.io/github/license/newlifex/newlife.jt808?logo=github) ![Nuget Downloads](https://img.shields.io/nuget/dt/newlife.jt808?logo=nuget) ![Nuget](https://img.shields.io/nuget/v/newlife.jt808?logo=nuget) ![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/newlife.jt808?label=dev%20nuget&logo=nuget) JT/T 808 车辆定位协议完整实现,支持 2011/2013/2019 三个版本,涵盖 70+ 标准消息体、苏标/粤标主动安全扩展、JT/T 1078 音视频基础消息、JT/T 19056 行车记录仪协议及 RocketMQ 消息队列集成。 源码: https://github.com/NewLifeX/NewLife.JT808 Nuget:[NewLife.JT808](https://www.nuget.org/packages/NewLife.JT808) 文档:[需求文档](/NewLife/NewLife.JT808/Blob/master/Doc/需求文档.md) / [架构设计](/NewLife/NewLife.JT808/Blob/master/Doc/架构设计.md) / [功能清单](/NewLife/NewLife.JT808/Blob/master/Doc/功能清单.md) / [使用文档](/NewLife/NewLife.JT808/Blob/master/Doc/使用文档.md) ## 主要特点 - **协议完整**:实现 JT/T 808-2011/2013/2019 消息帧解析,支持 0x7E 帧边界、0x7D 转义、异或校验、分包处理 - **消息体丰富**:覆盖 70+ 标准消息体(0x0001~0x8A00),终端上行 + 平台下行全覆盖 - **三版本兼容**:通过 `Version` 字段 + `[JT2011]`/`[JT2019]` 特性实现三版本字段自动适配 - **双模式序列化**:简单消息体使用属性驱动反射序列化,复杂消息体实现 `IAccessor` 手动控制读写 - **TLV/KLV 解析**:内置 Type-Length-Value 和 Kind-Length-Value 通用编解码,支持强类型字典转换 - **网络通信层**:内置 TCP 粘包编解码器 `JTCodec` 和客户端 `JT808Client`,支持消息处理器自动路由 - **苏标扩展**:支持 ADAS/DSM/TPMS/BSD 主动安全报警信息,外设状态/信息解析,报警附件协议 - **粤标扩展**:支持广东省主动安全标准(粤标),含独立报警上报(0x1FC4)、USB 外设透传、位置附加信息、专用参数设置 - **音视频基础**:JT/T 1078 音视频消息体模型和枚举定义 - **行车记录仪**:JT/T 19056 上下行数据包编解码 - **BCD 编码**:BCD 字符串和时间自定义序列化特性,适配协议特有编码格式 - **GBK 编码**:内置 GBK 中文字符串编解码,自动注册 `CodePagesEncodingProvider` - **Web API 管理**:支持统一下发指令、在线会话管理、黑名单管理、Token 鉴权,方便集成到后台系统 - **消息队列抽象**:IMsgProducer/IMsgConsumer/ISessionProducer 等接口解耦消息处理,内置 DefaultMsgQueue 内存实现、Redis Stream 生产/消费支持、RocketMQ 适配器、Kafka 适配器 - **跨服务器指令下发**:ICommandBus 接口 + Stardust 事件总线,支持集群广播指令到指定终端 - **客户端增强**:自动重连、可配心跳、收发统计计数器,提升生产环境可靠性 - **多框架支持**:`net45 / net461 / netstandard2.0 / netstandard2.1` 全兼容 - **RocketMQ 集成**:基于 `NewLife.RocketMQ` 的消息队列生产/消费适配器,支持阿里云/华为云/腾讯云/ACL 四种云厂商认证模式 - **Kafka 集成**:基于 `Confluent.Kafka` 的消息队列生产/消费适配器,支持消费组、ACK 机制(需要 .NET Standard 2.0+) ## 支持的协议版本 | 版本 | 标识 | 说明 | |------|------|------| | JT/T 808-2011 | `Version=0` | 早期版本,部分消息体结构不同 | | JT/T 808-2013 | `Version=0` | 当前广泛使用的版本 | | JT/T 808-2019 | `Version=1` | 最新版本,增加新版字段和消息类型 | ## 消息对照表 | 序号 | 消息ID | 消息名称 | 方向 | 完成 | |:---:|:------:|---------|:----:|:----:| | 1 | 0x0001 | 终端通用应答 | 上行 | ✅ | | 2 | 0x8001 | 平台通用应答 | 下行 | ✅ | | 3 | 0x0002 | 终端心跳 | 上行 | ✅ | | 4 | 0x8003 | 补传分包请求 | 下行 | ✅ | | 5 | 0x0004 | 查询服务器时间请求 | 上行 | ✅ | | 6 | 0x0100 | 终端注册 | 上行 | ✅ | | 7 | 0x8100 | 终端注册应答 | 下行 | ✅ | | 8 | 0x0003 | 终端注销 | 上行 | ✅ | | 9 | 0x0102 | 终端鉴权 | 上行 | ✅ | | 10 | 0x8103 | 设置终端参数 | 下行 | ✅ | | 11 | 0x8104 | 查询终端参数 | 下行 | ✅ | | 12 | 0x0104 | 查询终端参数应答 | 上行 | ✅ | | 13 | 0x8105 | 终端控制 | 下行 | ✅ | | 14 | 0x8106 | 查询指定终端参数 | 下行 | ✅ | | 15 | 0x8107 | 查询终端属性 | 下行 | ✅ | | 16 | 0x0107 | 查询终端属性应答 | 上行 | ✅ | | 17 | 0x8108 | 下发终端升级包 | 下行 | ✅ | | 18 | 0x0108 | 终端升级结果通知 | 上行 | ✅ | | 19 | 0x0200 | 位置信息汇报 | 上行 | ✅ | | 20 | 0x8201 | 位置信息查询 | 下行 | ✅ | | 21 | 0x0201 | 位置信息查询应答 | 上行 | ✅ | | 22 | 0x8202 | 临时位置跟踪控制 | 下行 | ✅ | | 23 | 0x8203 | 人工确认报警消息 | 下行 | ✅ | | 24 | 0x8300 | 文本信息下发 | 下行 | ✅ | | 25 | 0x8301 | 事件设置 | 下行 | ✅ | | 26 | 0x0301 | 事件报告 | 上行 | ✅ | | 27 | 0x8302 | 提问下发 | 下行 | ✅ | | 28 | 0x0302 | 提问应答 | 上行 | ✅ | | 29 | 0x8303 | 信息点播菜单设置 | 下行 | ✅ | | 30 | 0x0303 | 信息点播/取消 | 上行 | ✅ | | 31 | 0x8304 | 信息服务 | 下行 | ✅ | | 32 | 0x8400 | 电话回拨 | 下行 | ✅ | | 33 | 0x8401 | 设置电话本 | 下行 | ✅ | | 34 | 0x8500 | 车辆控制 | 下行 | ✅ | | 35 | 0x0500 | 车辆控制应答 | 上行 | ✅ | | 36 | 0x8600 | 设置圆形区域 | 下行 | ✅ | | 37 | 0x8601 | 删除圆形区域 | 下行 | ✅ | | 38 | 0x8602 | 设置矩形区域 | 下行 | ✅ | | 39 | 0x8603 | 删除矩形区域 | 下行 | ✅ | | 40 | 0x8604 | 设置多边形区域 | 下行 | ✅ | | 41 | 0x8605 | 删除多边形区域 | 下行 | ✅ | | 42 | 0x8606 | 设置路线 | 下行 | ✅ | | 43 | 0x8607 | 删除路线 | 下行 | ✅ | | 44 | 0x8608 | 查询区域或线路数据 | 下行 | ✅ | | 45 | 0x0608 | 查询区域或线路数据应答 | 上行 | ✅ | | 46 | 0x8700 | 行驶记录仪数据采集命令 | 下行 | ✅ | | 47 | 0x0700 | 行驶记录仪数据上传 | 上行 | ✅ | | 48 | 0x8701 | 行驶记录仪参数下传命令 | 下行 | ✅ | | 49 | 0x0701 | 电子运单上报 | 上行 | ✅ | | 50 | 0x8702 | 上报驾驶员身份信息请求 | 下行 | ✅ | | 51 | 0x0702 | 驾驶员身份信息采集上报 | 上行 | ✅ | | 52 | 0x0704 | 定位数据批量上传 | 上行 | ✅ | | 53 | 0x0705 | CAN总线数据上传 | 上行 | ✅ | | 54 | 0x0800 | 多媒体事件信息上传 | 上行 | ✅ | | 55 | 0x0801 | 多媒体数据上传 | 上行 | ✅ | | 56 | 0x8800 | 多媒体数据上传应答 | 下行 | ✅ | | 57 | 0x8801 | 摄像头立即拍摄命令 | 下行 | ✅ | | 58 | 0x0805 | 摄像头立即拍摄命令应答 | 上行 | ✅ | | 59 | 0x8802 | 存储多媒体数据检索 | 下行 | ✅ | | 60 | 0x0802 | 存储多媒体数据检索应答 | 上行 | ✅ | | 61 | 0x8803 | 存储多媒体数据上传 | 下行 | ✅ | | 62 | 0x8804 | 录音开始命令 | 下行 | ✅ | | 63 | 0x8805 | 单条存储多媒体数据检索上传 | 下行 | ✅ | | 64 | 0x8900 | 数据下行透传 | 下行 | ✅ | | 65 | 0x0900 | 数据上行透传 | 上行 | ✅ | | 66 | 0x0901 | 数据压缩上报 | 上行 | ✅ | | 67 | 0x8A00 | 平台RSA公钥 | 下行 | ✅ | | 68 | 0x0005 | 终端补传分包请求 | 上行 | ✅ | | 69 | 0x8204 | 链路检测 | 下行 | ✅ | | 70 | 0x6006 | 文本信息下发响应 | 上行 | ✅ | | 71 | 0x1080 | 自定义消息 | — | ✅ | ## 快速入门 ### 安装 NuGet 包 ```bash dotnet add package NewLife.JT808 ``` ### 解析终端上报消息 ```csharp using NewLife.JT808.Protocols; using NewLife.JT808.Models; // 初始化消息工厂(扫描程序集注册所有消息类型) var factory = MessageFactory.Instance; factory.Init(); // 终端上报的原始二进制数据 var raw = new Byte[] { 0x7E, 0x02, 0x00, /* ... */, 0x7E }; // 解析为 JTMessage 帧 var jtMessage = new JTMessage(); var stream = new MemoryStream(raw); jtMessage.Read(stream, null); // 根据消息ID反序列化为具体业务模型 var body = factory.Parse(jtMessage); if (body is T0200 position) { Console.WriteLine($"纬度={position.Latitude / 1_000_000.0}"); Console.WriteLine($"经度={position.Longitude / 1_000_000.0}"); Console.WriteLine($"速度={position.Speed} km/h"); } ``` ### 构建下发消息 ```csharp // 构建平台通用应答 var t8001 = new T8001 { Sequence = jtMessage.Sequence, Kind = jtMessage.Kind, Result = ResultKinds.成功 }; // 序列化为字节数组 var ms = new MemoryStream(); var writer = Helper.CreateWriter(ms, jtMessage); writer.TryWrite(null, ref t8001); // 封装为 JTMessage 帧 var reply = new JTMessage { Kind = MessageKinds.平台通用应答, Mobile = jtMessage.Mobile, Sequence = (UInt16)(jtMessage.Sequence + 1), Payload = new Packet(ms.ToArray()), Reply = false }; // 输出完整帧字节 var outMs = new MemoryStream(); reply.Write(outMs, null); var frameBytes = outMs.ToArray(); ``` ### 手动序列化复杂消息体(IAccessor) ```csharp [MessageKind(MessageKinds.位置信息汇报)] public class T0200 : IAccessor { public PositionAlarms Alarm { get; set; } public PositionStatus Status { get; set; } public Int32 Latitude { get; set; } public Int32 Longitude { get; set; } public Boolean Read(Stream stream, Object context) { var reader = context as Binary ?? Helper.CreateReader(stream); Alarm = (PositionAlarms)reader.ReadUInt32(); Status = (PositionStatus)reader.ReadUInt32(); Latitude = reader.ReadInt32(); Longitude = reader.ReadInt32(); // ... 更多字段 return true; } public Boolean Write(Stream stream, Object context) { var writer = context as Binary ?? Helper.CreateWriter(stream); writer.Write((UInt32)Alarm); writer.Write((UInt32)Status); writer.Write(Latitude); writer.Write(Longitude); // ... 更多字段 return true; } } ``` ## 新生命开发团队 [![Logo](/NewLife/NewLife.JT808/Blob/master/Doc/leaf.png)](https://newlifex.com) 新生命开发团队是国内领先的开源物联网与边缘计算团队,专注于 .NET 技术栈在物联网、工业自动化、车联网等领域的深度应用。 - 官网:https://newlifex.com - 开源:https://github.com/NewLifeX - QQ群:1600800