Переглянути джерело

重构车辆信息并修复0x1502

tags/v2.2.1
yedajiang44 3 роки тому
джерело
коміт
e7848ed5b3
7 змінених файлів з 500 додано та 566 видалено
  1. +94
    -104
      src/JT809.Protocol/JT809.Protocol.xml
  2. +77
    -77
      src/JT809.Protocol/Metadata/JT809VehiclePositionProperties.cs
  3. +52
    -52
      src/JT809.Protocol/Metadata/JT809VehiclePositionProperties_2019.cs
  4. +260
    -0
      src/JT809.Protocol/Metadata/VehiclePositionPropertieBase.cs
  5. +5
    -130
      src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs
  6. +5
    -70
      src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs
  7. +7
    -133
      src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs

+ 94
- 104
src/JT809.Protocol/JT809.Protocol.xml Переглянути файл

@@ -1896,237 +1896,227 @@
系统UTC时间
</summary>
</member>
<member name="T:JT809.Protocol.Metadata.JT809VehiclePositionProperties">
<summary>
车辆定位
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Encrypt">
<summary>
该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Day">
<member name="T:JT809.Protocol.Metadata.JT809VehicleStaticInfo">
<summary>
车辆静态信息数据体
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Month">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.Vin">
<summary>
车牌号 必填
车牌号码中不设分隔符号。所有字母数字连续保存
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Year">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.VehicleColor">
<summary>
车牌颜色 必填 应该使用枚举
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Hour">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.VehicleType">
<summary>
车辆类型 必填 应该使用枚举
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Minute">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.TransType">
<summary>
运输行业编码 必填 应该使用枚举
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Second">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.VehicleNationnality">
<summary>
车籍地 必填
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Lon">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.OwersId">
<summary>
经度,单位为 1*10^-6 度。
业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Lat">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.OwersName">
<summary>
纬度,单位为 1*10^-6 度。
业户名称 必填 运输企业名称
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Vec1">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.OwersTel">
<summary>
速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。
业户联系电话 非必填 运输企业名称
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Vec2">
<member name="T:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019">
<summary>
行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。
车辆静态信息数据体
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Vec3">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.Vin">
<summary>
车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km)
车牌号 必填
车牌号码中不设分隔符号。所有字母数字连续保存
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Direction">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.VehicleColor">
<summary>
方向,0-359,单位为度(。),正北为 0,顺时针。
车牌颜色 必填 应该使用枚举
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Altitude">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.VehicleType">
<summary>
海拔高度,单位为米(m)。
车辆类型 必填 应该使用枚举
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.State">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.TransType">
<summary>
车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定
运输行业编码 必填 应该使用枚举
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties.Alarm">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.VehicleNationnality">
<summary>
报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定
车籍地 必填
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties_2019.Encrypt">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.BusinessCopeCode">
<summary>
是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密
经营范围代码 必填 应该使用枚举
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties_2019.DataLength">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.OwersId">
<summary>
车辆定位信息数据长度
业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties_2019.GnssData">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.OwersName">
<summary>
车辆定位信息内容,包括车辆位置基本信息和位置附加信息
其数据格式安装 808-2019中8.12要求
业户名称 必填 运输企业名称
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties_2019.PlatformId1">
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.OwersTel">
<summary>
监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 11位
业户联系电话 非必填 运输企业名称
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties_2019.Alarm1">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Encrypt">
<summary>
报警状态,二进制标识 0 正常 1表示报警
具体定义按照808-2019中表18的规定
该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties_2019.PlatformId2">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Day">
<summary>
市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
未填写时,全填0,无市级平台应由省级平台全填1 11位
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties_2019.Alarm2">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Month">
<summary>
报警状态,二进制标识 0 正常 1表示报警
具体定义按照808-2019中表18的规定
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties_2019.PlatformId3">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Year">
<summary>
省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
未填写时,全填0 11位
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehiclePositionProperties_2019.Alarm3">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Hour">
<summary>
报警状态,二进制标识 0 正常 1表示报警
具体定义按照808-2019中表18的规定
</summary>
</member>
<member name="T:JT809.Protocol.Metadata.JT809VehicleStaticInfo">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Minute">
<summary>
车辆静态信息数据体
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.Vin">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Second">
<summary>
车牌号 必填
车牌号码中不设分隔符号。所有字母数字连续保存
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.VehicleColor">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Lon">
<summary>
车牌颜色 必填 应该使用枚举
经度,单位为 1*10^-6 度。
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.VehicleType">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Lat">
<summary>
车辆类型 必填 应该使用枚举
纬度,单位为 1*10^-6 度。
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.TransType">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Vec1">
<summary>
运输行业编码 必填 应该使用枚举
速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.VehicleNationnality">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Vec2">
<summary>
车籍地 必填
行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.OwersId">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Vec3">
<summary>
业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号
车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km)
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.OwersName">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Direction">
<summary>
业户名称 必填 运输企业名称
方向,0-359,单位为度(。),正北为 0,顺时针。
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo.OwersTel">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Altitude">
<summary>
业户联系电话 非必填 运输企业名称
海拔高度,单位为米(m)。
</summary>
</member>
<member name="T:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.State">
<summary>
车辆静态信息数据体
车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.Vin">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2011.Alarm">
<summary>
车牌号 必填
车牌号码中不设分隔符号。所有字母数字连续保存
报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.VehicleColor">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2019.Encrypt">
<summary>
车牌颜色 必填 应该使用枚举
是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.VehicleType">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2019.GnssData">
<summary>
车辆类型 必填 应该使用枚举
车辆定位信息内容,包括车辆位置基本信息和位置附加信息
其数据格式安装 808-2019中8.12要求
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.TransType">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2019.PlatformId1">
<summary>
运输行业编码 必填 应该使用枚举
监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 11位
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.VehicleNationnality">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2019.Alarm1">
<summary>
车籍地 必填
报警状态,二进制标识 0 正常 1表示报警
具体定义按照808-2019中表18的规定
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.BusinessCopeCode">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2019.PlatformId2">
<summary>
经营范围代码 必填 应该使用枚举
市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
未填写时,全填0,无市级平台应由省级平台全填1 11位
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.OwersId">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2019.Alarm2">
<summary>
业户ID 非必填 该业户ID为下级平台存储业户信息所采用的ID编号
报警状态,二进制标识 0 正常 1表示报警
具体定义按照808-2019中表18的规定
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.OwersName">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2019.PlatformId3">
<summary>
业户名称 必填 运输企业名称
省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
未填写时,全填0 11位
</summary>
</member>
<member name="P:JT809.Protocol.Metadata.JT809VehicleStaticInfo_2019.OwersTel">
<member name="P:JT809.Protocol.Metadata.VehiclePositionPropertieOf2019.Alarm3">
<summary>
业户联系电话 非必填 运输企业名称
报警状态,二进制标识 0 正常 1表示报警
具体定义按照808-2019中表18的规定
</summary>
</member>
<member name="T:JT809.Protocol.SubMessageBody.JT809_0x1200_0x1201">


+ 77
- 77
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
{
/// <summary>
/// 车辆定位
/// </summary>
public class JT809VehiclePositionProperties
{
/// <summary>
/// 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。
/// </summary>
public JT809_VehiclePositionEncrypt Encrypt { get; set; }
/// <summary>
/// 日
/// </summary>
public byte Day { get; set; }
/// <summary>
/// 月
/// </summary>
public byte Month { get; set; }
/// <summary>
/// 年
/// </summary>
public ushort Year { get; set; }
/// <summary>
/// 时
/// </summary>
public byte Hour { get; set; }
/// <summary>
/// 分
/// </summary>
public byte Minute { get; set; }
/// <summary>
/// 秒
/// </summary>
public byte Second { get; set; }
/// <summary>
/// 经度,单位为 1*10^-6 度。
/// </summary>
public uint Lon { get; set; }
/// <summary>
/// 纬度,单位为 1*10^-6 度。
/// </summary>
public uint Lat { get; set; }
/// <summary>
/// 速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。
/// </summary>
public ushort Vec1 { get; set; }
/// <summary>
/// 行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。
/// </summary>
public ushort Vec2 { get; set; }
/// <summary>
/// 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km)
/// </summary>
public uint Vec3 { get; set; }
/// <summary>
/// 方向,0-359,单位为度(。),正北为 0,顺时针。
/// </summary>
public ushort Direction { get; set; }
/// <summary>
/// 海拔高度,单位为米(m)。
/// </summary>
public ushort Altitude { get; set; }
/// <summary>
/// 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定
/// </summary>
public uint State { get; set; }
/// <summary>
/// 报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定
/// </summary>
public uint Alarm { get; set; }
}
}
// namespace JT809.Protocol.Metadata
// {
// /// <summary>
// /// 车辆定位
// /// </summary>
// public class JT809VehiclePositionProperties
// {
// /// <summary>
// /// 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。
// /// </summary>
// public JT809_VehiclePositionEncrypt Encrypt { get; set; }
// /// <summary>
// /// 日
// /// </summary>
// public byte Day { get; set; }
// /// <summary>
// /// 月
// /// </summary>
// public byte Month { get; set; }
// /// <summary>
// /// 年
// /// </summary>
// public ushort Year { get; set; }
// /// <summary>
// /// 时
// /// </summary>
// public byte Hour { get; set; }
// /// <summary>
// /// 分
// /// </summary>
// public byte Minute { get; set; }
// /// <summary>
// /// 秒
// /// </summary>
// public byte Second { get; set; }
// /// <summary>
// /// 经度,单位为 1*10^-6 度。
// /// </summary>
// public uint Lon { get; set; }
// /// <summary>
// /// 纬度,单位为 1*10^-6 度。
// /// </summary>
// public uint Lat { get; set; }
// /// <summary>
// /// 速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。
// /// </summary>
// public ushort Vec1 { get; set; }
// /// <summary>
// /// 行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。
// /// </summary>
// public ushort Vec2 { get; set; }
// /// <summary>
// /// 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km)
// /// </summary>
// public uint Vec3 { get; set; }
// /// <summary>
// /// 方向,0-359,单位为度(。),正北为 0,顺时针。
// /// </summary>
// public ushort Direction { get; set; }
// /// <summary>
// /// 海拔高度,单位为米(m)。
// /// </summary>
// public ushort Altitude { get; set; }
// /// <summary>
// /// 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定
// /// </summary>
// public uint State { get; set; }
// /// <summary>
// /// 报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定
// /// </summary>
// public uint Alarm { get; set; }
// }
// }

+ 52
- 52
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
{
/// <summary>
/// 是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密
/// </summary>
public JT809_VehiclePositionEncrypt Encrypt { get; set; }
/// <summary>
/// 车辆定位信息数据长度
/// </summary>
public uint DataLength { get; set; }
/// <summary>
/// 车辆定位信息内容,包括车辆位置基本信息和位置附加信息
/// 其数据格式安装 808-2019中8.12要求
/// </summary>
public byte[] GnssData { get; set; }
/// <summary>
/// 监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 11位
/// </summary>
public string PlatformId1 { get; set; }
/// <summary>
/// 报警状态,二进制标识 0 正常 1表示报警
/// 具体定义按照808-2019中表18的规定
/// </summary>
public uint Alarm1 { get; set; }
/// <summary>
/// 市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
/// 未填写时,全填0,无市级平台应由省级平台全填1 11位
/// </summary>
public string PlatformId2 { get; set; }
/// <summary>
/// 报警状态,二进制标识 0 正常 1表示报警
/// 具体定义按照808-2019中表18的规定
/// </summary>
public uint Alarm2 { get; set; }
/// <summary>
/// 省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
/// 未填写时,全填0 11位
/// </summary>
public string PlatformId3 { get; set; }
/// <summary>
/// 报警状态,二进制标识 0 正常 1表示报警
/// 具体定义按照808-2019中表18的规定
/// </summary>
public uint Alarm3 { get; set; }
}
}
// namespace JT809.Protocol.Metadata
// {
// public class JT809VehiclePositionProperties_2019
// {
// /// <summary>
// /// 是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密
// /// </summary>
// public JT809_VehiclePositionEncrypt Encrypt { get; set; }
// /// <summary>
// /// 车辆定位信息数据长度
// /// </summary>
// public uint DataLength { get; set; }
// /// <summary>
// /// 车辆定位信息内容,包括车辆位置基本信息和位置附加信息
// /// 其数据格式安装 808-2019中8.12要求
// /// </summary>
// public byte[] GnssData { get; set; }
// /// <summary>
// /// 监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 11位
// /// </summary>
// public string PlatformId1 { get; set; }
// /// <summary>
// /// 报警状态,二进制标识 0 正常 1表示报警
// /// 具体定义按照808-2019中表18的规定
// /// </summary>
// public uint Alarm1 { get; set; }
// /// <summary>
// /// 市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
// /// 未填写时,全填0,无市级平台应由省级平台全填1 11位
// /// </summary>
// public string PlatformId2 { get; set; }
// /// <summary>
// /// 报警状态,二进制标识 0 正常 1表示报警
// /// 具体定义按照808-2019中表18的规定
// /// </summary>
// public uint Alarm2 { get; set; }
// /// <summary>
// /// 省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
// /// 未填写时,全填0 11位
// /// </summary>
// public string PlatformId3 { get; set; }
// /// <summary>
// /// 报警状态,二进制标识 0 正常 1表示报警
// /// 具体定义按照808-2019中表18的规定
// /// </summary>
// public uint Alarm3 { get; set; }
// }
// }

+ 260
- 0
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
{
/// <summary>
/// 该字段标识传输的定位信息是否使用国家测绘局批准的地图保密插件进行加密。
/// </summary>
public JT809_VehiclePositionEncrypt Encrypt { get; set; }
/// <summary>
/// 日
/// </summary>
public byte Day { get; set; }
/// <summary>
/// 月
/// </summary>
public byte Month { get; set; }
/// <summary>
/// 年
/// </summary>
public ushort Year { get; set; }
/// <summary>
/// 时
/// </summary>
public byte Hour { get; set; }
/// <summary>
/// 分
/// </summary>
public byte Minute { get; set; }
/// <summary>
/// 秒
/// </summary>
public byte Second { get; set; }
/// <summary>
/// 经度,单位为 1*10^-6 度。
/// </summary>
public uint Lon { get; set; }
/// <summary>
/// 纬度,单位为 1*10^-6 度。
/// </summary>
public uint Lat { get; set; }
/// <summary>
/// 速度,指卫星定位车载终端设备上传的行车速度信息,为必填项。单位为千米每小时(km/h)。
/// </summary>
public ushort Vec1 { get; set; }
/// <summary>
/// 行驶记录速度,指车辆行驶记录设备上传的行车速度 信息,为必填项。单位为千米每小时(km/h)。
/// </summary>
public ushort Vec2 { get; set; }
/// <summary>
/// 车辆当前总里程数,值车辆上传的行车里程数。单位单位为千米(km)
/// </summary>
public uint Vec3 { get; set; }
/// <summary>
/// 方向,0-359,单位为度(。),正北为 0,顺时针。
/// </summary>
public ushort Direction { get; set; }
/// <summary>
/// 海拔高度,单位为米(m)。
/// </summary>
public ushort Altitude { get; set; }
/// <summary>
/// 车辆状态,二进制表示,B31B30B29。。。。。。B2B1B0.具体定义按照 JT/T808-2011 中表 17 的规定
/// </summary>
public uint State { get; set; }
/// <summary>
/// 报警状态,二进制表示,0 标识正常,1 表示报警: B31B30B29 。。。。。。 B2B1B0.具 体 定 义 按 照JT/T808-2011 中表 18 的规定
/// </summary>
public uint Alarm { get; set; }
}
public class VehiclePositionPropertieOf2019 : VehiclePositionPropertieBase
{
/// <summary>
/// 是否使用国测局批准的地图保密插件进行加密 1 已加密 0未加密
/// </summary>
public JT809_VehiclePositionEncrypt Encrypt { get; set; }
/// <summary>
/// 车辆定位信息内容,包括车辆位置基本信息和位置附加信息
/// 其数据格式安装 808-2019中8.12要求
/// </summary>
public byte[] GnssData { get; set; }
/// <summary>
/// 监控平台唯一编码,由平台所在地行政区域代码和平台编码组成 11位
/// </summary>
public string PlatformId1 { get; set; }
/// <summary>
/// 报警状态,二进制标识 0 正常 1表示报警
/// 具体定义按照808-2019中表18的规定
/// </summary>
public uint Alarm1 { get; set; }
/// <summary>
/// 市级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
/// 未填写时,全填0,无市级平台应由省级平台全填1 11位
/// </summary>
public string PlatformId2 { get; set; }
/// <summary>
/// 报警状态,二进制标识 0 正常 1表示报警
/// 具体定义按照808-2019中表18的规定
/// </summary>
public uint Alarm2 { get; set; }
/// <summary>
/// 省级监控平台唯一编码,由平台所在地行政区域代码和平台编码组成
/// 未填写时,全填0 11位
/// </summary>
public string PlatformId3 { get; set; }
/// <summary>
/// 报警状态,二进制标识 0 正常 1表示报警
/// 具体定义按照808-2019中表18的规定
/// </summary>
public uint Alarm3 { get; set; }
}
}

+ 5
- 130
src/JT809.Protocol/SubMessageBody/JT809_0x1200_0x1202.cs Переглянути файл

@@ -14,7 +14,7 @@ namespace JT809.Protocol.SubMessageBody
/// <para>车辆的实时定位信息</para>
/// <para>无需应答</para>
/// </summary>
public class JT809_0x1200_0x1202:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1200_0x1202>, IJT809Analyze, IJT809_2019_Version
public class JT809_0x1200_0x1202 : JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1200_0x1202>, IJT809Analyze, IJT809_2019_Version
{
public override ushort SubMsgId => JT809SubBusinessType.实时上传车辆定位信息.ToUInt16Value();

@@ -22,151 +22,26 @@ namespace JT809.Protocol.SubMessageBody
/// <summary>
/// 车辆定位信息
/// </summary>
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);
}
}
}

+ 5
- 70
src/JT809.Protocol/SubMessageBody/JT809_0x1500_0x1502.cs Переглянути файл

@@ -16,15 +16,11 @@ namespace JT809.Protocol.SubMessageBody
/// <para>子业务类型标识:UP_ CTRL_ MSG _TAKE_ PHOTO_ ACK</para>
/// <para>描述:下级平台应答上级平台发送的车辆拍照请求消息,上传图片信息到上级平台</para>
/// </summary>
public class JT809_0x1500_0x1502:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1500_0x1502>, IJT809Analyze
public class JT809_0x1500_0x1502 : JT809SubBodies, IJT809MessagePackFormatter<JT809_0x1500_0x1502>, IJT809Analyze
{
public override ushort SubMsgId => JT809SubBusinessType.车辆拍照应答.ToUInt16Value();

public override string Description => "车辆拍照应答";
public JT809_0x1500_0x1502()
{
VehiclePosition = new JT809VehiclePositionProperties();
}
/// <summary>
/// 拍照应答标识
/// </summary>
@@ -33,7 +29,7 @@ namespace JT809.Protocol.SubMessageBody
/// <summary>
/// 车辆定位信息
/// </summary>
public JT809VehiclePositionProperties VehiclePosition { get; set; }
public VehiclePositionPropertieBase VehiclePosition { get; set; }
/// <summary>
/// 镜头ID
/// </summary>
@@ -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);


+ 7
- 133
src/JT809.Protocol/SubMessageBody/JT809_0x9200_0x9202.cs Переглянути файл

@@ -20,7 +20,7 @@ namespace JT809.Protocol.SubMessageBody
/// 4.应急状态监控车辆时,上级平台向车辆归属下级平台通过该消息不间断地发送车辆定位信息,实现车辆定位信息回传
/// </para>
/// </summary>
public class JT809_0x9200_0x9202:JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9202>, IJT809Analyze, IJT809_2019_Version
public class JT809_0x9200_0x9202 : JT809SubBodies, IJT809MessagePackFormatter<JT809_0x9200_0x9202>, IJT809Analyze, IJT809_2019_Version
{
public override ushort SubMsgId => JT809SubBusinessType.交换车辆定位信息消息.ToUInt16Value();

@@ -28,152 +28,26 @@ namespace JT809.Protocol.SubMessageBody
/// <summary>
/// 车辆定位信息
/// </summary>
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);
}
}
}

Завантаження…
Відмінити
Зберегти