@@ -15,15 +15,17 @@ namespace JT809.Protocol.Formatters | |||||
public JT809Header Deserialize(ref JT809MessagePackReader reader, IJT809Config config) | public JT809Header Deserialize(ref JT809MessagePackReader reader, IJT809Config config) | ||||
{ | { | ||||
JT809Header jT809Header = new JT809Header(); | |||||
jT809Header.MsgLength = reader.ReadUInt32(); | |||||
jT809Header.MsgSN = reader.ReadUInt32(); | |||||
jT809Header.BusinessType = reader.ReadUInt16(); | |||||
jT809Header.MsgGNSSCENTERID = reader.ReadUInt32(); | |||||
jT809Header.Version = new JT809Header_Version(reader.ReadArray(JT809Header_Version.FixedByteLength)); | |||||
jT809Header.EncryptFlag = (JT809Header_Encrypt)reader.ReadByte(); | |||||
jT809Header.EncryptKey = reader.ReadUInt32(); | |||||
jT809Header.Time = reader.ReadUTCDateTime(); | |||||
JT809Header jT809Header = new JT809Header | |||||
{ | |||||
MsgLength = reader.ReadUInt32(), | |||||
MsgSN = reader.ReadUInt32(), | |||||
BusinessType = reader.ReadUInt16(), | |||||
MsgGNSSCENTERID = reader.ReadUInt32(), | |||||
Version = new JT809Header_Version(reader.ReadArray(JT809Header_Version.FixedByteLength)), | |||||
EncryptFlag = (JT809Header_Encrypt)reader.ReadByte(), | |||||
EncryptKey = reader.ReadUInt32(), | |||||
Time = reader.ReadUTCDateTime() | |||||
}; | |||||
return jT809Header; | return jT809Header; | ||||
} | } | ||||
@@ -19,12 +19,14 @@ namespace JT809.Protocol.Formatters | |||||
// 1.2. 验证校验码 | // 1.2. 验证校验码 | ||||
if (!reader.CheckXorCodeVali) | if (!reader.CheckXorCodeVali) | ||||
{ | { | ||||
throw new JT809Exception(JT809ErrorCode.CRC16CheckInvalid, $"{reader.CalculateCheckXorCode.ToString()}!={reader.RealCheckXorCode.ToString()}"); | |||||
throw new JT809Exception(JT809ErrorCode.CRC16CheckInvalid, $"{reader.CalculateCheckXorCode}!={reader.RealCheckXorCode}"); | |||||
} | } | ||||
} | } | ||||
JT809HeaderPackage jT809Package = new JT809HeaderPackage(); | |||||
// 2.读取起始头 | |||||
jT809Package.BeginFlag = reader.ReadStart(); | |||||
JT809HeaderPackage jT809Package = new JT809HeaderPackage | |||||
{ | |||||
// 2.读取起始头 | |||||
BeginFlag = reader.ReadStart() | |||||
}; | |||||
// 3.初始化消息头 | // 3.初始化消息头 | ||||
try | try | ||||
{ | { | ||||
@@ -32,7 +34,7 @@ namespace JT809.Protocol.Formatters | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); | |||||
throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength()}", ex); | |||||
} | } | ||||
// 5.数据体处理 | // 5.数据体处理 | ||||
// 5.1 判断是否有数据体(总长度-固定长度)> 0 | // 5.1 判断是否有数据体(总长度-固定长度)> 0 | ||||
@@ -56,7 +58,7 @@ namespace JT809.Protocol.Formatters | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); | |||||
throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength()}", ex); | |||||
} | } | ||||
} | } | ||||
jT809Package.CRCCode = reader.CalculateCheckXorCode; | jT809Package.CRCCode = reader.CalculateCheckXorCode; | ||||
@@ -23,12 +23,14 @@ namespace JT809.Protocol.Formatters | |||||
// 1.2. 验证校验码 | // 1.2. 验证校验码 | ||||
if (!reader.CheckXorCodeVali) | if (!reader.CheckXorCodeVali) | ||||
{ | { | ||||
throw new JT809Exception(JT809ErrorCode.CRC16CheckInvalid, $"{reader.CalculateCheckXorCode.ToString()}!={reader.RealCheckXorCode.ToString()}"); | |||||
throw new JT809Exception(JT809ErrorCode.CRC16CheckInvalid, $"{reader.CalculateCheckXorCode}!={reader.RealCheckXorCode}"); | |||||
} | } | ||||
} | } | ||||
JT809Package jT809Package = new JT809Package(); | |||||
// 2.读取起始头 | |||||
jT809Package.BeginFlag = reader.ReadStart(); | |||||
JT809Package jT809Package = new JT809Package | |||||
{ | |||||
// 2.读取起始头 | |||||
BeginFlag = reader.ReadStart() | |||||
}; | |||||
// 3.初始化消息头 | // 3.初始化消息头 | ||||
try | try | ||||
{ | { | ||||
@@ -36,7 +38,7 @@ namespace JT809.Protocol.Formatters | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); | |||||
throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength()}", ex); | |||||
} | } | ||||
// 5.数据体处理 | // 5.数据体处理 | ||||
// 5.1 判断是否有数据体(总长度-固定长度)> 0 | // 5.1 判断是否有数据体(总长度-固定长度)> 0 | ||||
@@ -69,7 +71,7 @@ namespace JT809.Protocol.Formatters | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex); | |||||
throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength()}", ex); | |||||
} | } | ||||
} | } | ||||
jT809Package.CRCCode = reader.CalculateCheckXorCode; | jT809Package.CRCCode = reader.CalculateCheckXorCode; | ||||
@@ -98,6 +100,8 @@ namespace JT809.Protocol.Formatters | |||||
writer.WriteByte((byte)value.Header.EncryptFlag); | writer.WriteByte((byte)value.Header.EncryptFlag); | ||||
// 2.7.数据加密密钥 | // 2.7.数据加密密钥 | ||||
writer.WriteUInt32(value.Header.EncryptKey); | writer.WriteUInt32(value.Header.EncryptKey); | ||||
// 2.8 发送消息时系统UTC时间 | |||||
writer.WriteUTCDateTime(value.Header.Time); | |||||
// 3.写入数据体 | // 3.写入数据体 | ||||
// 3.1.记录当前开始位置 | // 3.1.记录当前开始位置 | ||||
int startIndex = writer.GetCurrentPosition(); | int startIndex = writer.GetCurrentPosition(); | ||||
@@ -15,12 +15,14 @@ namespace JT809.Protocol.Formatters.MessageBodyFormatters | |||||
public JT809_0x1001 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) | public JT809_0x1001 Deserialize(ref JT809MessagePackReader reader, IJT809Config config) | ||||
{ | { | ||||
JT809_0x1001 jT809_0X1001 = new JT809_0x1001(); | |||||
jT809_0X1001.UserId = reader.ReadUInt32(); | |||||
jT809_0X1001.Password = reader.ReadString(8); | |||||
jT809_0X1001.MsgGNSSCENTERID = reader.ReadUInt32(); | |||||
jT809_0X1001.DownLinkIP = reader.ReadString(32); | |||||
jT809_0X1001.DownLinkPort = reader.ReadUInt16(); | |||||
JT809_0x1001 jT809_0X1001 = new JT809_0x1001 | |||||
{ | |||||
UserId = reader.ReadUInt32(), | |||||
Password = reader.ReadString(8), | |||||
MsgGNSSCENTERID = reader.ReadUInt32(), | |||||
DownLinkIP = reader.ReadString(32), | |||||
DownLinkPort = reader.ReadUInt16() | |||||
}; | |||||
return jT809_0X1001; | return jT809_0X1001; | ||||
} | } | ||||
@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT809</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT809</PackageProjectUrl> | ||||
<license>https://github.com/SmallChi/JT809/blob/master/LICENSE</license> | <license>https://github.com/SmallChi/JT809/blob/master/LICENSE</license> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>2.1.4</Version> | |||||
<Version>2.1.5</Version> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | <PackageLicenseFile>LICENSE</PackageLicenseFile> | ||||
</PropertyGroup> | </PropertyGroup> | ||||
@@ -12,14 +12,14 @@ namespace JT809.Protocol | |||||
{ | { | ||||
/// <summary> | /// <summary> | ||||
/// 固定为22个字节长度 | /// 固定为22个字节长度 | ||||
/// <para>MSG LENGTH + MSG_SN + MSG_ID + MSG_GNSSCENTERID + VERSION_FLAG + ENCRYPT_FLAG + ENCRYPT_KEY</para> | |||||
/// <para>4 + 4 + 2 + 4 + 3 + 1 + 4 = 22</para> | |||||
/// <para>MSG LENGTH + MSG_SN + MSG_ID + MSG_GNSSCENTERID + VERSION_FLAG + ENCRYPT_FLAG + ENCRYPT_KEY + TIME</para> | |||||
/// <para>4 + 4 + 2 + 4 + 3 + 1 + 4 + 8 = 30</para> | |||||
/// </summary> | /// </summary> | ||||
public const int FixedByteLength = 22; | |||||
public const int FixedByteLength = 30; | |||||
/// <summary> | /// <summary> | ||||
/// 数据长度(包括头标识、数据头、数据体和尾标识) | /// 数据长度(包括头标识、数据头、数据体和尾标识) | ||||
/// <para>头标识 + 数据头 + 数据体 + 尾标识</para> | /// <para>头标识 + 数据头 + 数据体 + 尾标识</para> | ||||
/// <para>1 + 22 + n + 1</para> | |||||
/// <para>1 + 30 + n + 1</para> | |||||
/// </summary> | /// </summary> | ||||
public uint MsgLength { get; set; } | public uint MsgLength { get; set; } | ||||
/// <summary> | /// <summary> | ||||