1.修复驾驶员状态监测系统报警信息预设的附加信息长度 2.修复驾驶员状态监测系统报警信息(报警/事件类型)数据类型分析器 修复单元测试pull/4/head
@@ -57,7 +57,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test | |||||
VehicleState = 19 | VehicleState = 19 | ||||
}); | }); | ||||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | ||||
Assert.Equal("000000010000000200BA7F0E07E4F11C0028003C00001807151010106520000000010C060512010203041100070000000D0000000E191211183100001334343434343434191210183100030200", hex); | |||||
Assert.Equal("000000010000000200BA7F0E07E4F11C0028003C0000180715101010652F000000010C060512010203041100070000000D0000000E191211183100001334343434343434191210183100030200", hex); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
public void Deserialize() | public void Deserialize() | ||||
@@ -15,7 +15,7 @@ | |||||
<licenseUrl>https://github.com/SmallChi/JTActiveSafety/blob/master/LICENSE</licenseUrl> | <licenseUrl>https://github.com/SmallChi/JTActiveSafety/blob/master/LICENSE</licenseUrl> | ||||
<license>https://github.com/SmallChi/JTActiveSafety/blob/master/LICENSE</license> | <license>https://github.com/SmallChi/JTActiveSafety/blob/master/LICENSE</license> | ||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>1.0.5</Version> | |||||
<Version>1.0.6</Version> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | <PackageLicenseFile>LICENSE</PackageLicenseFile> | ||||
</PropertyGroup> | </PropertyGroup> | ||||
@@ -16,7 +16,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||||
public class JT808_0x0200_0x65 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x65>, IJT808Analyze | public class JT808_0x0200_0x65 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x65>, IJT808Analyze | ||||
{ | { | ||||
public override byte AttachInfoId { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0200_0x65; | public override byte AttachInfoId { get; set; } = JT808_JTActiveSafety_Constants.JT808_0X0200_0x65; | ||||
public override byte AttachInfoLength { get; set; } = 32; | |||||
public override byte AttachInfoLength { get; set; } = 47; | |||||
/// <summary> | /// <summary> | ||||
/// 报警ID | /// 报警ID | ||||
/// </summary> | /// </summary> | ||||
@@ -101,26 +101,22 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||||
switch (value.AlarmOrEventType) | switch (value.AlarmOrEventType) | ||||
{ | { | ||||
case 0x01: | case 0x01: | ||||
alarmOrEventTypeString = "前向碰撞报警"; | |||||
alarmOrEventTypeString = "疲劳驾驶报警"; | |||||
break; | break; | ||||
case 0x02: | case 0x02: | ||||
alarmOrEventTypeString = "车道偏离报警"; | |||||
alarmOrEventTypeString = "接打电话报警"; | |||||
break; | break; | ||||
case 0x03: | case 0x03: | ||||
alarmOrEventTypeString = "车距过近报警"; | |||||
alarmOrEventTypeString = "抽烟报警"; | |||||
break; | break; | ||||
case 0x04: | case 0x04: | ||||
alarmOrEventTypeString = "行人碰撞报警"; | |||||
alarmOrEventTypeString = "分神驾驶报警"; | |||||
break; | break; | ||||
case 0x05: | case 0x05: | ||||
alarmOrEventTypeString = "频繁变道报警"; | |||||
alarmOrEventTypeString = "驾驶员异常报警"; | |||||
break; | break; | ||||
case 0x06: | case 0x06: | ||||
alarmOrEventTypeString = "道路标识超限报警"; | |||||
break; | |||||
case 0x07: | case 0x07: | ||||
alarmOrEventTypeString = "障碍物报警"; | |||||
break; | |||||
case 0x08: | case 0x08: | ||||
case 0x09: | case 0x09: | ||||
case 0x0A: | case 0x0A: | ||||
@@ -132,10 +128,10 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||||
alarmOrEventTypeString = "用户自定义"; | alarmOrEventTypeString = "用户自定义"; | ||||
break; | break; | ||||
case 0x10: | case 0x10: | ||||
alarmOrEventTypeString = "道路标志识别事件"; | |||||
alarmOrEventTypeString = "自动抓拍事件"; | |||||
break; | break; | ||||
case 0x11: | case 0x11: | ||||
alarmOrEventTypeString = "主动抓拍事件"; | |||||
alarmOrEventTypeString = "驾驶员变更事件"; | |||||
break; | break; | ||||
case 0x12: | case 0x12: | ||||
case 0x13: | case 0x13: | ||||
@@ -15,13 +15,13 @@ namespace JTActiveSafety.Protocol.Test | |||||
package.Offset = 1; | package.Offset = 1; | ||||
package.Bodies = new byte[5] { 1, 2, 3, 4, 5 }; | package.Bodies = new byte[5] { 1, 2, 3, 4, 5 }; | ||||
var hex = JTActiveSafetySerializer.Serialize(package).ToHexString(); | var hex = JTActiveSafetySerializer.Serialize(package).ToHexString(); | ||||
Assert.Equal("3031636400000000000000000000000000000000000000000000000000000000000000000000000000000000616C61726D2E786C737800000001000000050102030405", hex); | |||||
Assert.Equal("30 31 63 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 6C 61 72 6D 2E 78 6C 73 78 00 00 00 01 00 00 00 05 01 02 03 04 05", hex); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
public void DeserializeTest1() | public void DeserializeTest1() | ||||
{ | { | ||||
var data = "3031636400000000000000000000000000000000000000000000000000000000000000000000000000000000616C61726D2E786C737800000001000000050102030405".ToHexBytes(); | |||||
var data = "30 31 63 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 6C 61 72 6D 2E 78 6C 73 78 00 00 00 01 00 00 00 05 01 02 03 04 05".ToHexBytes(); | |||||
var package = JTActiveSafetySerializer.Deserialize(data); | var package = JTActiveSafetySerializer.Deserialize(data); | ||||
Assert.Equal(JTActiveSafetyPackage.FH, package.FH_Flag); | Assert.Equal(JTActiveSafetyPackage.FH, package.FH_Flag); | ||||
Assert.Equal("alarm.xlsx", package.FileName.TrimStart('\0')); | Assert.Equal("alarm.xlsx", package.FileName.TrimStart('\0')); | ||||
@@ -33,7 +33,7 @@ namespace JTActiveSafety.Protocol.Test | |||||
[Fact] | [Fact] | ||||
public void AnalyzeTest1() | public void AnalyzeTest1() | ||||
{ | { | ||||
var data = "3031636400000000000000000000000000000000000000000000000000000000000000000000000000000000616C61726D2E786C737800000001000000050102030405".ToHexBytes(); | |||||
var data = "30 31 63 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 6C 61 72 6D 2E 78 6C 73 78 00 00 00 01 00 00 00 05 01 02 03 04 05".ToHexBytes(); | |||||
var json = JTActiveSafetySerializer.Analyze(data); | var json = JTActiveSafetySerializer.Analyze(data); | ||||
} | } | ||||
} | } | ||||
@@ -1,4 +1,5 @@ | |||||
using System; | using System; | ||||
using System.Linq; | |||||
namespace JTActiveSafety.Protocol.Extensions | namespace JTActiveSafety.Protocol.Extensions | ||||
{ | { | ||||
@@ -8,38 +9,10 @@ namespace JTActiveSafety.Protocol.Extensions | |||||
/// </summary> | /// </summary> | ||||
public static partial class HexExtensions | public static partial class HexExtensions | ||||
{ | { | ||||
public static string ToHexString(this byte[] source) | |||||
public static string ToHexString(this byte[] source, string separator = " ") | |||||
{ | { | ||||
return HexUtil.DoHexDump(source, 0, source.Length).ToUpper(); | |||||
} | |||||
public static int WriteHexStringLittle(byte[] bytes, int offset, string data, int len) | |||||
{ | |||||
if (data == null) data = ""; | |||||
data = data.Replace(" ", ""); | |||||
int startIndex = 0; | |||||
if (data.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) | |||||
{ | |||||
startIndex = 2; | |||||
} | |||||
int length = len; | |||||
if (length == -1) | |||||
{ | |||||
length = (data.Length - startIndex) / 2; | |||||
} | |||||
int noOfZero = length * 2 + startIndex - data.Length; | |||||
if (noOfZero > 0) | |||||
{ | |||||
data = data.Insert(startIndex, new string('0', noOfZero)); | |||||
} | |||||
int byteIndex = 0; | |||||
while (startIndex < data.Length && byteIndex < length) | |||||
{ | |||||
bytes[offset + byteIndex] = Convert.ToByte(data.Substring(startIndex, 2), 16); | |||||
startIndex += 2; | |||||
byteIndex++; | |||||
} | |||||
return length; | |||||
var value = source.Select(s => s.ToString("X2")); | |||||
return string.Join(separator, value); | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
@@ -48,9 +21,9 @@ namespace JTActiveSafety.Protocol.Extensions | |||||
/// <param name="hexString"></param> | /// <param name="hexString"></param> | ||||
/// <param name="separator"></param> | /// <param name="separator"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public static byte[] ToHexBytes(this string hexString) | |||||
public static byte[] ToHexBytes(this string hexString,string separator=" ") | |||||
{ | { | ||||
hexString = hexString.Replace(" ", ""); | |||||
hexString = hexString.Replace(separator, ""); | |||||
byte[] buf = new byte[hexString.Length / 2]; | byte[] buf = new byte[hexString.Length / 2]; | ||||
ReadOnlySpan<char> readOnlySpan = hexString.AsSpan(); | ReadOnlySpan<char> readOnlySpan = hexString.AsSpan(); | ||||
for (int i = 0; i < hexString.Length; i++) | for (int i = 0; i < hexString.Length; i++) | ||||
@@ -63,14 +36,6 @@ namespace JTActiveSafety.Protocol.Extensions | |||||
return buf; | return buf; | ||||
} | } | ||||
public static string ReadHexStringLittle(ReadOnlySpan<byte> read, ref int offset, int len) | |||||
{ | |||||
ReadOnlySpan<byte> source = read.Slice(offset, len); | |||||
string hex = HexUtil.DoHexDump(read, offset, len); | |||||
offset += len; | |||||
return hex; | |||||
} | |||||
public static string ReadNumber(this byte value, string format = "X2") | public static string ReadNumber(this byte value, string format = "X2") | ||||
{ | { | ||||
return value.ToString(format); | return value.ToString(format); | ||||
@@ -121,52 +86,4 @@ namespace JTActiveSafety.Protocol.Extensions | |||||
} | } | ||||
} | } | ||||
public static class HexUtil | |||||
{ | |||||
static readonly char[] HexdumpTable = new char[256 * 4]; | |||||
static HexUtil() | |||||
{ | |||||
char[] digits = "0123456789ABCDEF".ToCharArray(); | |||||
for (int i = 0; i < 256; i++) | |||||
{ | |||||
HexdumpTable[i << 1] = digits[(int)((uint)i >> 4 & 0x0F)]; | |||||
HexdumpTable[(i << 1) + 1] = digits[i & 0x0F]; | |||||
} | |||||
} | |||||
public static string DoHexDump(ReadOnlySpan<byte> buffer, int fromIndex, int length) | |||||
{ | |||||
if (length == 0) | |||||
{ | |||||
return ""; | |||||
} | |||||
int endIndex = fromIndex + length; | |||||
var buf = new char[length << 1]; | |||||
int srcIdx = fromIndex; | |||||
int dstIdx = 0; | |||||
for (; srcIdx < endIndex; srcIdx++, dstIdx += 2) | |||||
{ | |||||
Array.Copy(HexdumpTable, buffer[srcIdx] << 1, buf, dstIdx, 2); | |||||
} | |||||
return new string(buf); | |||||
} | |||||
public static string DoHexDump(byte[] array, int fromIndex, int length) | |||||
{ | |||||
if (length == 0) | |||||
{ | |||||
return ""; | |||||
} | |||||
int endIndex = fromIndex + length; | |||||
var buf = new char[length << 1]; | |||||
int srcIdx = fromIndex; | |||||
int dstIdx = 0; | |||||
for (; srcIdx < endIndex; srcIdx++, dstIdx += 2) | |||||
{ | |||||
Array.Copy(HexdumpTable, (array[srcIdx] & 0xFF) << 1, buf, dstIdx, 2); | |||||
} | |||||
return new string(buf); | |||||
} | |||||
} | |||||
} | } |
@@ -15,7 +15,7 @@ | |||||
ref:"www.codeproject.com/tips/447938/high-performance-csharp-byte-array-to-hex-string-t" | ref:"www.codeproject.com/tips/447938/high-performance-csharp-byte-array-to-hex-string-t" | ||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="M:JTActiveSafety.Protocol.Extensions.HexExtensions.ToHexBytes(System.String)"> | |||||
<member name="M:JTActiveSafety.Protocol.Extensions.HexExtensions.ToHexBytes(System.String,System.String)"> | |||||
<summary> | <summary> | ||||
16进制字符串转16进制数组 | 16进制字符串转16进制数组 | ||||
</summary> | </summary> | ||||