JT808协议

前提条件

掌握进制转换:二进制转十六进制;

掌握BCD编码、Hex编码;

掌握各种位移、异或;

掌握常用反射;

掌握JObject的用法;

掌握快速ctrl+c、ctrl+v;

掌握Span的基本用法

掌握以上装逼技能,就可以开始搬砖了。

JT808数据结构解析

数据包[JT808Package]

头标识

数据头

数据体/分包数据体

校验码

尾标识

Begin

JT808Header

JT808Bodies/JT808SubDataBodies

CheckCode

End

7E

-

-

-

7E

数据头[JT808Header]

消息ID

消息体属性

协议版本号(2019版本)

终端手机号

消息流水号

消息总包数(依赖是否分包)

包序号(依赖是否分包)

MsgId

JT808HeaderMessageBodyProperty

ProtocolVersion

TerminalPhoneNo

MsgNum

PackgeCount

PackageIndex

数据头-消息体属性[JT808HeaderMessageBodyProperty]

版本标识(2019版本)

是否分包

加密标识

消息体长度

VersionFlag

IsPackge

Encrypt

DataLength

消息体属性[JT808Bodies]

根据对应消息ID:MsgId

注意:数据内容(除去头和尾标识)进行转义判断

转义规则如下:

若数据内容中有出现字符 0x7e 的,需替换为字符 0x7d 紧跟字符 0x02;

若数据内容中有出现字符 0x7d 的,需替换为字符 0x7d 紧跟字符 0x01;

反转义的原因:确认JT808协议的TCP消息边界。

举个栗子1

1.组包:

MsgId 0x0200:位置信息汇报

JT808Package jT808Package = new JT808Package();

jT808Package.Header = new JT808Header

{

MsgId = Enums.JT808MsgId.位置信息汇报,

ManualMsgNum = 126,

TerminalPhoneNo = "123456789012"

};

JT808_0x0200 jT808_0x0200 = new JT808_0x0200();

jT808_0x0200.AlarmFlag = 1;

jT808_0x0200.Altitude = 40;

jT808_0x0200.GPSTime = DateTime.Parse("2018-10-15 10:10:10");

jT808_0x0200.Lat = 12222222;

jT808_0x0200.Lng = 132444444;

jT808_0x0200.Speed = 60;

jT808_0x0200.Direction = 0;

jT808_0x0200.StatusFlag = 2;

jT808_0x0200.JT808LocationAttachData = new Dictionary();

jT808_0x0200.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01

{

Mileage = 100

});

jT808_0x0200.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02

{

Oil = 125

});

jT808Package.Bodies = jT808_0x0200;

byte[] data = JT808Serializer.Serialize(jT808Package);

var hex = data.ToHexString();

// 输出结果Hex:

// 7E 02 00 00 26 12 34 56 78 90 12 00 7D 02 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01 13 7E

2.手动解包:

1.原包:

7E 02 00 00 26 12 34 56 78 90 12 00 (7D 02) 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 (7D 01) 13 7E

2.进行反转义

7D 02 ->7E

7D 01 ->7D

反转义后

7E 02 00 00 26 12 34 56 78 90 12 00 7E 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 13 7E

3.拆解

7E --头标识

02 00 --数据头->消息ID

00 26 --数据头->消息体属性

12 34 56 78 90 12 --数据头->终端手机号

00 7E --数据头->消息流水号

00 00 00 01 --消息体->报警标志

00 00 00 02 --消息体->状态位标志

00 BA 7F 0E --消息体->纬度

07 E4 F1 1C --消息体->经度

00 28 --消息体->海拔高度

00 3C --消息体->速度

00 00 --消息体->方向

18 10 15 10 10 10 --消息体->GPS时间

01 --消息体->附加信息->里程

04 --消息体->附加信息->长度

00 00 00 64 --消息体->附加信息->数据

02 --消息体->附加信息->油量

02 --消息体->附加信息->长度

00 7D --消息体->附加信息->数据

13 --检验码

7E --尾标识

3.程序解包:

//1.转成byte数组

byte[] bytes = "7E 02 00 00 26 12 34 56 78 90 12 00 7D 02 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01 13 7E".ToHexBytes();

//2.将数组反序列化

var jT808Package = JT808Serializer.Deserialize(bytes);

//3.数据包头

Assert.Equal(Enums.JT808MsgId.位置信息汇报, jT808Package.Header.MsgId);

Assert.Equal(38, jT808Package.Header.MessageBodyProperty.DataLength);

Assert.Equal(126, jT808Package.Header.MsgNum);

Assert.Equal("123456789012", jT808Package.Header.TerminalPhoneNo);

Assert.False(jT808Package.Header.MessageBodyProperty.IsPackge);

Assert.Equal(0, jT808Package.Header.PackageIndex);

Assert.Equal(0, jT808Package.Header.PackgeCount);

Assert.Equal(JT808EncryptMethod.None, jT808Package.Header.MessageBodyProperty.Encrypt);

//4.数据包体

JT808_0x0200 jT808_0x0200 = (JT808_0x0200)jT808Package.Bodies;

Assert.Equal((uint)1, jT808_0x0200.AlarmFlag);

Assert.Equal((uint)40, jT808_0x0200.Altitude);

Assert.Equal(DateTime.Parse("2018-10-15 10:10:10"), jT808_0x0200.GPSTime);

Assert.Equal(12222222, jT808_0x0200.Lat);

Assert.Equal(132444444, jT808_0x0200.Lng);

Assert.Equal(60, jT808_0x0200.Speed);

Assert.Equal(0, jT808_0x0200.Direction);

Assert.Equal((uint)2, jT808_0x0200.StatusFlag);

//4.1.附加信息1

Assert.Equal(100, ((JT808_0x0200_0x01)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage);

//4.2.附加信息2

Assert.Equal(125, ((JT808_0x0200_0x02)jT808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil);

举个栗子2

// 使用消息Id的扩展方法创建JT808Package包

JT808Package jT808Package = Enums.JT808MsgId.位置信息汇报.Create("123456789012",

new JT808_0x0200 {

AlarmFlag = 1,

Altitude = 40,

GPSTime = DateTime.Parse("2018-10-15 10:10:10"),

Lat = 12222222,

Lng = 132444444,

Speed = 60,

Direction = 0,

StatusFlag = 2,

JT808LocationAttachData = new Dictionary

{

{ JT808Constants.JT808_0x0200_0x01,new JT808_0x0200_0x01{Mileage = 100}},

{ JT808Constants.JT808_0x0200_0x02,new JT808_0x0200_0x02{Oil = 125}}

}

});

byte[] data = JT808Serializer.Serialize(jT808Package);

var hex = data.ToHexString();

//输出结果Hex:

//7E 02 00 00 26 12 34 56 78 90 12 00 01 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01 6C 7E

举个栗子3

// 初始化配置

IJT808Config DT1JT808Config = new DT1Config();

IJT808Config DT2JT808Config = new DT2Config();

// 注册自定义消息外部程序集

DT1JT808Config.Register(Assembly.GetExecutingAssembly());

// 跳过校验和验证

DT1JT808Config.SkipCRCCode = true;

// 根据不同的设备终端号,添加自定义消息Id

DT1JT808Config.MsgIdFactory.SetMap();

DT2JT808Config.MsgIdFactory.SetMap();

// 初始化序列化实例

JT808Serializer DT1JT808Serializer = new JT808Serializer(DT1JT808Config);

JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config);

举个栗子4

遇到的问题-多设备多协议的自定义位置附加信息

场景:

一个设备厂商对应多个设备类型,不同设备类型可能存在相同的自定义位置附加信息Id,导致自定义附加信息Id冲突,无法解析。

解决方式:

1.可以根据设备类型做个工厂,解耦对公共序列化器的依赖。

2.可以根据设备类型去实现(GlobalConfigBase)对应的配置,根据不同的GlobalConfigBase实例去绑定对应协议解析器。

要是哪位大佬还有其他的解决方式,请您告知我下,谢谢您了。

举个栗子5

遇到的问题-多媒体数据上传进行分包处理

场景:

设备在上传多媒体数据的时候,由于数据比较多,一次上传不了,所以采用分包方式处理。

解决方式:

第一包数据上来采用平常的方式去解析数据;

当第二包上来跟第一包的分包数据体(SubDataBodies)进行合并

当N包数据上来,延续步骤2的方式。

普及知识点:一般行业分包是按256的整数倍,太多不行,太少也不行,必须刚刚好。

举个栗子6

遇到的问题-多设备多协议的消息ID冲突

场景:

由于每个设备厂商不同,导致设备的私有协议可能使用相同的消息ID作为指令,导致平台解析不了。

解决方式:

可以根据设备类型去实现(GlobalConfigBase)对应的配置,根据不同的GlobalConfigBase实例去绑定对应

协议解析器。

举个栗子7

如何兼容2019版本

最新协议文档已经写好了如何做兼容,就是在消息体属性中第14位为版本标识。

当第14位为0时,标识协议为2011年的版本;

当第14位为1时,标识协议为2019年的版本。

举个栗子8

协议分析器在数据出现异常和纠错的时候也是挺有用的,总不能凭借24K氪金眼去观察数据,那么可以在开发协议的同时就把协议分析器给写好,这样方便技术或者技术支持排查问题,提高效率。

举个栗子9

增加行车记录仪序列化器,既可以单独的存在,也可以组装在808的数据包当中。

NuGet安装

Package Name

Version

Downloads

Install-Package JT808

Install-Package JT808.Protocol.Extensions.JT1078

Install-Package JT808.Protocol.Extensions.JTActiveSafety

使用BenchmarkDotNet性能测试报告(只是玩玩,不能当真)

BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19041.572 (2004/?/20H1)

Intel Core i7-8700K CPU 3.70GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores

.NET Core SDK=5.0.100

[Host] : .NET Core 5.0.0 (CoreCLR 5.0.20.51904, CoreFX 5.0.20.51904), X64 RyuJIT

Job-WADLYX : .NET Core 5.0.0 (CoreCLR 5.0.20.51904, CoreFX 5.0.20.51904), X64 RyuJIT

Platform=AnyCpu Server=False Toolchain=.NET Core 5.0

Method

Categories

N

Mean

Error

StdDev

Gen 0

Gen 1

Gen 2

Allocated

0x0200_All_AttachId_Serialize

0x0200Serializer

100

249.02 μs

3.466 μs

2.894 μs

31.7383

-

-

196.88 KB

0x0200_All_AttachId_Deserialize

0x0200Serializer

100

762.07 μs

14.713 μs

15.743 μs

80.0781

-

-

496.09 KB

0x0200_All_AttachId_Serialize

0x0200Serializer

10000

24,541.76 μs

173.184 μs

161.996 μs

3187.5000

-

-

19687.5 KB

0x0200_All_AttachId_Deserialize

0x0200Serializer

10000

75,919.55 μs

1,326.444 μs

1,175.858 μs

8000.0000

-

-

49609.55 KB

0x0200_All_AttachId_Serialize

0x0200Serializer

100000

249,887.82 μs

4,966.928 μs

5,520.727 μs

32000.0000

-

-

196876.26 KB

0x0200_All_AttachId_Deserialize

0x0200Serializer

100000

734,062.09 μs

10,270.434 μs

9,104.472 μs

80000.0000

-

-

496095 KB

0x0100Serialize

0x0100Serializer

100

79.16 μs

0.906 μs

0.803 μs

10.7422

-

-

66.41 KB

0x0100Deserialize

0x0100Serializer

100

70.47 μs

1.377 μs

2.060 μs

15.7471

-

-

96.88 KB

0x0100Serialize

0x0100Serializer

10000

7,934.91 μs

121.485 μs

113.637 μs

1078.1250

-

-

6640.63 KB

0x0100Deserialize

0x0100Serializer

10000

7,077.60 μs

139.419 μs

165.969 μs

1578.1250

-

-

9687.5 KB

0x0100Serialize

0x0100Serializer

100000

80,403.44 μs

1,522.446 μs

1,563.440 μs

10714.2857

-

-

66406.25 KB

0x0100Deserialize

0x0100Serializer

100000

69,196.07 μs

1,289.555 μs

1,206.251 μs

15666.6667

-

-

96875.13 KB

JT808终端通讯协议消息对照表

序号

消息ID

完成情况

测试情况

消息体名称

2019版本

1

0x0001

终端通用应答

2

0x8001

平台通用应答

3

0x0002

终端心跳

4

0x8003

补传分包请求

5

0x0100

终端注册

修改

6

0x8100

终端注册应答

7

0x0003

终端注销

8

0x0102

终端鉴权

修改

9

0x8103

设置终端参数

修改且增加

10

0x8104

查询终端参数

11

0x0104

查询终端参数应答

12

0x8105

终端控制

13

0x8106

查询指定终端参数

14

0x8107

消息体为空

查询终端属性

15

0x0107

查询终端属性应答

16

0x8108

下发终端升级包

17

0x0108

终端升级结果通知

18

0x0200

位置信息汇报

增加附加信息

19

0x8201

位置信息查询

20

0x0201

位置信息查询应答

21

0x8202

临时位置跟踪控制

22

0x8203

人工确认报警消息

23

0x8300

文本信息下发

修改

24

0x8301

事件设置

删除

25

0x0301

事件报告

删除

26

0x8302

提问下发

删除

27

0x0302

提问应答

删除

28

0x8303

信息点播菜单设置

删除

29

0x0303

信息点播/取消

删除

30

0x8304

信息服务

删除

31

0x8400

电话回拨

32

0x8401

设置电话本

33

0x8500

车辆控制

修改

34

0x0500

车辆控制应答

35

0x8600

设置圆形区域

修改

36

0x8601

删除圆形区域

37

0x8602

设置矩形区域

修改

38

0x8603

删除矩形区域

39

0x8604

设置多边形区域

修改

40

0x8605

删除多边形区域

41

0x8606

设置路线

修改

42

0x8607

删除路线

43

0x8700

行驶记录仪数据采集命令

44

0x0700

行驶记录仪数据上传

45

0x8701

行驶记录仪参数下传命令

46

0x0701

电子运单上报

47

0x0702

驾驶员身份信息采集上报

修改

48

0x8702

消息体为空

上报驾驶员身份信息请求

49

0x0704

定位数据批量上传

修改

50

0x0705

CAN 总线数据上传

修改

51

0x0800

多媒体事件信息上传

52

0x0801

多媒体数据上传

修改

53

0x8800

多媒体数据上传应答

54

0x8801

摄像头立即拍摄命令

修改

55

0x0805

摄像头立即拍摄命令应答

修改

56

0x8802

存储多媒体数据检索

57

0x0802

存储多媒体数据检索应答

58

0x8803

存储多媒体数据上传

59

0x8804

录音开始命令

60

0x8805

单条存储多媒体数据检索上传命令

修改

61

0x8900

数据下行透传

修改

62

0x0900

数据上行透传

修改

63

0x0901

数据压缩上报

64

0x8A00

平台 RSA 公钥

65

0x0A00

终端 RSA 公钥

66

0x8F00~0x8FFF

保留

保留

平台下行消息保留

67

0x0F00~0x0FFF

保留

保留

终端上行消息保留

68

0x0004

查询服务器时间请求

新增

69

0x8004

查询服务器时间应答

新增

70

0x0005

终端补传分包请求

新增

71

0x8204

链路检测

新增

72

0x8608

查询区域或线路数据

新增

73

0x0608

查询区域或线路数据应答

新增

74

0xE000~0xEFFF

保留

保留

厂商自定义上行消息

新增

75

0xF000~0xFFFF

保留

保留

厂商自定义下行消息

新增

jt808终端鉴权_GitHub - SmallChi/JT808: JT808协议、GB808协议、道路运输车辆卫星定位系统-北斗兼容车载终端通讯协议(支持2013、2019版本)...相关推荐

  1. jt808终端鉴权_JT/T 808- 2019道路运输车辆卫星定位系统终端通信协议及数据格式...

    JT/T 808- 2019 道路运输车辆卫星定位系统终端通信协议及数据格式 1范围 本标准规定了道路运输车辆卫星定位系统车载终端与监管/监控平台之间的通信协议与数据格式,包括协议基础.通信连接.消息 ...

  2. 交通运输部办公厅关于印发《道路运输车辆卫星定位系统车载终端和平台标准符合性技术审查工作规范》的通知

    发文单位:交通运输部办公厅 文 号:交办运[2016]138号 发布日期:2016-10-25 执行日期:2017-1-1 各省.自治区.直辖市.新疆生产建设兵团交通运输厅(局.委): 经交通运输部同 ...

  3. jt808终端鉴权_驾培协议和jt808协议的区别 | 车载GPS和视频平台产品经理

    交通部颁发的<机动车驾驶员计时培训系统平台技术规范>中的驾培TCP协议和jt808协议虽然很像,但有本质的不同,很多人以为就是部标808协议,这个认识是错误的,驾培协议是驾培协议,jt80 ...

  4. 车联网车辆统一信息管理平台整体系统、统一车辆管理车辆监控平台设计与开发、电力车辆管理系统车载终端T-BOX、车辆监控平台、车辆管理系统、国标TBOX车载终端、国标车载TBOX

    移动管家车联网解决方案,移动管家车载智能信息终端.车联网OBD模块TBOX设备支持管理和大数据分析能力,为车联网提供强大的连接保障.通过屏蔽各种复杂设备接口,简化各类车载终端厂家的开发,实现终端设备的 ...

  5. 4G无线防拆报警GPS定位器JT808 部标通讯协议及数据格式

    协议基础 1.1.通信方式 本协议采用的通信方式应符合 JT/T 794 中的相关规定.通信协议采用 TCP,平台作为 服务器端,终端作为客户端. 1.2.数据类型 协议消息中使用的数据类型见表 1: ...

  6. aka鉴权 ims_IMS鉴权过程中各参数的用途

    IMS 鉴权过程中各参数的用途 发帖日期: 2011-08-18 14:12:52 按照目前的国际规范, IMS 认证方式主要有 IMS AKA . SIP Digest . NASS-IMS Bun ...

  7. API 鉴权插件上线!支持用户自定义鉴权插件

    0.4.0 版本更新主要围绕这几个方面: 分组独立的 UI,支持分组 API 鉴权 API 测试支持继承 API 鉴权 支持用户自定义鉴权插件,仅需部分配置即可发布鉴权插件 开始介绍功能之前,我想先和 ...

  8. 海康威视摄像头 onvif 鉴权

    问题描述 在调试海康威视摄像头过程中,遇到无法鉴权成功的问题.同样的代码,其他的摄像头均能鉴权成功,而海康威视的摄像头却不能. 问题原因 其他的摄像头,网页登录用的用户名和密码与onvif鉴权用的用户 ...

  9. 公交智能调度系统车载终端应用设计与实现

    一.引言 随着我国国民经济飞速发展,城市建设日新月异,随之而来交通问题也是日益严重.影响城市交通主要的因素之一,是城市中的公交车辆,公交车辆也是直接反映着城市形象问题.目前公交车的调度管理方面还存一些 ...

  10. 智能车载终端解决方案,聪明的车驶入智慧公交时代

    公共交通是城市建设中的重要一环,十四五规划中明确提出打造城市数字交通.智能交通.绿色交通的主题.在大数据.5G.车联网等技术的加持下,各地加快城市公交基础设施建设和改造,城市公共交通智能化程度不断提升 ...

最新文章

  1. 【Kaidi安装问题】install_mkl.sh报错,没有数字签名
  2. VTK:图片之Flip
  3. npm依赖管理java_探讨npm依赖管理之peerDependencies
  4. 百度广告点击软件_结束了,百度 “毒瘤” 广告!
  5. php v-for=,Vue中v-for循环节点的实现代码
  6. Python测试开发django2.环境部署项目创建
  7. java猜拳游戏代码_猜拳游戏 - java代码库 - 云代码
  8. buck变换器设计matlab_在数字控制系统中实现LLC变换器的电流模式控制的思考
  9. collections模块使用方法
  10. github设置添加SSH(转载自:破男孩)
  11. Windows 11 将“扼杀”第三方浏览器?Firefox 绝地反击!
  12. 谷歌字典mac客户端
  13. Python学习笔记(5),Battleship 游戏
  14. Geek生活--netHack
  15. 1688API大全、商品详情调用展示
  16. bluedroid a2dp sink播放流程
  17. 2020最新天猫双十一自动获取喵币
  18. 装修新房该不该换电线
  19. 1.2折半查找法的使用
  20. 众享比特参编 | 《Web3.0前瞻研究报告(2022年)》发布及解读,附下载方式

热门文章

  1. hardfault常见原因_keil遇到hardfault时原因的查找
  2. CSS:全屏星星闪烁动画CSS3特效源码
  3. php 递归的简单使用
  4. 嘿嘿,长假最后一天!摸鱼一把,我用Python做一个美女消消乐!
  5. 郭敏:高速公路“过山车”式限速乱象的根本并非技术问题,而是管理协作机制缺位...
  6. 全球运输工业的升级会带来什么
  7. CSS利用PS切图+学成在线综合案例
  8. 电脑如何做动态图 GIF表情包怎么制作
  9. 计算机管理器用户怎么打开,win10无法使用内置管理员账户打开计算器如何设置...
  10. 【数据科学家】如何成为一名数据科学家?