diff --git a/src/JT809.Protocol.Test/JT809.Protocol.Test.csproj b/src/JT809.Protocol.Test/JT809.Protocol.Test.csproj index c5bfbd5..d5cbcf6 100644 --- a/src/JT809.Protocol.Test/JT809.Protocol.Test.csproj +++ b/src/JT809.Protocol.Test/JT809.Protocol.Test.csproj @@ -11,9 +11,9 @@ - - - + + + all diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1202Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1202Test.cs index 07fcd67..14620d1 100644 --- a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1202Test.cs +++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1202Test.cs @@ -9,6 +9,8 @@ using JT808.Protocol; using JT808.Protocol.Interfaces; using JT808.Protocol.MessageBody; using JT809.Protocol.Metadata; +using System.Text.Json; +using JT808.Protocol.MessagePack; namespace JT809.Protocol.Test.JT809SubMessageBody { @@ -25,19 +27,25 @@ namespace JT809.Protocol.Test.JT809SubMessageBody { private JT809Serializer JT809Serializer = new JT809Serializer(); - private JT809Serializer JT809_2019_Serializer = new JT809Serializer(new DefaultGlobalConfig() { Version = JT809Version.JTT2019 }); + private JT809Serializer JT809_2019_Serializer; + private JT808Serializer JT808Serializer_2019; + + private IJT808Config jT808Config; public JT809_0x1200_0x1202Test() { - IJT808Config jT808Config = new DefaultGlobal808_2019Config(); + jT808Config = new DefaultGlobal808_2019Config(); JT808Serializer_2019 = new JT808Serializer(jT808Config); + var config = new DefaultGlobalConfig() { Version = JT809Version.JTT2019 }; + config.AnalyzeCallbacks.Add(0x0200, new JT808AnalyzeCallback(Test_2019_5_Callback)); + JT809_2019_Serializer = new JT809Serializer(config); } [Fact] public void Test1() { JT809_0x1200_0x1202 jT809_0X1200_0X1202 = new JT809_0x1200_0x1202(); - jT809_0X1200_0X1202.VehiclePosition = new VehiclePositionPropertieOf2011 + jT809_0X1200_0X1202.VehiclePosition = new JT809VehiclePositionProperties { Day = 19, Month = 7, @@ -63,9 +71,9 @@ namespace JT809.Protocol.Test.JT809SubMessageBody [Fact] public void Test2() { - var bytes = "00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01".ToHexBytes(); + byte[] bytes = "00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 32 00 33 00 00 00 96 00 2D 00 2D 00 00 00 03 00 00 01 01".ToHexBytes(); JT809_0x1200_0x1202 jT809_0X1200_0X1202 = JT809Serializer.Deserialize(bytes); - var vehiclePosition = jT809_0X1200_0X1202.VehiclePosition as VehiclePositionPropertieOf2011; + var vehiclePosition = jT809_0X1200_0X1202.VehiclePosition; Assert.Equal(19, vehiclePosition.Day); Assert.Equal(7, vehiclePosition.Month); Assert.Equal(2012, vehiclePosition.Year); @@ -86,7 +94,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody public void Test_2019_1() { JT809_0x1200_0x1202 jT809_0X1200_0X1202 = new JT809_0x1200_0x1202(); - jT809_0X1200_0X1202.VehiclePosition = new VehiclePositionPropertieOf2019 + jT809_0X1200_0X1202.VehiclePosition_2019 = new JT809VehiclePositionProperties_2019 { Encrypt = JT809_VehiclePositionEncrypt.已加密, PlatformId1 = "11111111111", @@ -106,7 +114,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody { var bytes = "0100000000313131313131313131313100000001323232323232323232323200000002333333333333333333333300000003".ToHexBytes(); JT809_0x1200_0x1202 jT809_0X1200_0X1202 = JT809_2019_Serializer.Deserialize(bytes); - var gnssData = jT809_0X1200_0X1202.VehiclePosition as VehiclePositionPropertieOf2019; + var gnssData = jT809_0X1200_0X1202.VehiclePosition_2019; Assert.Equal(JT809_VehiclePositionEncrypt.已加密, gnssData.Encrypt); Assert.Equal("11111111111", gnssData.PlatformId1); Assert.Equal(1u, gnssData.Alarm1); @@ -132,20 +140,20 @@ namespace JT809.Protocol.Test.JT809SubMessageBody Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); var jt808_0x0200Hex = JT808Serializer_2019.Serialize(jT808UploadLocationRequest, JT808.Protocol.Enums.JT808Version.JTT2019); JT809_0x1200_0x1202 jT809_0X1200_0X1202 = new JT809_0x1200_0x1202(); - jT809_0X1200_0X1202.VehiclePosition = new VehiclePositionPropertieOf2019 + jT809_0X1200_0X1202.VehiclePosition_2019 = new JT809VehiclePositionProperties_2019 { Encrypt = JT809_VehiclePositionEncrypt.已加密, GnssData = jt808_0x0200Hex, @@ -158,7 +166,6 @@ namespace JT809.Protocol.Test.JT809SubMessageBody }; var hex = JT809_2019_Serializer.Serialize(jT809_0X1200_0X1202).ToHexString(); Assert.Equal("0100000026000000010000000200BA7F0E07E4F11C0028003C000018071510101001040000006402020037313131313131313131313100000001323232323232323232323200000002333333333333333333333300000003", hex); - } [Fact] @@ -166,7 +173,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody { var bytes = "0100000026000000010000000200BA7F0E07E4F11C0028003C000018071510101001040000006402020037313131313131313131313100000001323232323232323232323200000002333333333333333333333300000003".ToHexBytes(); JT809_0x1200_0x1202 jT809_0X1200_0X1202 = JT809_2019_Serializer.Deserialize(bytes); - var gnssData = jT809_0X1200_0X1202.VehiclePosition as VehiclePositionPropertieOf2019; + var gnssData = jT809_0X1200_0X1202.VehiclePosition_2019; Assert.Equal(JT809_VehiclePositionEncrypt.已加密, gnssData.Encrypt); Assert.Equal("11111111111", gnssData.PlatformId1); Assert.Equal(1u, gnssData.Alarm1); @@ -183,9 +190,23 @@ namespace JT809.Protocol.Test.JT809SubMessageBody Assert.Equal(132444444, jt808_0x0200.Lng); Assert.Equal(60, jt808_0x0200.Speed); Assert.Equal((uint)2, jt808_0x0200.StatusFlag); - Assert.Equal(100, ((JT808_0x0200_0x01)jt808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); - Assert.Equal(55, ((JT808_0x0200_0x02)jt808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + Assert.Equal(100, ((JT808_0x0200_0x01)jt808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jt808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); } + + [Fact] + public void Test_2019_5() + { + var bytes = "0100000026000000010000000200BA7F0E07E4F11C0028003C000018071510101001040000006402020037313131313131313131313100000001323232323232323232323200000002333333333333333333333300000003".ToHexBytes(); + string json = JT809_2019_Serializer.Analyze(bytes); + } + + public void Test_2019_5_Callback(byte[] bytes, Utf8JsonWriter writer, IJT809Config jT809Config) + { + JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes); + JT808.Protocol.Extensions.JT808AnalyzeExtensions.Analyze(JT808.Protocol.JT808ConfigExtensions.GetMessagePackFormatter(jT808Config), + ref jT808MessagePackReader, writer, jT808Config); + } } } diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1203Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1203Test.cs index e07a1d5..f4ae379 100644 --- a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1203Test.cs +++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1200_0x1203Test.cs @@ -24,7 +24,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody jT809_0X1200_0X1203.GNSS = new List(); JT809_0x1200_0x1202 jT809_0X1200_0X1202_1 = new JT809_0x1200_0x1202(); - jT809_0X1200_0X1202_1.VehiclePosition = new VehiclePositionPropertieOf2011 + jT809_0X1200_0X1202_1.VehiclePosition = new JT809VehiclePositionProperties { Day = 19, Month = 7, @@ -44,7 +44,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody }; JT809_0x1200_0x1202 jT809_0X1200_0X1202_2 = new JT809_0x1200_0x1202(); - jT809_0X1200_0X1202_2.VehiclePosition = new VehiclePositionPropertieOf2011 + jT809_0X1200_0X1202_2.VehiclePosition = new JT809VehiclePositionProperties { Day = 19, Month = 7, @@ -64,7 +64,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody }; JT809_0x1200_0x1202 jT809_0X1200_0X1202_3 = new JT809_0x1200_0x1202(); - jT809_0X1200_0X1202_3.VehiclePosition = new VehiclePositionPropertieOf2011 + jT809_0X1200_0X1202_3.VehiclePosition = new JT809VehiclePositionProperties { Day = 19, Month = 7, @@ -101,9 +101,9 @@ namespace JT809.Protocol.Test.JT809SubMessageBody Assert.Equal(3, jT809_0X1200_0X1203.GNSSCount); - var vehiclePosition1 = jT809_0X1200_0X1203.GNSS[0].VehiclePosition as VehiclePositionPropertieOf2011; - var vehiclePosition2 = jT809_0X1200_0X1203.GNSS[1].VehiclePosition as VehiclePositionPropertieOf2011; - var vehiclePosition3 = jT809_0X1200_0X1203.GNSS[2].VehiclePosition as VehiclePositionPropertieOf2011; + var vehiclePosition1 = jT809_0X1200_0X1203.GNSS[0].VehiclePosition; + var vehiclePosition2 = jT809_0X1200_0X1203.GNSS[1].VehiclePosition; + var vehiclePosition3 = jT809_0X1200_0X1203.GNSS[2].VehiclePosition; Assert.Equal(19, vehiclePosition1.Day); Assert.Equal(7, vehiclePosition1.Month); Assert.Equal(2012, vehiclePosition1.Year); @@ -157,7 +157,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody jT809_0X1200_0X1203.GNSS = new List(){ new JT809_0x1200_0x1202 { - VehiclePosition = new VehiclePositionPropertieOf2019 + VehiclePosition_2019 = new JT809VehiclePositionProperties_2019 { Encrypt = JT809_VehiclePositionEncrypt.已加密, PlatformId1 = "11111111111", @@ -169,7 +169,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody } }, new JT809_0x1200_0x1202{ - VehiclePosition=new VehiclePositionPropertieOf2019{ + VehiclePosition_2019=new JT809VehiclePositionProperties_2019{ Encrypt = JT809_VehiclePositionEncrypt.已加密, PlatformId1 = "11111111111", Alarm1 = 1, @@ -192,8 +192,8 @@ namespace JT809.Protocol.Test.JT809SubMessageBody var bytes = "0201000000003131313131313131313131000000013232323232323232323232000000023333333333333333333333000000030100000000313131313131313131313100000001323232323232323232323200000002333333333333333333333300000003".ToHexBytes(); JT809_0x1200_0x1203 jT809_0X1200_0X1203 = JT809_2019_Serializer.Deserialize(bytes); - var vehiclePosition1 = jT809_0X1200_0X1203.GNSS[0].VehiclePosition as VehiclePositionPropertieOf2019; - var vehiclePosition2 = jT809_0X1200_0X1203.GNSS[1].VehiclePosition as VehiclePositionPropertieOf2019; + var vehiclePosition1 = jT809_0X1200_0X1203.GNSS[0].VehiclePosition_2019; + var vehiclePosition2 = jT809_0X1200_0X1203.GNSS[1].VehiclePosition_2019; Assert.Equal(JT809_VehiclePositionEncrypt.已加密, vehiclePosition1.Encrypt); Assert.Equal("11111111111", vehiclePosition1.PlatformId1); Assert.Equal(1u, vehiclePosition1.Alarm1); diff --git a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1500_0x1502Test.cs b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1500_0x1502Test.cs index bb60441..e63152f 100644 --- a/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1500_0x1502Test.cs +++ b/src/JT809.Protocol.Test/JT809SubMessageBody/JT809_0x1500_0x1502Test.cs @@ -21,7 +21,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody JT809_0x1500_0x1502 jT809_0x1500_0x1502 = new JT809_0x1500_0x1502 { PhotoRspFlag = JT809_0x1502_PhotoRspFlag.完成拍照, - VehiclePosition = new VehiclePositionPropertieOf2011 + VehiclePosition = new JT809VehiclePositionProperties { Encrypt = JT809_VehiclePositionEncrypt.未加密, Day = 19, @@ -55,7 +55,7 @@ namespace JT809.Protocol.Test.JT809SubMessageBody var bytes = "01 00 13 07 07 DC 0F 0F 0F 07 EF 4D 80 01 70 18 40 00 35 00 2D 00 00 04 D2 00 2D 00 2D 00 00 00 01 00 00 00 01 7B 00 00 00 00 01 01".ToHexBytes(); JT809_0x1500_0x1502 jT809_0x1500_0x1502 = JT809Serializer.Deserialize(bytes); - var vehiclePosition = jT809_0x1500_0x1502.VehiclePosition as VehiclePositionPropertieOf2011; + var vehiclePosition = jT809_0x1500_0x1502.VehiclePosition; Assert.Equal(JT809_0x1502_PhotoRspFlag.完成拍照, jT809_0x1500_0x1502.PhotoRspFlag); Assert.Equal(JT809_VehiclePositionEncrypt.未加密, vehiclePosition.Encrypt); Assert.Equal(19, vehiclePosition.Day); diff --git a/src/JT809.Protocol.Test/Simples/Demo5.cs b/src/JT809.Protocol.Test/Simples/Demo5.cs index e4e9bb9..e5be49f 100644 --- a/src/JT809.Protocol.Test/Simples/Demo5.cs +++ b/src/JT809.Protocol.Test/Simples/Demo5.cs @@ -148,20 +148,20 @@ namespace JT809.Protocol.Test.Simples Speed = 60, Direction = 0, StatusFlag = 2, - JT808LocationAttachData = new Dictionary() + BasicLocationAttachData = new Dictionary() }; - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x01, new JT808_0x0200_0x01 { Mileage = 100 }); - jT808UploadLocationRequest.JT808LocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 + jT808UploadLocationRequest.BasicLocationAttachData.Add(JT808Constants.JT808_0x0200_0x02, new JT808_0x0200_0x02 { Oil = 55 }); var jt808_0x0200Hex = JT808_2019_Serializer.Serialize(jT808UploadLocationRequest, JT808.Protocol.Enums.JT808Version.JTT2019); JT809_0x1200_0x1202 jT809_0X1200_0X1202 = new JT809_0x1200_0x1202(); - jT809_0X1200_0X1202.VehiclePosition = new Metadata.VehiclePositionPropertieOf2019 + jT809_0X1200_0X1202.VehiclePosition_2019 = new Metadata.JT809VehiclePositionProperties_2019 { Encrypt = JT809_VehiclePositionEncrypt.已加密, GnssData = jt808_0x0200Hex, @@ -182,7 +182,7 @@ namespace JT809.Protocol.Test.Simples { var bytes = "0100000026000000010000000200BA7F0E07E4F11C0028003C000018071510101001040000006402020037313131313131313131313100000001323232323232323232323200000002333333333333333333333300000003".ToHexBytes(); JT809_0x1200_0x1202 jT809_0X1200_0X1202 = JT809_2019_Serializer.Deserialize(bytes); - var GNSSData = jT809_0X1200_0X1202.VehiclePosition as Metadata.VehiclePositionPropertieOf2019; + var GNSSData = jT809_0X1200_0X1202.VehiclePosition_2019; Assert.Equal(JT809_VehiclePositionEncrypt.已加密, GNSSData.Encrypt); Assert.Equal("11111111111", GNSSData.PlatformId1); Assert.Equal(1u, GNSSData.Alarm1); @@ -199,8 +199,8 @@ namespace JT809.Protocol.Test.Simples Assert.Equal(132444444, jt808_0x0200.Lng); Assert.Equal(60, jt808_0x0200.Speed); Assert.Equal((uint)2, jt808_0x0200.StatusFlag); - Assert.Equal(100, ((JT808_0x0200_0x01)jt808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); - Assert.Equal(55, ((JT808_0x0200_0x02)jt808_0x0200.JT808LocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); + Assert.Equal(100, ((JT808_0x0200_0x01)jt808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x01]).Mileage); + Assert.Equal(55, ((JT808_0x0200_0x02)jt808_0x0200.BasicLocationAttachData[JT808Constants.JT808_0x0200_0x02]).Oil); } diff --git a/src/JT809.Protocol/Buffers/JT809BufferWriter.cs b/src/JT809.Protocol/Buffers/JT809BufferWriter.cs index 76f422f..ab8b0a3 100644 --- a/src/JT809.Protocol/Buffers/JT809BufferWriter.cs +++ b/src/JT809.Protocol/Buffers/JT809BufferWriter.cs @@ -3,7 +3,8 @@ namespace JT809.Protocol.Buffers { /// - /// + /// + /// see cref System.Buffers.Writer /// ref partial struct JT809BufferWriter { diff --git a/src/JT809.Protocol/Interfaces/IJT809Config.cs b/src/JT809.Protocol/Interfaces/IJT809Config.cs index 658cbd0..2da216c 100644 --- a/src/JT809.Protocol/Interfaces/IJT809Config.cs +++ b/src/JT809.Protocol/Interfaces/IJT809Config.cs @@ -43,6 +43,10 @@ namespace JT809.Protocol IJT809FormatterFactory FormatterFactory { get; set; } JT809Version Version { get; set; } /// + /// JT808回调消息分析器处理 + /// + Dictionary AnalyzeCallbacks { get; set; } + /// /// 全局注册外部程序集 /// /// diff --git a/src/JT809.Protocol/Interfaces/JT809GlobalConfigBase.cs b/src/JT809.Protocol/Interfaces/JT809GlobalConfigBase.cs index 6af841e..743b9ab 100644 --- a/src/JT809.Protocol/Interfaces/JT809GlobalConfigBase.cs +++ b/src/JT809.Protocol/Interfaces/JT809GlobalConfigBase.cs @@ -5,6 +5,7 @@ using JT809.Protocol.Encrypt; using JT809.Protocol.Enums; using JT809.Protocol.Internal; using System; +using System.Collections.Generic; using System.Reflection; using System.Text; @@ -20,6 +21,7 @@ namespace JT809.Protocol.Interfaces SubBusinessTypeFactory = new JT809SubBusinessTypeFactory(); FormatterFactory = new JT809FormatterFactory(); Version = version; + AnalyzeCallbacks = new Dictionary(); } public abstract string ConfigId { get; } public IJT809MsgSNDistributed MsgSNDistributed { get; set; }= new DefaultMsgSNDistributedImpl(); @@ -32,7 +34,7 @@ namespace JT809.Protocol.Interfaces public IJT809SubBusinessTypeFactory SubBusinessTypeFactory { get; set ; } public IJT809FormatterFactory FormatterFactory { get; set; } public JT809Version Version { get; set; } - + public Dictionary AnalyzeCallbacks { get; set; } public virtual IJT809Config Register(params Assembly[] externalAssemblies) { if (externalAssemblies != null) diff --git a/src/JT809.Protocol/JT809.Protocol.csproj b/src/JT809.Protocol/JT809.Protocol.csproj index f5bb4ad..f6fe86b 100644 --- a/src/JT809.Protocol/JT809.Protocol.csproj +++ b/src/JT809.Protocol/JT809.Protocol.csproj @@ -34,12 +34,12 @@ True - + diff --git a/src/JT809.Protocol/JT809.Protocol.xml b/src/JT809.Protocol/JT809.Protocol.xml index 45275a0..784b671 100644 --- a/src/JT809.Protocol/JT809.Protocol.xml +++ b/src/JT809.Protocol/JT809.Protocol.xml @@ -6,7 +6,8 @@ - + + see cref System.Buffers.Writer @@ -1123,6 +1124,11 @@ 加密选项 + + + JT808回调消息分析器处理 + + 全局注册外部程序集 @@ -1148,6 +1154,17 @@ 日期限制于2000年 + + + 目前只支持0x0200定位 + 0704需要拆分出来 + + + 0x0200 + + + + 交换信息体 @@ -1896,227 +1913,237 @@ 系统UTC时间 - + - 车辆静态信息数据体 + 车辆定位 - + - 车牌号 必填 - 车牌号码中不设分隔符号。所有字母数字连续保存 + 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。 - + - 车牌颜色 必填 应该使用枚举 + 日 - + - 车辆类型 必填 应该使用枚举 + 月 - + - 运输行业编码 必填 应该使用枚举 + 年 - + - 车籍地 必填 + 时 - + - 业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号 + 分 - + - 业户名称 必填 运输企业名称 + 秒 - + - 业户联系电话 非必填 运输企业名称 + 经度,单位为 1*10^-6 度。 - + - 车辆静态信息数据体 + 纬度,单位为 1*10^-6 度。 - + - 车牌号 必填 - 车牌号码中不设分隔符号。所有字母数字连续保存 + 速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。 - + - 车牌颜色 必填 应该使用枚举 + 行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。 - + - 车辆类型 必填 应该使用枚举 + 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km) - + - 运输行业编码 必填 应该使用枚举 + 方向,0-359,单位为度(。),正北为 0,顺时针。 - + - 车籍地 必填 + 海拔高度,单位为米(m)。 - + - 经营范围代码 必填 应该使用枚举 + 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定 - + - 业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号 + 报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定 - + - 业户名称 必填 运输企业名称 + 是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密 - + - 业户联系电话 非必填 运输企业名称 + 车辆定位信息数据长度 - + - 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。 + 车辆定位信息内容,包括车辆位置基本信息和位置附加信息 + 其数据格式安装 808-2019中8.12要求 - + - 日 + 监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 11位 - + - 月 + 报警状态,二进制标识 0 正常 1表示报警 + 具体定义按照808-2019中表18的规定 - + - 年 + 市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 + 未填写时,全填0,无市级平台应由省级平台全填1 11位 - + - 时 + 报警状态,二进制标识 0 正常 1表示报警 + 具体定义按照808-2019中表18的规定 - + - 分 + 省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 + 未填写时,全填0 11位 - + - 秒 + 报警状态,二进制标识 0 正常 1表示报警 + 具体定义按照808-2019中表18的规定 - + - 经度,单位为 1*10^-6 度。 + 车辆静态信息数据体 - + - 纬度,单位为 1*10^-6 度。 + 车牌号 必填 + 车牌号码中不设分隔符号。所有字母数字连续保存 - + - 速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。 + 车牌颜色 必填 应该使用枚举 - + - 行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。 + 车辆类型 必填 应该使用枚举 - + - 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km) + 运输行业编码 必填 应该使用枚举 - + - 方向,0-359,单位为度(。),正北为 0,顺时针。 + 车籍地 必填 - + - 海拔高度,单位为米(m)。 + 业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号 - + - 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定 + 业户名称 必填 运输企业名称 - + - 报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定 + 业户联系电话 非必填 运输企业名称 - + - 是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密 + 车辆静态信息数据体 - + - 车辆定位信息内容,包括车辆位置基本信息和位置附加信息 - 其数据格式安装 808-2019中8.12要求 + 车牌号 必填 + 车牌号码中不设分隔符号。所有字母数字连续保存 - + - 监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 11位 + 车牌颜色 必填 应该使用枚举 - + - 报警状态,二进制标识 0 正常 1表示报警 - 具体定义按照808-2019中表18的规定 + 车辆类型 必填 应该使用枚举 - + - 市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 - 未填写时,全填0,无市级平台应由省级平台全填1 11位 + 运输行业编码 必填 应该使用枚举 - + - 报警状态,二进制标识 0 正常 1表示报警 - 具体定义按照808-2019中表18的规定 + 车籍地 必填 - + - 省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 - 未填写时,全填0 11位 + 经营范围代码 必填 应该使用枚举 - + - 报警状态,二进制标识 0 正常 1表示报警 - 具体定义按照808-2019中表18的规定 + 业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号 + + + + + 业户名称 必填 运输企业名称 + + + + + 业户联系电话 非必填 运输企业名称 @@ -2168,7 +2195,12 @@ - 车辆定位信息 + 车辆定位信息 2011版本 + + + + + 车辆定位信息 2019版本 @@ -2815,7 +2847,12 @@ - 车辆定位信息 + 车辆定位信息 2011版本 + + + + + 车辆定位信息 2019版本 @@ -2997,7 +3034,12 @@ - 车辆定位信息 + 车辆定位信息 2011版本 + + + + + 车辆定位信息 2019版本 diff --git a/src/JT809.Protocol/JT809DependencyInjectionExtensions.cs b/src/JT809.Protocol/JT809DependencyInjectionExtensions.cs index 91b0ae1..bf52311 100644 --- a/src/JT809.Protocol/JT809DependencyInjectionExtensions.cs +++ b/src/JT809.Protocol/JT809DependencyInjectionExtensions.cs @@ -24,5 +24,20 @@ namespace JT809.Protocol services.AddSingleton(config); return new DefaultBuilder(services, config); } + + /// + /// 目前只支持0x0200定位 + /// 0704需要拆分出来 + /// + /// + /// 0x0200 + /// + /// + /// + public static IJT809Builder AddJT809_JT808AnalyzeCallback(this IJT809Builder builder, ushort jt808MsgId, JT808AnalyzeCallback jt808AnalyzeCallback,JT809Version version = JT809Version.JTT2011) + { + builder.Config.AnalyzeCallbacks.Add(jt808MsgId, jt808AnalyzeCallback); + return builder; + } } } diff --git a/src/JT809.Protocol/JT809_JT808AnalyzeCallback.cs b/src/JT809.Protocol/JT809_JT808AnalyzeCallback.cs new file mode 100644 index 0000000..91b400c --- /dev/null +++ b/src/JT809.Protocol/JT809_JT808AnalyzeCallback.cs @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; + +namespace JT809.Protocol +{ + public delegate void JT808AnalyzeCallback(byte[] bytes, Utf8JsonWriter writer,IJT809Config jT809Config); +} diff --git a/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties.cs b/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties.cs index 0dd0381..dd9d477 100644 --- a/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties.cs +++ b/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties.cs @@ -1,78 +1,163 @@ -// using JT809.Protocol.Enums; -// using System; -// using System.Collections.Generic; -// using System.Text; +using JT809.Protocol.Enums; +using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.Interfaces; +using JT809.Protocol.MessagePack; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; -// namespace JT809.Protocol.Metadata -// { -// /// -// /// 车辆定位 -// /// -// public class JT809VehiclePositionProperties -// { -// /// -// /// 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。 -// /// -// public JT809_VehiclePositionEncrypt Encrypt { get; set; } -// /// -// /// 日 -// /// -// public byte Day { get; set; } -// /// -// /// 月 -// /// -// public byte Month { get; set; } -// /// -// /// 年 -// /// -// public ushort Year { get; set; } -// /// -// /// 时 -// /// -// public byte Hour { get; set; } -// /// -// /// 分 -// /// -// public byte Minute { get; set; } -// /// -// /// 秒 -// /// -// public byte Second { get; set; } -// /// -// /// 经度,单位为 1*10^-6 度。 -// /// -// public uint Lon { get; set; } -// /// -// /// 纬度,单位为 1*10^-6 度。 -// /// -// public uint Lat { get; set; } -// /// -// /// 速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。 -// /// -// public ushort Vec1 { get; set; } -// /// -// /// 行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。 -// /// -// public ushort Vec2 { get; set; } -// /// -// /// 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km) -// /// -// public uint Vec3 { get; set; } -// /// -// /// 方向,0-359,单位为度(。),正北为 0,顺时针。 -// /// -// public ushort Direction { get; set; } -// /// -// /// 海拔高度,单位为米(m)。 -// /// -// public ushort Altitude { get; set; } -// /// -// /// 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定 -// /// -// public uint State { get; set; } -// /// -// /// 报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定 -// /// -// public uint Alarm { get; set; } -// } -// } +namespace JT809.Protocol.Metadata +{ + /// + /// 车辆定位 + /// + public class JT809VehiclePositionProperties : IJT809MessagePackFormatter, IJT809Analyze + { + /// + /// 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。 + /// + public JT809_VehiclePositionEncrypt Encrypt { get; set; } + /// + /// 日 + /// + public byte Day { get; set; } + /// + /// 月 + /// + public byte Month { get; set; } + /// + /// 年 + /// + public ushort Year { get; set; } + /// + /// 时 + /// + public byte Hour { get; set; } + /// + /// 分 + /// + public byte Minute { get; set; } + /// + /// 秒 + /// + public byte Second { get; set; } + /// + /// 经度,单位为 1*10^-6 度。 + /// + public uint Lon { get; set; } + /// + /// 纬度,单位为 1*10^-6 度。 + /// + public uint Lat { get; set; } + /// + /// 速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。 + /// + public ushort Vec1 { get; set; } + /// + /// 行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。 + /// + public ushort Vec2 { get; set; } + /// + /// 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km) + /// + public uint Vec3 { get; set; } + /// + /// 方向,0-359,单位为度(。),正北为 0,顺时针。 + /// + public ushort Direction { get; set; } + /// + /// 海拔高度,单位为米(m)。 + /// + public ushort Altitude { get; set; } + /// + /// 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定 + /// + public uint State { get; set; } + /// + /// 报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定 + /// + public uint Alarm { get; set; } + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + writer.WriteStartObject("车辆定位信息"); + var VehiclePosition = new JT809VehiclePositionProperties(); + VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); + writer.WriteString($"[{VehiclePosition.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", VehiclePosition.Encrypt.ToString()); + VehiclePosition.Day = reader.ReadByte(); + writer.WriteNumber($"[{VehiclePosition.Day.ReadNumber()}]日", VehiclePosition.Day); + VehiclePosition.Month = reader.ReadByte(); + writer.WriteNumber($"[{VehiclePosition.Month.ReadNumber()}]月", VehiclePosition.Month); + VehiclePosition.Year = reader.ReadUInt16(); + writer.WriteNumber($"[{VehiclePosition.Year.ReadNumber()}]年", VehiclePosition.Year); + VehiclePosition.Hour = reader.ReadByte(); + writer.WriteNumber($"[{VehiclePosition.Hour.ReadNumber()}]时", VehiclePosition.Hour); + VehiclePosition.Minute = reader.ReadByte(); + writer.WriteNumber($"[{VehiclePosition.Minute.ReadNumber()}]分", VehiclePosition.Minute); + VehiclePosition.Second = reader.ReadByte(); + writer.WriteNumber($"[{VehiclePosition.Second.ReadNumber()}]秒", VehiclePosition.Second); + VehiclePosition.Lon = reader.ReadUInt32(); + writer.WriteNumber($"[{VehiclePosition.Lon.ReadNumber()}]经度", VehiclePosition.Lon); + VehiclePosition.Lat = reader.ReadUInt32(); + writer.WriteNumber($"[{VehiclePosition.Lat.ReadNumber()}]经度", VehiclePosition.Lat); + VehiclePosition.Vec1 = reader.ReadUInt16(); + writer.WriteNumber($"[{VehiclePosition.Vec1.ReadNumber()}]速度", VehiclePosition.Vec1); + VehiclePosition.Vec2 = reader.ReadUInt16(); + writer.WriteNumber($"[{VehiclePosition.Vec2.ReadNumber()}]行驶记录仪速度", VehiclePosition.Vec2); + VehiclePosition.Vec3 = reader.ReadUInt32(); + writer.WriteNumber($"[{VehiclePosition.Vec3.ReadNumber()}]车辆当前总里程数", VehiclePosition.Vec3); + VehiclePosition.Direction = reader.ReadUInt16(); + writer.WriteNumber($"[{VehiclePosition.Direction.ReadNumber()}]方向", VehiclePosition.Direction); + VehiclePosition.Altitude = reader.ReadUInt16(); + writer.WriteNumber($"[{VehiclePosition.Altitude.ReadNumber()}]海拔高度", VehiclePosition.Altitude); + VehiclePosition.State = reader.ReadUInt32(); + writer.WriteNumber($"[{VehiclePosition.State.ReadNumber()}]车辆状态", VehiclePosition.State); + VehiclePosition.Alarm = reader.ReadUInt32(); + writer.WriteNumber($"[{VehiclePosition.Alarm.ReadNumber()}]报警", VehiclePosition.Alarm); + writer.WriteEndObject(); + } + public JT809VehiclePositionProperties Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT809VehiclePositionProperties value = new JT809VehiclePositionProperties + { + Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(), + Day = reader.ReadByte(), + Month = reader.ReadByte(), + Year = reader.ReadUInt16(), + Hour = reader.ReadByte(), + Minute = reader.ReadByte(), + Second = reader.ReadByte(), + Lon = reader.ReadUInt32(), + Lat = reader.ReadUInt32(), + Vec1 = reader.ReadUInt16(), + Vec2 = reader.ReadUInt16(), + Vec3 = reader.ReadUInt32(), + Direction = reader.ReadUInt16(), + Altitude = reader.ReadUInt16(), + State = reader.ReadUInt32(), + Alarm = reader.ReadUInt32(), + }; + return value; + } + public void Serialize(ref JT809MessagePackWriter writer, JT809VehiclePositionProperties value, IJT809Config config) + { + writer.WriteByte((byte)value.Encrypt); + writer.WriteByte(value.Day); + writer.WriteByte(value.Month); + writer.WriteUInt16(value.Year); + writer.WriteByte(value.Hour); + writer.WriteByte(value.Minute); + writer.WriteByte(value.Second); + writer.WriteUInt32(value.Lon); + writer.WriteUInt32(value.Lat); + writer.WriteUInt16(value.Vec1); + writer.WriteUInt16(value.Vec2); + writer.WriteUInt32(value.Vec3); + writer.WriteUInt16(value.Direction); + writer.WriteUInt16(value.Altitude); + writer.WriteUInt32(value.State); + writer.WriteUInt32(value.Alarm); + } + } +} diff --git a/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs b/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs index cd09b35..869a1bb 100644 --- a/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs +++ b/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs @@ -1,53 +1,121 @@ -// using JT809.Protocol.Enums; -// using System; -// using System.Collections.Generic; -// using System.Text; +using JT809.Protocol.Enums; +using JT809.Protocol.Extensions; +using JT809.Protocol.Formatters; +using JT809.Protocol.Interfaces; +using JT809.Protocol.MessagePack; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; -// namespace JT809.Protocol.Metadata -// { -// public class JT809VehiclePositionProperties_2019 -// { -// /// -// /// 是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密 -// /// -// public JT809_VehiclePositionEncrypt Encrypt { get; set; } -// /// -// /// 车辆定位信息数据长度 -// /// -// public uint DataLength { get; set; } -// /// -// /// 车辆定位信息内容,包括车辆位置基本信息和位置附加信息 -// /// 其数据格式安装 808-2019中8.12要求 -// /// -// public byte[] GnssData { get; set; } -// /// -// /// 监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 11位 -// /// -// public string PlatformId1 { get; set; } -// /// -// /// 报警状态,二进制标识 0 正常 1表示报警 -// /// 具体定义按照808-2019中表18的规定 -// /// -// public uint Alarm1 { get; set; } -// /// -// /// 市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 -// /// 未填写时,全填0,无市级平台应由省级平台全填1 11位 -// /// -// public string PlatformId2 { get; set; } -// /// -// /// 报警状态,二进制标识 0 正常 1表示报警 -// /// 具体定义按照808-2019中表18的规定 -// /// -// public uint Alarm2 { get; set; } -// /// -// /// 省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 -// /// 未填写时,全填0 11位 -// /// -// public string PlatformId3 { get; set; } -// /// -// /// 报警状态,二进制标识 0 正常 1表示报警 -// /// 具体定义按照808-2019中表18的规定 -// /// -// public uint Alarm3 { get; set; } -// } -// } +namespace JT809.Protocol.Metadata +{ + public class JT809VehiclePositionProperties_2019:IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version + { + /// + /// 是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密 + /// + public JT809_VehiclePositionEncrypt Encrypt { get; set; } + /// + /// 车辆定位信息数据长度 + /// + public uint DataLength { get; set; } + /// + /// 车辆定位信息内容,包括车辆位置基本信息和位置附加信息 + /// 其数据格式安装 808-2019中8.12要求 + /// + public byte[] GnssData { get; set; } + /// + /// 监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 11位 + /// + public string PlatformId1 { get; set; } + /// + /// 报警状态,二进制标识 0 正常 1表示报警 + /// 具体定义按照808-2019中表18的规定 + /// + public uint Alarm1 { get; set; } + /// + /// 市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 + /// 未填写时,全填0,无市级平台应由省级平台全填1 11位 + /// + public string PlatformId2 { get; set; } + /// + /// 报警状态,二进制标识 0 正常 1表示报警 + /// 具体定义按照808-2019中表18的规定 + /// + public uint Alarm2 { get; set; } + /// + /// 省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 + /// 未填写时,全填0 11位 + /// + public string PlatformId3 { get; set; } + /// + /// 报警状态,二进制标识 0 正常 1表示报警 + /// 具体定义按照808-2019中表18的规定 + /// + public uint Alarm3 { get; set; } + + public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) + { + writer.WriteStartObject("车辆定位信息_2019"); + var GNSSData = new JT809VehiclePositionProperties_2019(); + GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); + writer.WriteString($"[{GNSSData.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", GNSSData.Encrypt.ToString()); + var gnssDataLength = reader.ReadUInt32(); + writer.WriteNumber($"[{gnssDataLength.ReadNumber()}]车辆定位信息数据长度", gnssDataLength); + if(config.AnalyzeCallbacks.TryGetValue(0x0200,out JT808AnalyzeCallback jT808AnalyzeCallback)) + { + jT808AnalyzeCallback(reader.ReadArray((int)gnssDataLength).ToArray(), writer, config); + } + else + { + GNSSData.GnssData = reader.ReadArray((int)gnssDataLength).ToArray(); + writer.WriteString($"[{GNSSData.GnssData.ToHexString()}]车辆定位信息内容", GNSSData.GnssData.ToHexString()); + } + var virtualHex = reader.ReadVirtualArray(11); + GNSSData.PlatformId1 = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]监控平台唯一编码", GNSSData.PlatformId1); + GNSSData.Alarm1 = reader.ReadUInt32(); + writer.WriteNumber($"[{GNSSData.Alarm1.ReadNumber()}]报警状态1", GNSSData.Alarm1); + virtualHex = reader.ReadVirtualArray(11); + GNSSData.PlatformId2 = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]市级监控平台唯一编码", GNSSData.PlatformId2); + GNSSData.Alarm2 = reader.ReadUInt32(); + writer.WriteNumber($"[{GNSSData.Alarm1.ReadNumber()}]报警状态2", GNSSData.Alarm2); + virtualHex = reader.ReadVirtualArray(11); + GNSSData.PlatformId3 = reader.ReadString(11); + writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]省级监控平台唯一编码", GNSSData.PlatformId3); + GNSSData.Alarm3 = reader.ReadUInt32(); + writer.WriteNumber($"[{GNSSData.Alarm1.ReadNumber()}]报警状态3", GNSSData.Alarm3); + writer.WriteEndObject(); + } + public JT809VehiclePositionProperties_2019 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) + { + JT809VehiclePositionProperties_2019 value = new JT809VehiclePositionProperties_2019 + { + Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(), + GnssData = reader.ReadArray((int)reader.ReadUInt32()).ToArray(), + PlatformId1 = reader.ReadString(11), + Alarm1 = reader.ReadUInt32(), + PlatformId2 = reader.ReadString(11), + Alarm2 = reader.ReadUInt32(), + PlatformId3 = reader.ReadString(11), + Alarm3 = reader.ReadUInt32(), + }; + return value; + } + public void Serialize(ref JT809MessagePackWriter writer, JT809VehiclePositionProperties_2019 value, IJT809Config config) + { + writer.WriteByte((byte)value.Encrypt); + writer.Skip(4, out int position); + writer.WriteArray(value.GnssData); + writer.WriteUInt32Return((uint)(writer.GetCurrentPosition() - position - 4), position); + writer.WriteStringPadRight(value.PlatformId1, 11); + writer.WriteUInt32(value.Alarm1); + writer.WriteStringPadRight(value.PlatformId2, 11); + writer.WriteUInt32(value.Alarm2); + writer.WriteStringPadRight(value.PlatformId3, 11); + writer.WriteUInt32(value.Alarm3); + } + } +} diff --git a/src/JT809.Protocol/Metadata/VehiclePositionPropertieBase.cs b/src/JT809.Protocol/Metadata/VehiclePositionPropertieBase.cs deleted file mode 100644 index 4013fae..0000000 --- a/src/JT809.Protocol/Metadata/VehiclePositionPropertieBase.cs +++ /dev/null @@ -1,260 +0,0 @@ -using System.Text.Json; -using JT809.Protocol.Enums; -using JT809.Protocol.Exceptions; -using JT809.Protocol.Extensions; -using JT809.Protocol.MessagePack; - -namespace JT809.Protocol.Metadata -{ - public abstract class VehiclePositionPropertieBase - { - public static void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) - { - if (config.Version == JT809Version.JTT2011) - { - var VehiclePosition = new VehiclePositionPropertieOf2011(); - VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - writer.WriteString($"[{VehiclePosition.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", VehiclePosition.Encrypt.ToString()); - VehiclePosition.Day = reader.ReadByte(); - writer.WriteNumber($"[{VehiclePosition.Day.ReadNumber()}]日", VehiclePosition.Day); - VehiclePosition.Month = reader.ReadByte(); - writer.WriteNumber($"[{VehiclePosition.Month.ReadNumber()}]月", VehiclePosition.Month); - VehiclePosition.Year = reader.ReadUInt16(); - writer.WriteNumber($"[{VehiclePosition.Year.ReadNumber()}]年", VehiclePosition.Year); - VehiclePosition.Hour = reader.ReadByte(); - writer.WriteNumber($"[{VehiclePosition.Hour.ReadNumber()}]时", VehiclePosition.Hour); - VehiclePosition.Minute = reader.ReadByte(); - writer.WriteNumber($"[{VehiclePosition.Minute.ReadNumber()}]分", VehiclePosition.Minute); - VehiclePosition.Second = reader.ReadByte(); - writer.WriteNumber($"[{VehiclePosition.Second.ReadNumber()}]秒", VehiclePosition.Second); - VehiclePosition.Lon = reader.ReadUInt32(); - writer.WriteNumber($"[{VehiclePosition.Lon.ReadNumber()}]经度", VehiclePosition.Lon); - VehiclePosition.Lat = reader.ReadUInt32(); - writer.WriteNumber($"[{VehiclePosition.Lat.ReadNumber()}]经度", VehiclePosition.Lat); - VehiclePosition.Vec1 = reader.ReadUInt16(); - writer.WriteNumber($"[{VehiclePosition.Vec1.ReadNumber()}]速度", VehiclePosition.Vec1); - VehiclePosition.Vec2 = reader.ReadUInt16(); - writer.WriteNumber($"[{VehiclePosition.Vec2.ReadNumber()}]行驶记录仪速度", VehiclePosition.Vec2); - VehiclePosition.Vec3 = reader.ReadUInt32(); - writer.WriteNumber($"[{VehiclePosition.Vec3.ReadNumber()}]车辆当前总里程数", VehiclePosition.Vec3); - VehiclePosition.Direction = reader.ReadUInt16(); - writer.WriteNumber($"[{VehiclePosition.Direction.ReadNumber()}]方向", VehiclePosition.Direction); - VehiclePosition.Altitude = reader.ReadUInt16(); - writer.WriteNumber($"[{VehiclePosition.Altitude.ReadNumber()}]海拔高度", VehiclePosition.Altitude); - VehiclePosition.State = reader.ReadUInt32(); - writer.WriteNumber($"[{VehiclePosition.State.ReadNumber()}]车辆状态", VehiclePosition.State); - VehiclePosition.Alarm = reader.ReadUInt32(); - writer.WriteNumber($"[{VehiclePosition.Alarm.ReadNumber()}]报警", VehiclePosition.Alarm); - } - else - { - var GNSSData = new VehiclePositionPropertieOf2019(); - GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - writer.WriteString($"[{GNSSData.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", GNSSData.Encrypt.ToString()); - var gnssDataLength = reader.ReadUInt32(); - writer.WriteNumber($"[{gnssDataLength.ReadNumber()}]车辆定位信息数据长度", gnssDataLength); - GNSSData.GnssData = reader.ReadArray((int)gnssDataLength).ToArray(); - writer.WriteString($"[{GNSSData.GnssData.ToHexString()}]车辆定位信息内容", GNSSData.GnssData.ToHexString()); - var virtualHex = reader.ReadVirtualArray(11); - GNSSData.PlatformId1 = reader.ReadString(11); - writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]监控平台唯一编码", GNSSData.PlatformId1); - GNSSData.Alarm1 = reader.ReadUInt32(); - writer.WriteNumber($"[{GNSSData.Alarm1.ReadNumber()}]报警状态1", GNSSData.Alarm1); - virtualHex = reader.ReadVirtualArray(11); - GNSSData.PlatformId2 = reader.ReadString(11); - writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]市级监控平台唯一编码", GNSSData.PlatformId2); - GNSSData.Alarm2 = reader.ReadUInt32(); - writer.WriteNumber($"[{GNSSData.Alarm1.ReadNumber()}]报警状态2", GNSSData.Alarm2); - virtualHex = reader.ReadVirtualArray(11); - GNSSData.PlatformId3 = reader.ReadString(11); - writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]省级监控平台唯一编码", GNSSData.PlatformId3); - GNSSData.Alarm3 = reader.ReadUInt32(); - writer.WriteNumber($"[{GNSSData.Alarm1.ReadNumber()}]报警状态3", GNSSData.Alarm3); - } - } - - public static VehiclePositionPropertieBase Deserialize(ref JT809MessagePackReader reader, IJT809Config config) - { - return config.Version switch - { - JT809Version.JTT2011 => new VehiclePositionPropertieOf2011 - { - Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(), - Day = reader.ReadByte(), - Month = reader.ReadByte(), - Year = reader.ReadUInt16(), - Hour = reader.ReadByte(), - Minute = reader.ReadByte(), - Second = reader.ReadByte(), - Lon = reader.ReadUInt32(), - Lat = reader.ReadUInt32(), - Vec1 = reader.ReadUInt16(), - Vec2 = reader.ReadUInt16(), - Vec3 = reader.ReadUInt32(), - Direction = reader.ReadUInt16(), - Altitude = reader.ReadUInt16(), - State = reader.ReadUInt32(), - Alarm = reader.ReadUInt32(), - }, - JT809Version.JTT2019 => new VehiclePositionPropertieOf2019 - { - Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(), - GnssData = reader.ReadArray((int)reader.ReadUInt32()).ToArray(), - PlatformId1 = reader.ReadString(11), - Alarm1 = reader.ReadUInt32(), - PlatformId2 = reader.ReadString(11), - Alarm2 = reader.ReadUInt32(), - PlatformId3 = reader.ReadString(11), - Alarm3 = reader.ReadUInt32(), - }, - _ => throw new JT809Exception(JT809ErrorCode.IllegalArgument, "根据版本解析车辆位置信息时检测到不支持的版本") - }; - } - public static void Serialize(ref JT809MessagePackWriter writer, VehiclePositionPropertieBase value, IJT809Config config) - { - switch (value) - { - case VehiclePositionPropertieOf2011 vehiclePositionPropertieOf2011: - - writer.WriteByte((byte)vehiclePositionPropertieOf2011.Encrypt); - writer.WriteByte(vehiclePositionPropertieOf2011.Day); - writer.WriteByte(vehiclePositionPropertieOf2011.Month); - writer.WriteUInt16(vehiclePositionPropertieOf2011.Year); - writer.WriteByte(vehiclePositionPropertieOf2011.Hour); - writer.WriteByte(vehiclePositionPropertieOf2011.Minute); - writer.WriteByte(vehiclePositionPropertieOf2011.Second); - writer.WriteUInt32(vehiclePositionPropertieOf2011.Lon); - writer.WriteUInt32(vehiclePositionPropertieOf2011.Lat); - writer.WriteUInt16(vehiclePositionPropertieOf2011.Vec1); - writer.WriteUInt16(vehiclePositionPropertieOf2011.Vec2); - writer.WriteUInt32(vehiclePositionPropertieOf2011.Vec3); - writer.WriteUInt16(vehiclePositionPropertieOf2011.Direction); - writer.WriteUInt16(vehiclePositionPropertieOf2011.Altitude); - writer.WriteUInt32(vehiclePositionPropertieOf2011.State); - writer.WriteUInt32(vehiclePositionPropertieOf2011.Alarm); - break; - case VehiclePositionPropertieOf2019 vehiclePositionPropertieOf2019: - writer.WriteByte((byte)vehiclePositionPropertieOf2019.Encrypt); - writer.Skip(4, out int position); - writer.WriteArray(vehiclePositionPropertieOf2019.GnssData); - writer.WriteUInt32Return((uint)(writer.GetCurrentPosition() - position - 4), position); - writer.WriteStringPadRight(vehiclePositionPropertieOf2019.PlatformId1, 11); - writer.WriteUInt32(vehiclePositionPropertieOf2019.Alarm1); - writer.WriteStringPadRight(vehiclePositionPropertieOf2019.PlatformId2, 11); - writer.WriteUInt32(vehiclePositionPropertieOf2019.Alarm2); - writer.WriteStringPadRight(vehiclePositionPropertieOf2019.PlatformId3, 11); - writer.WriteUInt32(vehiclePositionPropertieOf2019.Alarm3); - break; - default: throw new JT809Exception(JT809ErrorCode.IllegalArgument, "根据版本解析车辆位置信息时检测到不支持的版本"); - } - } - } - public class VehiclePositionPropertieOf2011 : VehiclePositionPropertieBase - { - /// - /// 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。 - /// - public JT809_VehiclePositionEncrypt Encrypt { get; set; } - /// - /// 日 - /// - public byte Day { get; set; } - /// - /// 月 - /// - public byte Month { get; set; } - /// - /// 年 - /// - public ushort Year { get; set; } - /// - /// 时 - /// - public byte Hour { get; set; } - /// - /// 分 - /// - public byte Minute { get; set; } - /// - /// 秒 - /// - public byte Second { get; set; } - /// - /// 经度,单位为 1*10^-6 度。 - /// - public uint Lon { get; set; } - /// - /// 纬度,单位为 1*10^-6 度。 - /// - public uint Lat { get; set; } - /// - /// 速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。 - /// - public ushort Vec1 { get; set; } - /// - /// 行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。 - /// - public ushort Vec2 { get; set; } - /// - /// 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km) - /// - public uint Vec3 { get; set; } - /// - /// 方向,0-359,单位为度(。),正北为 0,顺时针。 - /// - public ushort Direction { get; set; } - /// - /// 海拔高度,单位为米(m)。 - /// - public ushort Altitude { get; set; } - /// - /// 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定 - /// - public uint State { get; set; } - /// - /// 报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定 - /// - public uint Alarm { get; set; } - } - public class VehiclePositionPropertieOf2019 : VehiclePositionPropertieBase - { - /// - /// 是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密 - /// - public JT809_VehiclePositionEncrypt Encrypt { get; set; } - /// - /// 车辆定位信息内容,包括车辆位置基本信息和位置附加信息 - /// 其数据格式安装 808-2019中8.12要求 - /// - public byte[] GnssData { get; set; } - /// - /// 监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 11位 - /// - public string PlatformId1 { get; set; } - /// - /// 报警状态,二进制标识 0 正常 1表示报警 - /// 具体定义按照808-2019中表18的规定 - /// - public uint Alarm1 { get; set; } - /// - /// 市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 - /// 未填写时,全填0,无市级平台应由省级平台全填1 11位 - /// - public string PlatformId2 { get; set; } - /// - /// 报警状态,二进制标识 0 正常 1表示报警 - /// 具体定义按照808-2019中表18的规定 - /// - public uint Alarm2 { get; set; } - /// - /// 省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 - /// 未填写时,全填0 11位 - /// - public string PlatformId3 { get; set; } - /// - /// 报警状态,二进制标识 0 正常 1表示报警 - /// 具体定义按照808-2019中表18的规定 - /// - public uint Alarm3 { get; set; } - } -} \ No newline at end of file diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs index 2232133..d058fc2 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs @@ -20,28 +20,56 @@ namespace JT809.Protocol.SubMessageBody public override string Description => "实时上传车辆定位信息"; /// - /// 车辆定位信息 + /// 车辆定位信息 2011版本 /// - public VehiclePositionPropertieBase VehiclePosition { get; set; } + public JT809VehiclePositionProperties VehiclePosition { get; set; } + /// + /// 车辆定位信息 2019版本 + /// + public JT809VehiclePositionProperties_2019 VehiclePosition_2019 { get; set; } public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) { - JT809_0x1200_0x1202 value = new JT809_0x1200_0x1202(); - writer.WriteStartObject("车辆定位信息"); - VehiclePositionPropertieBase.Analyze(ref reader, writer, config); - writer.WriteEndObject(); + if(config.Version== JT809Version.JTT2011) + { + config.GetMessagePackFormatter().Analyze(ref reader, writer, config); + } + else if(config.Version == JT809Version.JTT2019) + { + config.GetMessagePackFormatter().Analyze(ref reader, writer, config); + } } public JT809_0x1200_0x1202 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x1200_0x1202 value = new JT809_0x1200_0x1202(); - value.VehiclePosition = VehiclePositionPropertieBase.Deserialize(ref reader, config); + if (config.Version == JT809Version.JTT2011) + { + value.VehiclePosition = config.GetMessagePackFormatter().Deserialize(ref reader, config); + } + else if(config.Version == JT809Version.JTT2019) + { + value.VehiclePosition_2019 = config.GetMessagePackFormatter().Deserialize(ref reader, config); + } return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x1202 value, IJT809Config config) { - VehiclePositionPropertieBase.Serialize(ref writer, value.VehiclePosition, config); + if (config.Version == JT809Version.JTT2011) + { + if (value.VehiclePosition != null) + { + config.GetMessagePackFormatter().Serialize(ref writer, value.VehiclePosition, config); + } + } + else if (config.Version == JT809Version.JTT2019) + { + if (value.VehiclePosition_2019 != null) + { + config.GetMessagePackFormatter().Serialize(ref writer, value.VehiclePosition_2019, config); + } + } } } } diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs index 0617922..31afe24 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs @@ -27,9 +27,13 @@ namespace JT809.Protocol.SubMessageBody public JT809_0x1502_PhotoRspFlag PhotoRspFlag { get; set; } /// - /// 车辆定位信息 + /// 车辆定位信息 2011版本 /// - public VehiclePositionPropertieBase VehiclePosition { get; set; } + public JT809VehiclePositionProperties VehiclePosition { get; set; } + /// + /// 车辆定位信息 2019版本 + /// + public JT809VehiclePositionProperties_2019 VehiclePosition_2019 { get; set; } /// /// 镜头ID /// @@ -56,9 +60,14 @@ namespace JT809.Protocol.SubMessageBody JT809_0x1500_0x1502 value = new JT809_0x1500_0x1502(); value.PhotoRspFlag = (JT809_0x1502_PhotoRspFlag)reader.ReadByte(); writer.WriteString($"[{value.PhotoRspFlag.ToByteValue()}]拍照应答标识", value.PhotoRspFlag.ToString()); - writer.WriteStartObject("车辆定位信息"); - VehiclePositionPropertieBase.Analyze(ref reader, writer, config); - writer.WriteEndObject(); + if (config.Version == JT809Version.JTT2011) + { + config.GetMessagePackFormatter().Analyze(ref reader, writer, config); + } + else if (config.Version == JT809Version.JTT2019) + { + config.GetMessagePackFormatter().Analyze(ref reader, writer, config); + } value.LensID = reader.ReadByte(); writer.WriteNumber($"[{value.LensID}]镜头ID", value.LensID); value.PhotoLen = reader.ReadUInt32(); @@ -78,7 +87,14 @@ namespace JT809.Protocol.SubMessageBody { JT809_0x1500_0x1502 value = new JT809_0x1500_0x1502(); value.PhotoRspFlag = (JT809_0x1502_PhotoRspFlag)reader.ReadByte(); - value.VehiclePosition = VehiclePositionPropertieBase.Deserialize(ref reader, config); + if (config.Version == JT809Version.JTT2011) + { + value.VehiclePosition = config.GetMessagePackFormatter().Deserialize(ref reader, config); + } + else if (config.Version == JT809Version.JTT2019) + { + value.VehiclePosition_2019 = config.GetMessagePackFormatter().Deserialize(ref reader, config); + } value.LensID = reader.ReadByte(); value.PhotoLen = reader.ReadUInt32(); value.SizeType = (JT809__0x9502_SizeType)reader.ReadByte(); @@ -93,7 +109,20 @@ namespace JT809.Protocol.SubMessageBody public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1500_0x1502 value, IJT809Config config) { writer.WriteByte((byte)value.PhotoRspFlag); - VehiclePositionPropertieBase.Serialize(ref writer, value.VehiclePosition, config); + if (config.Version == JT809Version.JTT2011) + { + if (value.VehiclePosition != null) + { + config.GetMessagePackFormatter().Serialize(ref writer, value.VehiclePosition, config); + } + } + else if (config.Version == JT809Version.JTT2019) + { + if (value.VehiclePosition_2019 != null) + { + config.GetMessagePackFormatter().Serialize(ref writer, value.VehiclePosition_2019, config); + } + } writer.WriteByte(value.LensID); bool isPhoto = (value.Photo != null && value.Photo.Length > 0); writer.WriteUInt32(isPhoto ? (uint)value.Photo.Length : 0); diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs index 05cd9f3..f28b67a 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs @@ -26,28 +26,56 @@ namespace JT809.Protocol.SubMessageBody public override string Description => "交换车辆定位信息消息"; /// - /// 车辆定位信息 + /// 车辆定位信息 2011版本 /// - public VehiclePositionPropertieBase VehiclePosition { get; set; } + public JT809VehiclePositionProperties VehiclePosition { get; set; } + /// + /// 车辆定位信息 2019版本 + /// + public JT809VehiclePositionProperties_2019 VehiclePosition_2019 { get; set; } public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) { - JT809_0x9200_0x9202 value = new JT809_0x9200_0x9202(); - writer.WriteStartObject("车辆定位信息"); - VehiclePositionPropertieBase.Analyze(ref reader, writer, config); - writer.WriteEndObject(); + if (config.Version == JT809Version.JTT2011) + { + config.GetMessagePackFormatter().Analyze(ref reader, writer, config); + } + else if (config.Version == JT809Version.JTT2019) + { + config.GetMessagePackFormatter().Analyze(ref reader, writer, config); + } } public JT809_0x9200_0x9202 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x9200_0x9202 value = new JT809_0x9200_0x9202(); - value.VehiclePosition = VehiclePositionPropertieBase.Deserialize(ref reader, config); + if (config.Version == JT809Version.JTT2011) + { + value.VehiclePosition = config.GetMessagePackFormatter().Deserialize(ref reader, config); + } + else if (config.Version == JT809Version.JTT2019) + { + value.VehiclePosition_2019 = config.GetMessagePackFormatter().Deserialize(ref reader, config); + } return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x9202 value, IJT809Config config) { - VehiclePositionPropertieBase.Serialize(ref writer, value.VehiclePosition, config); + if (config.Version == JT809Version.JTT2011) + { + if (value.VehiclePosition != null) + { + config.GetMessagePackFormatter().Serialize(ref writer, value.VehiclePosition, config); + } + } + else if (config.Version == JT809Version.JTT2019) + { + if (value.VehiclePosition_2019 != null) + { + config.GetMessagePackFormatter().Serialize(ref writer, value.VehiclePosition_2019, config); + } + } } } }