Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

JT809协议、GB809协议、道路运输车辆卫星定位系统-平台数据交换协议(支持2011、2019版本)

License

NotificationsYou must be signed in to change notification settings

SmallChi/JT809

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

79 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MIT Licence.NET Core

前提条件

  1. 掌握进制转换:二进制转十六进制;
  2. 掌握BCD编码、Hex编码;
  3. 掌握各种位移、异或;
  4. 掌握常用反射;
  5. 掌握JObject的用法;
  6. 掌握快速ctrl+c、ctrl+v;
  7. 掌握Span<T>的基本用法;
  8. 掌握以上装逼技能,就可以开始搬砖了。

JT809数据结构解析

数据包[JT809Package]

头标识数据头数据体CRC校验码尾标识
BeginFlagJT809HeaderJT809BodiesCRCCodeEndFlag
5B---5D

数据头[JT809Header]

数据长度报文序列号业务数据类型下级平台接入码协议版本号标识报文加密标识位数据加密的密匙发送消息的系统时间(2019版本)
MsgLengthMsgSNBusinessTypeMsgGNSSCENTERIDVersionEncryptFlagEncryptKeyTime

数据体[JT809Bodies]

根据对应业务数据类型:BusinessType

车牌号车辆颜色子业务类型标识后续数据长度子业务数据体
VehicleNoVehicleColorSubBusinessTypeDataLengthJT809SubBodies

子数据体[JT809SubBodies]

根据对应子业务数据类型 SubBusinessType 处理子业务数据体(JT809SubBodies)。

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

转义规则如下:

  1. 若数据内容中有出现字符 0x5b 的,需替换为字符 0x5a 紧跟字符 0x01;
  2. 若数据内容中有出现字符 0x5a 的,需替换为字符 0x5a 紧跟字符 0x02;
  3. 若数据内容中有出现字符 0x5d 的,需替换为字符 0x5e 紧跟字符 0x01;
  4. 若数据内容中有出现字符 0x5e 的,需替换为字符 0x5e 紧跟字符 0x02.

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

举个栗子1

1.组包:

业务数据类型 BusinessType:从链路报警信息交互消息

子业务类型标识 SubBusinessType:报警督办请求消息

JT809Package jT809Package = new JT809Package();jT809Package.Header = new JT809Header{    MsgSN = 1666,    EncryptKey = 9999,    EncryptFlag= JT809Header_Encrypt.None,    Version = new JT809Header_Version(1, 0, 0),    BusinessType = JT809BusinessType.从链路报警信息交互消息.ToUInt16Value(),    MsgGNSSCENTERID = 20180920,};JT809_0x9400 bodies = new JT809_0x9400{    VehicleNo="粤A12345",    VehicleColor= JT809VehicleColorType.黄色,    SubBusinessType= JT809SubBusinessType.报警督办请求消息.ToUInt16Value(),};JT809_0x9400_0x9401 jT809_0x9400_0x9401 = new JT809_0x9400_0x9401{    WarnSrc = JT809WarnSrc.车载终端,    WarnType = JT809WarnType.疲劳驾驶报警.ToUInt16Value(),    WarnTime = DateTime.Parse("2018-09-27 10:24:00"),    SupervisionID = "123FFAA1",    SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"),    SupervisionLevel = 3,    Supervisor = "smallchi",    SupervisorTel = "12345678901",    SupervisorEmail = "123456@qq.com"};bodies.SubBodies = jT809_0x9400_0x9401;jT809Package.Bodies = bodies;byte[] data = JT809Serializer.Serialize(jT809Package);string hex = data.ToHexString();// 输出结果Hex:// 5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 5A 01 AC 3F 40 12 3F FA A1 00 00 00 00 5A 01 AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D

2.手动解包:

1.原包:5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 (5A 01) AC 3F 40 12 3F FA A1 00 00 00 00 (5A 01) AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D2.进行反转义5A 01 ->5B5A 02 ->5A5E 01 ->5D5E 02 ->5E反转义后5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 5B AC 3F 40 12 3F FA A1 00 00 00 00 5B AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D3.拆解5B          --头标识00 00 00 92 --数据头->数据长度00 00 06 82 --数据头->报文序列号94 00       --数据头->业务数据类型01 33 EF B8 --数据头->下级平台接入码,上级平台给下级平台分配唯一标识码01 00 00    --数据头->协议版本号标识00          --数据头->报文加密标识位00 00 27 0F --数据头->数据加密的密匙D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 --数据体->车牌号02                                                             --数据体->车辆颜色94 01                                                          --数据体->子业务类型标识00 00 00 5C                                                    --数据体->后续数据长度01                                                                                              --子数据体->报警信息来源00 02                                                                                           --子数据体->报警类型00 00 00 00 5B AC 3F 40                                                                         --子数据体->报警时间UTCDateTime12 3F FA A1                                                                                     --子数据体->报警督办ID00 00 00 00 5B AC 4D 50                                                                         --子数据体->督办截止时间03                                                                                              --子数据体->督办级别73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00                                                 --子数据体->督办人31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00                                     --子数据体->督办联系电话31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 --子数据体->督办联系电子邮件BA D8       --CRC校验码5D          --尾标识

3.程序解包:

//1.转成byte数组var bytes = "5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 5A 01 AC 3F 40 12 3F FA A1 00 00 00 00 5A 01 AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D".ToHexBytes();//2.将数组反序列化JT809Package jT809Package = JT809Serializer.Deserialize(bytes);//3.数据包头Assert.Equal((uint)146, jT809Package.Header.MsgLength);Assert.Equal((uint)1666, jT809Package.Header.MsgSN);Assert.Equal((uint)9999, jT809Package.Header.EncryptKey);Assert.Equal(JT809Header_Encrypt.None, jT809Package.Header.EncryptFlag);Assert.Equal((uint)20180920, jT809Package.Header.MsgGNSSCENTERID);Assert.Equal(JT809BusinessType.从链路报警信息交互消息, (JT809BusinessType)jT809Package.Header.BusinessType);Assert.Equal(new JT809Header_Version(1, 0, 0).ToString(), jT809Package.Header.Version.ToString());//4.数据包体JT809_0x9400 jT809_0X400 = (JT809_0x9400)jT809Package.Bodies;Assert.Equal("粤A12345", jT809_0X400.VehicleNo);Assert.Equal(JT809VehicleColorType.黄色, jT809_0X400.VehicleColor);Assert.Equal(JT809SubBusinessType.报警督办请求消息, (JT809SubBusinessType)jT809_0X400.SubBusinessType);Assert.Equal((uint)92, jT809_0X400.DataLength);//5.子数据包体JT809_0x9400_0x9401 jT809_0x9400_0x9401 = (JT809_0x9400_0x9401)jT809_0X400.JT809SubBodies;Assert.Equal(JT809WarnSrc.车载终端, jT809_0x9400_0x9401.WarnSrc);Assert.Equal(JT809WarnType.疲劳驾驶报警, (JT809WarnType)jT809_0x9400_0x9401.WarnType);Assert.Equal(DateTime.Parse("2018-09-27 10:24:00"), jT809_0x9400_0x9401.WarnTime);Assert.Equal("123FFAA1", jT809_0x9400_0x9401.SupervisionID);Assert.Equal(DateTime.Parse("2018-09-27 11:24:00"), jT809_0x9400_0x9401.SupervisionEndTime);Assert.Equal(3, jT809_0x9400_0x9401.SupervisionLevel);Assert.Equal("smallchi", jT809_0x9400_0x9401.Supervisor);Assert.Equal("12345678901", jT809_0x9400_0x9401.SupervisorTel);Assert.Equal("123456@qq.com", jT809_0x9400_0x9401.SupervisorEmail);

举个栗子2

// 根据业务类型创建对应包JT809Package jT809Package = JT809BusinessType.从链路报警信息交互消息.Create_从链路报警信息交互消息(    new JT809Header    {        MsgSN = 1666,        EncryptKey = 9999,        EncryptFlag = JT809Header_Encrypt.None,        Version = new JT809Header_Version(1, 0, 0),        MsgGNSSCENTERID = 20180920,    }, new JT809_0x9400    {        VehicleNo = "粤A12345",        VehicleColor = JT809VehicleColorType.黄色,        SubBusinessType = JT809SubBusinessType.报警督办请求消息.ToUInt16Value(),        SubBodies = JT809SubBusinessType.报警督办请求消息.Create_报警督办请求消息(            new JT809_0x9400_0x9401            {                WarnSrc = JT809WarnSrc.车载终端,                WarnType = JT809WarnType.疲劳驾驶报警.ToUInt16Value(),                WarnTime = DateTime.Parse("2018-09-27 10:24:00"),                SupervisionID = "123FFAA1",                SupervisionEndTime = DateTime.Parse("2018-09-27 11:24:00"),                SupervisionLevel = 3,                Supervisor = "smallchi",                SupervisorTel = "12345678901",                SupervisorEmail = "123456@qq.com"            })    });var hex = JT809Serializer.Serialize(jT809Package).ToHexString();

举个栗子3

static void Main(string[] args){    class JT809GlobalConfig: GlobalConfigBase    {        public override JT809EncryptOptions EncryptOptions { get; set; }= new JT809EncryptOptions()        {            IA1 = 20000000,            IC1 = 20000000,            M1 = 30000000        };        public override string ConfigId => "JT809GlobalConfig";    }    JT809Serializer JT809Serializer = new JT809Serializer(new JT809GlobalConfig());    // todo:}

举个栗子4

如何在项目中同时使用809的2011和2019版本

IServiceCollection serviceDescriptors = new ServiceCollection();serviceDescriptors.AddJT809Configure(new JT809_2011_Config());serviceDescriptors.AddJT809Configure(new JT809_2019_Config());JT809Serializer JT809_2011_Serializer= ServiceProvider.GetRequiredService<JT809_2011_Config>().GetSerializer();JT809Serializer JT809_2019_Serializer = ServiceProvider.GetRequiredService<JT809_2019_Config>().GetSerializer();public class JT809_2011_Config: JT809GlobalConfigBase{    public override string ConfigId => "JT809_2011";}public class JT809_2019_Config : JT809GlobalConfigBase{    public override string ConfigId => "JT809_2019";    public JT809_2019_Config()    {        Version = JT809Version.JTT2019;    }}

举个栗子5

如何在项目中同时使用808的2019版本和809的2019版本

IServiceCollection serviceDescriptors = new ServiceCollection();serviceDescriptors.AddJT808Configure(new JT808_2019_Config());serviceDescriptors.AddJT809Configure(new JT809_2019_Config());JT808Serializer JT808_2019_Serializer = ServiceProvider.GetRequiredService<JT808_2019_Config>().GetSerializer();JT809Serializer JT809_2019_Serializer = ServiceProvider.GetRequiredService<JT809_2019_Config>().GetSerializer();public class JT808_2019_Config : GlobalConfigBase{    public override string ConfigId { get; protected set; }    public JT808_2019_Config(string configId = "jt808_2019")    {        ConfigId = configId;    }}public class JT809_2019_Config : JT809GlobalConfigBase{    public override string ConfigId => "JT809_2019";    public JT809_2019_Config()    {        Version = JT809Version.JTT2019;    }}

NuGet安装

Package NameVersionPre VersionDownloads
Install-Package JT809JT809JT809JT809
Install-Package JT809.Protocol.Extensions.JT1078JT809.Protocol.Extensions.JT1078JT809.Protocol.Extensions.JT1078JT809

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

BenchmarkDotNet v0.14.0, Windows 11 (10.0.22631.4460/23H2/2023Update/SunValley3)Intel Core i7-8700K CPU 3.70GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores.NET SDK 9.0.100  [Host]     : .NET 9.0.0 (9.0.24.52809), X64 RyuJIT AVX2  Job-IFEFGZ : .NET 9.0.0 (9.0.24.52809), X64 RyuJIT AVX2Platform=AnyCpuServer=FalseToolchain=.NET 9.0
MethodNMeanErrorStdDevGen0Allocated
JT809_0x9400_0x9401_Package_Deserialize100363.7 μs6.42 μs6.00 μs16.6016103.13 KB
JT809_0x9400_0x9401_Package_Serialize100147.9 μs1.64 μs1.45 μs14.648490.63 KB
JT809_0x9400_0x9401_Package_Deserialize1000035,620.3 μs470.76 μs440.35 μs1642.857110312.58 KB
JT809_0x9400_0x9401_Package_Serialize1000014,931.2 μs217.72 μs203.65 μs1468.75009062.52 KB
JT809_0x9400_0x9401_Package_Deserialize100000372,631.6 μs7,066.99 μs6,610.47 μs16000.0000103126.05 KB
JT809_0x9400_0x9401_Package_Serialize100000151,873.4 μs1,104.01 μs921.90 μs14750.000090625.26 KB

JT809协议消息对照表

2019版8.3.3.2.5 新增的 交换车辆行驶路线信息消息,无对应消息子id类型,暂未对接

链路管理类

主链路

序号消息ID完成情况测试情况消息体名称
10x1001主链路登录请求消息
20x1002主链路登录应答消息
30x1003主链路注销请求消息
40x1004主链路注销应答消息
50x1005主链路连接保持请求消息
60x1006主链路连接保持应答消息
70x1007主链路断开通知消息
80x1008下级平台主动关闭链路通知消息

从链路

序号消息ID完成情况测试情况消息体名称
10x9001从链路连接请求消息
20x9002从链路连接应答消息
30x9003从链路注销请求消息
40x9004从链路注销应答消息
50x9005从链路连接保持请求消息
60x9006从链路连接保持应答消息
70x9007从链路断开通知消息
80x9008上级平台主动关闭链路通知消息

信息统计类

序号消息ID完成情况测试情况消息体名称
10x9101接收定位信息数量通知消息
10x9102平台链路连接情况与车辆定位消息传输情况上报请求消息
10x9103下发平台间消息序列号通知消息

车辆动态信息交换

主链路动态信息交换消息

序号消息ID完成情况测试情况消息体名称
10x1200主链路动态信息交换消息
20x1201上传车辆注册信息(809补充协议文档)
30x1202实时上传车辆定位信息
40x1203车辆定位信息自动补报
50x1205启动车辆定位信息交换应答消息
60x1206结束车辆定位信息交换应答消息
70x1207申请交换指定车辆定位信息请求消息
80x1208取消交换指定车辆定位信息请求
90x1209补发车辆定位信息请求
100x120A上报车辆驾驶员身份识别信息应答
110x120B上报车辆电子运单应答
120x120C主动上报驾驶员身份信息
130x120D主动上报车辆电子运单信息
140x120E主动上报车辆行驶路线信息(809-2019)

从链路动态信息交换消息

序号消息ID完成情况测试情况消息体名称
10x9200从链路动态信息交换消息
10x9201√(0x1201)车辆注册信息应答消息
20x9202√(0x1202)交换车辆定位信息消息(809补充协议文档)
30x9203√(0x1203)车辆定位信息交换补发消息
40x9204交换车辆静态信息消息
50x9205启动车辆定位信息交换请求消息
60x9206结束车辆定位信息交换请求消息
70x9207申请交换指定车辆定位信息应答消息
80x9208取消申请交换指定车辆定位信息应答消息
90x9209补发车辆定位信息应答消息
100x920A上报驾驶员身份识别信息请求消息
110x920B上报车辆电子运单请求消息
120x920C上报车辆车辆行驶路线请求(809-2019)
130x920D车辆行驶线路请求应答(809-2019)

平台间信息交互类

主链路平台间信息交互消息

序号消息ID完成情况测试情况消息体名称
10x1300主链路平台间信息交互消息
20x1301平台查岗应答消息(809补充协议文档)
30x1302下发平台间报文应答消息(809补充协议文档)
40x1303上传平台间消息补传请求消息(809-2019)

从链路平台间信息交互消息

序号消息ID完成情况测试情况消息体名称
10x9300从链路平台间信息交互消息
20x9301平台查岗请求(809补充协议文档)
30x9302下发平台间报文请求(809补充协议文档)
40x9303下发平台间消息补传请求消息(809-2019)

车辆报警信息交互类

主链路报警信息交互消息

序号消息ID完成情况测试情况消息体名称
10x1400主链路平台间信息交互消息
20x1401报警督办应答消息
30x1402上报报警信息消息
40x1403主动上报报警处理结果信息(809补充协议文档)

从链路报警信息交互消息

序号消息ID完成情况测试情况消息体名称
10x9400主链路平台间信息交互消息
20x9401报警督办请求
30x9402报警预警
40x9403实时交换报警信息

车辆监管类

主链路车辆监管消息

序号消息ID完成情况测试情况消息体名称
10x1500主链路车辆监管消息
20x1501车辆单向监听应答
30x1502车辆拍照应答
40x1503下发车辆报文应答
50x1504上报车辆行驶记录应答(809补充协议文档)
60x1505车辆应急接入监管平台应答消息

从链路车辆监管消息

序号消息ID完成情况测试情况消息体名称
10x9500从链路车辆监管消息
20x9501车辆单向监听请求
30x9502车辆拍照请求
40x9503下发车辆报文请求
50x9504上报车辆行驶记录请求
60x9505车辆应急接入监管平台请求消息

车辆静态信息交换类

主链路静态信息交换消息

序号消息ID完成情况测试情况消息体名称
10x1600主链路静态信息交换消息
20x1601补报车辆静态信息应答
30x1602补报车辆行驶路线信息应答消息

从链路静态信息交换消息

序号消息ID完成情况测试情况消息体名称
10x9600从链路静态信息交换消息
20x9601补报车辆静态信息应答

基于JT1078扩展的JT809消息协议

JT809扩展协议消息对照表

主链路动态信息交换消息

序号消息ID完成情况测试情况消息体名称
10x1700主链路时效口令交互消息
20x1700_0x1701时效口令上报消息(有疑问:数据体有问题)
30x1700_0x1702时效口令请求消息
40x1800主链路实时音视频交互消息
50x1800_0x1801实时音视频请求应答消息
60x1800_0x1802主动请求停止实时音视频传输应答消息
70x1900主链路远程录像检索
80x1900_0x1901主动上传音视频资源目录信息消息
90x1900_0x1902查询音视频资源目录应答消息
100x1A00主链路远程录像回放交互消息
110x1A00_0x1A01远程录像回放请求应答消息
120x1A00_0x1A02远程录像回放控制应答消息
130x1B00主链路远程录像下载交互消息
140x1B00_0x1B01远程录像下载请求应答消息
150x1B00_0x1B02远程录像下载通知消息
160x1B00_0x1B03远程录像下载控制应答消息

从链路动态信息交换消息

序号消息ID完成情况测试情况消息体名称
170x9700从链路时效口令交互消息
180x9700_0x9702时效口令请求应答消息(有疑问:应该有应答结果)
190x9800从链路实时音视频交互信息
200x9800_0x9801实时音视频请求消息
210x9800_0x9802主动请求停止实时音视频传输消息
220x9900从链路远程录像检索交互消息
230x9900_0x9901主动上传音视频资源目录信息应答消息
240x9900_0x9902查询音视频资源目录请求消息
250x9A00从链路远程录像回放交互消息
260x9A00_0x9A01远程录像回放请求消息
270x9A00_0x9A02远程录像回放控制消息
280x9B00从链路远程录像下载交互消息
290x9B00_0x9B01远程录像下载请求消息
300x9B00_0x9B02远程录像下载完成通知应答消息
310x9B00_0x9B03远程录像下载控制消息

使用方法

IServiceCollection serviceDescriptors1 = new ServiceCollection();serviceDescriptors1.AddJT809Configure()                   .AddJT1078Configure();

About

JT809协议、GB809协议、道路运输车辆卫星定位系统-平台数据交换协议(支持2011、2019版本)

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages


[8]ページ先頭

©2009-2025 Movatter.jp