From e7848ed5b3c09522ad28aca66c11c939acfd81da Mon Sep 17 00:00:00 2001 From: yedajiang44 <602830483@qq.com> Date: Sun, 3 Oct 2021 15:54:46 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=BD=A6=E8=BE=86=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=B9=B6=E4=BF=AE=E5=A4=8D0x1502?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/JT809.Protocol/JT809.Protocol.xml | 198 +++++++------ .../JT809VehiclePositionProperties.cs | 154 +++++------ .../JT809VehiclePositionProperties_2019.cs | 104 +++---- .../Metadata/VehiclePositionPropertieBase.cs | 260 ++++++++++++++++++ .../SubMessageBody/JT809_0x1200_0x1202.cs | 135 +-------- .../SubMessageBody/JT809_0x1500_0x1502.cs | 75 +---- .../SubMessageBody/JT809_0x9200_0x9202.cs | 140 +--------- 7 files changed, 500 insertions(+), 566 deletions(-) create mode 100644 src/JT809.Protocol/Metadata/VehiclePositionPropertieBase.cs diff --git a/src/JT809.Protocol/JT809.Protocol.xml b/src/JT809.Protocol/JT809.Protocol.xml index ac82185..45275a0 100644 --- a/src/JT809.Protocol/JT809.Protocol.xml +++ b/src/JT809.Protocol/JT809.Protocol.xml @@ -1896,237 +1896,227 @@ 系统UTC时间 - - - 车辆定位 - - - - - 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。 - - - + - 日 + 车辆静态信息数据体 - + - 月 + 车牌号 必填 + 车牌号码中不设分隔符号。所有字母数字连续保存 - + - 年 + 车牌颜色 必填 应该使用枚举 - + - 时 + 车辆类型 必填 应该使用枚举 - + - 分 + 运输行业编码 必填 应该使用枚举 - + - 秒 + 车籍地 必填 - + - 经度,单位为 1*10^-6 度。 + 业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号 - + - 纬度,单位为 1*10^-6 度。 + 业户名称 必填 运输企业名称 - + - 速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。 + 业户联系电话 非必填 运输企业名称 - + - 行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。 + 车辆静态信息数据体 - + - 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km) + 车牌号 必填 + 车牌号码中不设分隔符号。所有字母数字连续保存 - + - 方向,0-359,单位为度(。),正北为 0,顺时针。 + 车牌颜色 必填 应该使用枚举 - + - 海拔高度,单位为米(m)。 + 车辆类型 必填 应该使用枚举 - + - 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定 + 运输行业编码 必填 应该使用枚举 - + - 报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定 + 车籍地 必填 - + - 是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密 + 经营范围代码 必填 应该使用枚举 - + - 车辆定位信息数据长度 + 业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号 - + - 车辆定位信息内容,包括车辆位置基本信息和位置附加信息 - 其数据格式安装 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)。 - + - 业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号 + 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km) - + - 业户名称 必填 运输企业名称 + 方向,0-359,单位为度(。),正北为 0,顺时针。 - + - 业户联系电话 非必填 运输企业名称 + 海拔高度,单位为米(m)。 - + - 车辆静态信息数据体 + 车辆状态,二进制表示,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位 - + - 业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号 + 报警状态,二进制标识 0 正常 1表示报警 + 具体定义按照808-2019中表18的规定 - + - 业户名称 必填 运输企业名称 + 省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 + 未填写时,全填0 11位 - + - 业户联系电话 非必填 运输企业名称 + 报警状态,二进制标识 0 正常 1表示报警 + 具体定义按照808-2019中表18的规定 diff --git a/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties.cs b/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties.cs index 9962ed6..0dd0381 100644 --- a/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties.cs +++ b/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties.cs @@ -1,78 +1,78 @@ -using JT809.Protocol.Enums; -using System; -using System.Collections.Generic; -using System.Text; +// using JT809.Protocol.Enums; +// using System; +// using System.Collections.Generic; +// using System.Text; -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 +// { +// /// +// /// 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。 +// /// +// 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; } +// } +// } diff --git a/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs b/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs index 880ac96..cd09b35 100644 --- a/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs +++ b/src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs @@ -1,53 +1,53 @@ -using JT809.Protocol.Enums; -using System; -using System.Collections.Generic; -using System.Text; +// using JT809.Protocol.Enums; +// using System; +// using System.Collections.Generic; +// using System.Text; -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 +// { +// /// +// /// 是否使用国测局批准的地图保密插件进行加密 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; } +// } +// } diff --git a/src/JT809.Protocol/Metadata/VehiclePositionPropertieBase.cs b/src/JT809.Protocol/Metadata/VehiclePositionPropertieBase.cs new file mode 100644 index 0000000..4013fae --- /dev/null +++ b/src/JT809.Protocol/Metadata/VehiclePositionPropertieBase.cs @@ -0,0 +1,260 @@ +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 9f8f04a..2232133 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs @@ -14,7 +14,7 @@ namespace JT809.Protocol.SubMessageBody /// 车辆的实时定位信息 /// 无需应答 /// - public class JT809_0x1200_0x1202:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version + public class JT809_0x1200_0x1202 : JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.实时上传车辆定位信息.ToUInt16Value(); @@ -22,151 +22,26 @@ namespace JT809.Protocol.SubMessageBody /// /// 车辆定位信息 /// - public JT809VehiclePositionProperties VehiclePosition { get; set; } - - public JT809VehiclePositionProperties_2019 GNSSData { get; set; } + public VehiclePositionPropertieBase VehiclePosition { get; set; } public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) { JT809_0x1200_0x1202 value = new JT809_0x1200_0x1202(); writer.WriteStartObject("车辆定位信息"); - if (config.Version == JT809Version.JTT2011) - { - value.VehiclePosition = new JT809VehiclePositionProperties(); - value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - writer.WriteString($"[{value.VehiclePosition.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", value.VehiclePosition.Encrypt.ToString()); - value.VehiclePosition.Day = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Day.ReadNumber()}]日", value.VehiclePosition.Day); - value.VehiclePosition.Month = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Month.ReadNumber()}]月", value.VehiclePosition.Month); - value.VehiclePosition.Year = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Year.ReadNumber()}]年", value.VehiclePosition.Year); - value.VehiclePosition.Hour = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Hour.ReadNumber()}]时", value.VehiclePosition.Hour); - value.VehiclePosition.Minute = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Minute.ReadNumber()}]分", value.VehiclePosition.Minute); - value.VehiclePosition.Second = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Second.ReadNumber()}]秒", value.VehiclePosition.Second); - value.VehiclePosition.Lon = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Lon.ReadNumber()}]经度", value.VehiclePosition.Lon); - value.VehiclePosition.Lat = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Lat.ReadNumber()}]经度", value.VehiclePosition.Lat); - value.VehiclePosition.Vec1 = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Vec1.ReadNumber()}]速度", value.VehiclePosition.Vec1); - value.VehiclePosition.Vec2 = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Vec2.ReadNumber()}]行驶记录仪速度", value.VehiclePosition.Vec2); - value.VehiclePosition.Vec3 = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Vec3.ReadNumber()}]车辆当前总里程数", value.VehiclePosition.Vec3); - value.VehiclePosition.Direction = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Direction.ReadNumber()}]方向", value.VehiclePosition.Direction); - value.VehiclePosition.Altitude = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Altitude.ReadNumber()}]海拔高度", value.VehiclePosition.Altitude); - value.VehiclePosition.State = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.State.ReadNumber()}]车辆状态", value.VehiclePosition.State); - value.VehiclePosition.Alarm = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Alarm.ReadNumber()}]报警", value.VehiclePosition.Alarm); - } - else - { - value.GNSSData = new JT809VehiclePositionProperties_2019(); - value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - writer.WriteString($"[{value.GNSSData.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", value.GNSSData.Encrypt.ToString()); - value.GNSSData.DataLength = reader.ReadUInt32(); - writer.WriteNumber($"[{value.GNSSData.DataLength.ReadNumber()}]车辆定位信息数据长度", value.GNSSData.DataLength); - value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray(); - writer.WriteString($"[{value.GNSSData.GnssData.ToHexString()}]车辆定位信息内容",value.GNSSData.GnssData.ToHexString()); - var virtualHex = reader.ReadVirtualArray(11); - value.GNSSData.PlatformId1 = reader.ReadString(11); - writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]监控平台唯一编码", value.GNSSData.PlatformId1); - value.GNSSData.Alarm1 = reader.ReadUInt32(); - writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态1", value.GNSSData.Alarm1); - virtualHex = reader.ReadVirtualArray(11); - value.GNSSData.PlatformId2 = reader.ReadString(11); - writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]市级监控平台唯一编码", value.GNSSData.PlatformId2); - value.GNSSData.Alarm2 = reader.ReadUInt32(); - writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态2", value.GNSSData.Alarm2); - virtualHex = reader.ReadVirtualArray(11); - value.GNSSData.PlatformId3 = reader.ReadString(11); - writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]省级监控平台唯一编码", value.GNSSData.PlatformId3); - value.GNSSData.Alarm3 = reader.ReadUInt32(); - writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态3", value.GNSSData.Alarm3); - } + VehiclePositionPropertieBase.Analyze(ref reader, writer, config); writer.WriteEndObject(); } public JT809_0x1200_0x1202 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x1200_0x1202 value = new JT809_0x1200_0x1202(); - if (config.Version == JT809Version.JTT2011) - { - value.VehiclePosition = new JT809VehiclePositionProperties(); - value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - value.VehiclePosition.Day = reader.ReadByte(); - value.VehiclePosition.Month = reader.ReadByte(); - value.VehiclePosition.Year = reader.ReadUInt16(); - value.VehiclePosition.Hour = reader.ReadByte(); - value.VehiclePosition.Minute = reader.ReadByte(); - value.VehiclePosition.Second = reader.ReadByte(); - value.VehiclePosition.Lon = reader.ReadUInt32(); - value.VehiclePosition.Lat = reader.ReadUInt32(); - value.VehiclePosition.Vec1 = reader.ReadUInt16(); - value.VehiclePosition.Vec2 = reader.ReadUInt16(); - value.VehiclePosition.Vec3 = reader.ReadUInt32(); - value.VehiclePosition.Direction = reader.ReadUInt16(); - value.VehiclePosition.Altitude = reader.ReadUInt16(); - value.VehiclePosition.State = reader.ReadUInt32(); - value.VehiclePosition.Alarm = reader.ReadUInt32(); - } - else - { - value.GNSSData = new JT809VehiclePositionProperties_2019(); - value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - value.GNSSData.DataLength = reader.ReadUInt32(); - value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray(); - value.GNSSData.PlatformId1 = reader.ReadString(11); - value.GNSSData.Alarm1 = reader.ReadUInt32(); - value.GNSSData.PlatformId2 = reader.ReadString(11); - value.GNSSData.Alarm2 = reader.ReadUInt32(); - value.GNSSData.PlatformId3 = reader.ReadString(11); - value.GNSSData.Alarm3 = reader.ReadUInt32(); - } + value.VehiclePosition = VehiclePositionPropertieBase.Deserialize(ref reader, config); return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1200_0x1202 value, IJT809Config config) { - if (config.Version == JT809Version.JTT2011) - { - writer.WriteByte((byte)value.VehiclePosition.Encrypt); - writer.WriteByte(value.VehiclePosition.Day); - writer.WriteByte(value.VehiclePosition.Month); - writer.WriteUInt16(value.VehiclePosition.Year); - writer.WriteByte(value.VehiclePosition.Hour); - writer.WriteByte(value.VehiclePosition.Minute); - writer.WriteByte(value.VehiclePosition.Second); - writer.WriteUInt32(value.VehiclePosition.Lon); - writer.WriteUInt32(value.VehiclePosition.Lat); - writer.WriteUInt16(value.VehiclePosition.Vec1); - writer.WriteUInt16(value.VehiclePosition.Vec2); - writer.WriteUInt32(value.VehiclePosition.Vec3); - writer.WriteUInt16(value.VehiclePosition.Direction); - writer.WriteUInt16(value.VehiclePosition.Altitude); - writer.WriteUInt32(value.VehiclePosition.State); - writer.WriteUInt32(value.VehiclePosition.Alarm); - } - else - { - writer.WriteByte((byte)value.GNSSData.Encrypt); - writer.Skip(4, out int position); - writer.WriteArray(value.GNSSData.GnssData); - writer.WriteUInt32Return((uint)(writer.GetCurrentPosition() - position - 4), position); - writer.WriteStringPadRight(value.GNSSData.PlatformId1,11); - writer.WriteUInt32(value.GNSSData.Alarm1); - writer.WriteStringPadRight(value.GNSSData.PlatformId2,11); - writer.WriteUInt32(value.GNSSData.Alarm2); - writer.WriteStringPadRight(value.GNSSData.PlatformId3,11); - writer.WriteUInt32(value.GNSSData.Alarm3); - } + VehiclePositionPropertieBase.Serialize(ref writer, value.VehiclePosition, config); } } } diff --git a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs index 33b494c..0617922 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs @@ -16,15 +16,11 @@ namespace JT809.Protocol.SubMessageBody /// 子业务类型标识:UP_ CTRL_ MSG _TAKE_ PHOTO_ ACK /// 描述:下级平台应答上级平台发送的车辆拍照请求消息,上传图片信息到上级平台 /// - public class JT809_0x1500_0x1502:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze + public class JT809_0x1500_0x1502 : JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze { public override ushort SubMsgId => JT809SubBusinessType.车辆拍照应答.ToUInt16Value(); public override string Description => "车辆拍照应答"; - public JT809_0x1500_0x1502() - { - VehiclePosition = new JT809VehiclePositionProperties(); - } /// /// 拍照应答标识 /// @@ -33,7 +29,7 @@ namespace JT809.Protocol.SubMessageBody /// /// 车辆定位信息 /// - public JT809VehiclePositionProperties VehiclePosition { get; set; } + public VehiclePositionPropertieBase VehiclePosition { get; set; } /// /// 镜头ID /// @@ -61,38 +57,7 @@ namespace JT809.Protocol.SubMessageBody value.PhotoRspFlag = (JT809_0x1502_PhotoRspFlag)reader.ReadByte(); writer.WriteString($"[{value.PhotoRspFlag.ToByteValue()}]拍照应答标识", value.PhotoRspFlag.ToString()); writer.WriteStartObject("车辆定位信息"); - value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - writer.WriteString($"[{value.VehiclePosition.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", value.VehiclePosition.Encrypt.ToString()); - value.VehiclePosition.Day = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Day}]日", value.VehiclePosition.Day); - value.VehiclePosition.Month = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Month}]月", value.VehiclePosition.Month); - value.VehiclePosition.Year = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Year}]年", value.VehiclePosition.Year); - value.VehiclePosition.Hour = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Hour}]时", value.VehiclePosition.Hour); - value.VehiclePosition.Minute = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Minute}]分", value.VehiclePosition.Minute); - value.VehiclePosition.Second = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Second}]秒", value.VehiclePosition.Second); - value.VehiclePosition.Lon = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Lon}]经度", value.VehiclePosition.Lon); - value.VehiclePosition.Lat = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Lat}]纬度", value.VehiclePosition.Lat); - value.VehiclePosition.Vec1 = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Vec1}]速度", value.VehiclePosition.Vec1); - value.VehiclePosition.Vec2 = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Vec2}]行驶记录速度", value.VehiclePosition.Vec2); - value.VehiclePosition.Vec3 = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Vec3}]车辆当前总里程数", value.VehiclePosition.Vec3); - value.VehiclePosition.Direction = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Direction}]方向", value.VehiclePosition.Direction); - value.VehiclePosition.Altitude = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Altitude}]海拔高度", value.VehiclePosition.Altitude); - value.VehiclePosition.State = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.State}]车辆状态", value.VehiclePosition.State); - value.VehiclePosition.Alarm = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Alarm}]报警状态", value.VehiclePosition.Alarm); + VehiclePositionPropertieBase.Analyze(ref reader, writer, config); writer.WriteEndObject(); value.LensID = reader.ReadByte(); writer.WriteNumber($"[{value.LensID}]镜头ID", value.LensID); @@ -113,22 +78,7 @@ namespace JT809.Protocol.SubMessageBody { JT809_0x1500_0x1502 value = new JT809_0x1500_0x1502(); value.PhotoRspFlag = (JT809_0x1502_PhotoRspFlag)reader.ReadByte(); - value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - value.VehiclePosition.Day = reader.ReadByte(); - value.VehiclePosition.Month = reader.ReadByte(); - value.VehiclePosition.Year = reader.ReadUInt16(); - value.VehiclePosition.Hour = reader.ReadByte(); - value.VehiclePosition.Minute = reader.ReadByte(); - value.VehiclePosition.Second = reader.ReadByte(); - value.VehiclePosition.Lon = reader.ReadUInt32(); - value.VehiclePosition.Lat = reader.ReadUInt32(); - value.VehiclePosition.Vec1 = reader.ReadUInt16(); - value.VehiclePosition.Vec2 = reader.ReadUInt16(); - value.VehiclePosition.Vec3 = reader.ReadUInt32(); - value.VehiclePosition.Direction = reader.ReadUInt16(); - value.VehiclePosition.Altitude = reader.ReadUInt16(); - value.VehiclePosition.State = reader.ReadUInt32(); - value.VehiclePosition.Alarm = reader.ReadUInt32(); + value.VehiclePosition = VehiclePositionPropertieBase.Deserialize(ref reader, config); value.LensID = reader.ReadByte(); value.PhotoLen = reader.ReadUInt32(); value.SizeType = (JT809__0x9502_SizeType)reader.ReadByte(); @@ -143,22 +93,7 @@ namespace JT809.Protocol.SubMessageBody public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1500_0x1502 value, IJT809Config config) { writer.WriteByte((byte)value.PhotoRspFlag); - writer.WriteByte((byte)value.VehiclePosition.Encrypt); - writer.WriteByte(value.VehiclePosition.Day); - writer.WriteByte(value.VehiclePosition.Month); - writer.WriteUInt16(value.VehiclePosition.Year); - writer.WriteByte(value.VehiclePosition.Hour); - writer.WriteByte(value.VehiclePosition.Minute); - writer.WriteByte(value.VehiclePosition.Second); - writer.WriteUInt32(value.VehiclePosition.Lon); - writer.WriteUInt32(value.VehiclePosition.Lat); - writer.WriteUInt16(value.VehiclePosition.Vec1); - writer.WriteUInt16(value.VehiclePosition.Vec2); - writer.WriteUInt32(value.VehiclePosition.Vec3); - writer.WriteUInt16(value.VehiclePosition.Direction); - writer.WriteUInt16(value.VehiclePosition.Altitude); - writer.WriteUInt32(value.VehiclePosition.State); - writer.WriteUInt32(value.VehiclePosition.Alarm); + VehiclePositionPropertieBase.Serialize(ref writer, value.VehiclePosition, 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 682667b..05cd9f3 100644 --- a/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs +++ b/src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs @@ -20,7 +20,7 @@ namespace JT809.Protocol.SubMessageBody /// 4.应急状态监控车辆时,上级平台向车辆归属下级平台通过该消息不间断地发送车辆定位信息,实现车辆定位信息回传 /// /// - public class JT809_0x9200_0x9202:JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version + public class JT809_0x9200_0x9202 : JT809SubBodies, IJT809MessagePackFormatter, IJT809Analyze, IJT809_2019_Version { public override ushort SubMsgId => JT809SubBusinessType.交换车辆定位信息消息.ToUInt16Value(); @@ -28,152 +28,26 @@ namespace JT809.Protocol.SubMessageBody /// /// 车辆定位信息 /// - public JT809VehiclePositionProperties VehiclePosition { get; set; } - - public JT809VehiclePositionProperties_2019 GNSSData { get; set; } + public VehiclePositionPropertieBase VehiclePosition { get; set; } public void Analyze(ref JT809MessagePackReader reader, Utf8JsonWriter writer, IJT809Config config) { JT809_0x9200_0x9202 value = new JT809_0x9200_0x9202(); - if (config.Version == JT809Version.JTT2011) - { - value.VehiclePosition = new JT809VehiclePositionProperties(); - writer.WriteStartObject("车辆定位信息"); - value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - writer.WriteString($"[{value.VehiclePosition.Encrypt.ToByteValue()}]是否使用国家测绘局批准的地图保密插件进行加密", value.VehiclePosition.Encrypt.ToString()); - value.VehiclePosition.Day = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Day.ReadNumber()}]日", value.VehiclePosition.Day); - value.VehiclePosition.Month = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Month.ReadNumber()}]月", value.VehiclePosition.Month); - value.VehiclePosition.Year = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Year.ReadNumber()}]年", value.VehiclePosition.Year); - value.VehiclePosition.Hour = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Hour.ReadNumber()}]时", value.VehiclePosition.Hour); - value.VehiclePosition.Minute = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Minute.ReadNumber()}]分", value.VehiclePosition.Minute); - value.VehiclePosition.Second = reader.ReadByte(); - writer.WriteNumber($"[{value.VehiclePosition.Second.ReadNumber()}]秒", value.VehiclePosition.Second); - value.VehiclePosition.Lon = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Lon.ReadNumber()}]经度", value.VehiclePosition.Lon); - value.VehiclePosition.Lat = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Lat.ReadNumber()}]纬度", value.VehiclePosition.Lat); - value.VehiclePosition.Vec1 = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Vec1.ReadNumber()}]速度", value.VehiclePosition.Vec1); - value.VehiclePosition.Vec2 = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Vec2.ReadNumber()}]行驶记录速度", value.VehiclePosition.Vec2); - value.VehiclePosition.Vec3 = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Vec3.ReadNumber()}]车辆当前总里程数", value.VehiclePosition.Vec3); - value.VehiclePosition.Direction = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Direction.ReadNumber()}]方向", value.VehiclePosition.Direction); - value.VehiclePosition.Altitude = reader.ReadUInt16(); - writer.WriteNumber($"[{value.VehiclePosition.Altitude.ReadNumber()}]海拔高度", value.VehiclePosition.Altitude); - value.VehiclePosition.State = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.State.ReadNumber()}]车辆状态", value.VehiclePosition.State); - value.VehiclePosition.Alarm = reader.ReadUInt32(); - writer.WriteNumber($"[{value.VehiclePosition.Alarm.ReadNumber()}]报警状态", value.VehiclePosition.Alarm); - writer.WriteEndObject(); - } - else - { - value.GNSSData = new JT809VehiclePositionProperties_2019(); - writer.WriteStartObject("车辆定位信息"); - value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - writer.WriteString($"[{value.GNSSData.Encrypt.ToByteValue()}]是否使用国测局批准的地图保密插件进行加密", value.GNSSData.Encrypt.ToString()); - value.GNSSData.DataLength = reader.ReadUInt32(); - writer.WriteNumber($"[{value.GNSSData.DataLength.ReadNumber()}]车辆定位信息数据长度", value.GNSSData.DataLength); - value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray(); - writer.WriteString($"[{value.GNSSData.GnssData.ToHexString()}]车辆定位信息内容",value.GNSSData.GnssData.ToHexString()); - var virtualHex = reader.ReadVirtualArray(11); - value.GNSSData.PlatformId1 = reader.ReadBigNumber(11); - writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]监控平台唯一编码", value.GNSSData.PlatformId1); - value.GNSSData.Alarm1 = reader.ReadUInt32(); - writer.WriteNumber($"[{value.GNSSData.Alarm1.ReadNumber()}]报警状态", value.GNSSData.Alarm1); - virtualHex = reader.ReadVirtualArray(11); - value.GNSSData.PlatformId2 = reader.ReadBigNumber(11); - writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]市级监控平台唯一编码", value.GNSSData.PlatformId2); - value.GNSSData.Alarm2 = reader.ReadUInt32(); - writer.WriteNumber($"[{value.GNSSData.Alarm2.ReadNumber()}]报警状态", value.GNSSData.Alarm2); - virtualHex = reader.ReadVirtualArray(11); - value.GNSSData.PlatformId3 = reader.ReadBigNumber(11); - writer.WriteString($"[{virtualHex.ToArray().ToHexString()}]省级监控平台唯一编码", value.GNSSData.PlatformId3); - value.GNSSData.Alarm3 = reader.ReadUInt32(); - writer.WriteNumber($"[{value.GNSSData.Alarm3.ReadNumber()}]报警状态", value.GNSSData.Alarm3); - writer.WriteEndObject(); - } + writer.WriteStartObject("车辆定位信息"); + VehiclePositionPropertieBase.Analyze(ref reader, writer, config); + writer.WriteEndObject(); } public JT809_0x9200_0x9202 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) { JT809_0x9200_0x9202 value = new JT809_0x9200_0x9202(); - if (config.Version == JT809Version.JTT2011) - { - value.VehiclePosition = new JT809VehiclePositionProperties(); - value.VehiclePosition.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - value.VehiclePosition.Day = reader.ReadByte(); - value.VehiclePosition.Month = reader.ReadByte(); - value.VehiclePosition.Year = reader.ReadUInt16(); - value.VehiclePosition.Hour = reader.ReadByte(); - value.VehiclePosition.Minute = reader.ReadByte(); - value.VehiclePosition.Second = reader.ReadByte(); - value.VehiclePosition.Lon = reader.ReadUInt32(); - value.VehiclePosition.Lat = reader.ReadUInt32(); - value.VehiclePosition.Vec1 = reader.ReadUInt16(); - value.VehiclePosition.Vec2 = reader.ReadUInt16(); - value.VehiclePosition.Vec3 = reader.ReadUInt32(); - value.VehiclePosition.Direction = reader.ReadUInt16(); - value.VehiclePosition.Altitude = reader.ReadUInt16(); - value.VehiclePosition.State = reader.ReadUInt32(); - value.VehiclePosition.Alarm = reader.ReadUInt32(); - } - else - { - value.GNSSData = new JT809VehiclePositionProperties_2019(); - value.GNSSData.Encrypt = (JT809_VehiclePositionEncrypt)reader.ReadByte(); - value.GNSSData.DataLength = reader.ReadUInt32(); - value.GNSSData.GnssData = reader.ReadArray((int)value.GNSSData.DataLength).ToArray(); - value.GNSSData.PlatformId1 = reader.ReadBigNumber(11); - value.GNSSData.Alarm1 = reader.ReadUInt32(); - value.GNSSData.PlatformId2 = reader.ReadBigNumber(11); - value.GNSSData.Alarm2 = reader.ReadUInt32(); - value.GNSSData.PlatformId3 = reader.ReadBigNumber(11); - value.GNSSData.Alarm3 = reader.ReadUInt32(); - } + value.VehiclePosition = VehiclePositionPropertieBase.Deserialize(ref reader, config); return value; } public void Serialize(ref JT809MessagePackWriter writer, JT809_0x9200_0x9202 value, IJT809Config config) { - if (config.Version == JT809Version.JTT2011) - { - writer.WriteByte((byte)value.VehiclePosition.Encrypt); - writer.WriteByte(value.VehiclePosition.Day); - writer.WriteByte(value.VehiclePosition.Month); - writer.WriteUInt16(value.VehiclePosition.Year); - writer.WriteByte(value.VehiclePosition.Hour); - writer.WriteByte(value.VehiclePosition.Minute); - writer.WriteByte(value.VehiclePosition.Second); - writer.WriteUInt32(value.VehiclePosition.Lon); - writer.WriteUInt32(value.VehiclePosition.Lat); - writer.WriteUInt16(value.VehiclePosition.Vec1); - writer.WriteUInt16(value.VehiclePosition.Vec2); - writer.WriteUInt32(value.VehiclePosition.Vec3); - writer.WriteUInt16(value.VehiclePosition.Direction); - writer.WriteUInt16(value.VehiclePosition.Altitude); - writer.WriteUInt32(value.VehiclePosition.State); - writer.WriteUInt32(value.VehiclePosition.Alarm); - } - else { - writer.WriteByte((byte)value.GNSSData.Encrypt); - writer.Skip(4, out int position); - writer.WriteArray(value.GNSSData.GnssData); - writer.WriteBigNumber(value.GNSSData.PlatformId1,11); - writer.WriteUInt32(value.GNSSData.Alarm1); - writer.WriteBigNumber(value.GNSSData.PlatformId2,11); - writer.WriteUInt32(value.GNSSData.Alarm2); - writer.WriteBigNumber(value.GNSSData.PlatformId3,11); - writer.WriteUInt32(value.GNSSData.Alarm3); - writer.WriteUInt32Return((uint)(writer.GetCurrentPosition() - position-4), position); - } + VehiclePositionPropertieBase.Serialize(ref writer, value.VehiclePosition, config); } } }