1.修复驾驶员状态监测系统报警信息预设的附加信息长度 2.修复驾驶员状态监测系统报警信息(报警/事件类型)数据类型分析器 修复单元测试pull/4/head
@@ -57,7 +57,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test | |||
VehicleState = 19 | |||
}); | |||
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString(); | |||
Assert.Equal("000000010000000200BA7F0E07E4F11C0028003C00001807151010106520000000010C060512010203041100070000000D0000000E191211183100001334343434343434191210183100030200", hex); | |||
Assert.Equal("000000010000000200BA7F0E07E4F11C0028003C0000180715101010652F000000010C060512010203041100070000000D0000000E191211183100001334343434343434191210183100030200", hex); | |||
} | |||
[Fact] | |||
public void Deserialize() | |||
@@ -15,7 +15,7 @@ | |||
<licenseUrl>https://github.com/SmallChi/JTActiveSafety/blob/master/LICENSE</licenseUrl> | |||
<license>https://github.com/SmallChi/JTActiveSafety/blob/master/LICENSE</license> | |||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> | |||
<Version>1.0.5</Version> | |||
<Version>1.0.6</Version> | |||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||
</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 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> | |||
/// 报警ID | |||
/// </summary> | |||
@@ -101,26 +101,22 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
switch (value.AlarmOrEventType) | |||
{ | |||
case 0x01: | |||
alarmOrEventTypeString = "前向碰撞报警"; | |||
alarmOrEventTypeString = "疲劳驾驶报警"; | |||
break; | |||
case 0x02: | |||
alarmOrEventTypeString = "车道偏离报警"; | |||
alarmOrEventTypeString = "接打电话报警"; | |||
break; | |||
case 0x03: | |||
alarmOrEventTypeString = "车距过近报警"; | |||
alarmOrEventTypeString = "抽烟报警"; | |||
break; | |||
case 0x04: | |||
alarmOrEventTypeString = "行人碰撞报警"; | |||
alarmOrEventTypeString = "分神驾驶报警"; | |||
break; | |||
case 0x05: | |||
alarmOrEventTypeString = "频繁变道报警"; | |||
alarmOrEventTypeString = "驾驶员异常报警"; | |||
break; | |||
case 0x06: | |||
alarmOrEventTypeString = "道路标识超限报警"; | |||
break; | |||
case 0x07: | |||
alarmOrEventTypeString = "障碍物报警"; | |||
break; | |||
case 0x08: | |||
case 0x09: | |||
case 0x0A: | |||
@@ -132,10 +128,10 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody | |||
alarmOrEventTypeString = "用户自定义"; | |||
break; | |||
case 0x10: | |||
alarmOrEventTypeString = "道路标志识别事件"; | |||
alarmOrEventTypeString = "自动抓拍事件"; | |||
break; | |||
case 0x11: | |||
alarmOrEventTypeString = "主动抓拍事件"; | |||
alarmOrEventTypeString = "驾驶员变更事件"; | |||
break; | |||
case 0x12: | |||
case 0x13: | |||
@@ -15,13 +15,13 @@ namespace JTActiveSafety.Protocol.Test | |||
package.Offset = 1; | |||
package.Bodies = new byte[5] { 1, 2, 3, 4, 5 }; | |||
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] | |||
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); | |||
Assert.Equal(JTActiveSafetyPackage.FH, package.FH_Flag); | |||
Assert.Equal("alarm.xlsx", package.FileName.TrimStart('\0')); | |||
@@ -33,7 +33,7 @@ namespace JTActiveSafety.Protocol.Test | |||
[Fact] | |||
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); | |||
} | |||
} | |||
@@ -1,4 +1,5 @@ | |||
using System; | |||
using System.Linq; | |||
namespace JTActiveSafety.Protocol.Extensions | |||
{ | |||
@@ -8,38 +9,10 @@ namespace JTActiveSafety.Protocol.Extensions | |||
/// </summary> | |||
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> | |||
@@ -48,9 +21,9 @@ namespace JTActiveSafety.Protocol.Extensions | |||
/// <param name="hexString"></param> | |||
/// <param name="separator"></param> | |||
/// <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]; | |||
ReadOnlySpan<char> readOnlySpan = hexString.AsSpan(); | |||
for (int i = 0; i < hexString.Length; i++) | |||
@@ -63,14 +36,6 @@ namespace JTActiveSafety.Protocol.Extensions | |||
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") | |||
{ | |||
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" | |||
</summary> | |||
</member> | |||
<member name="M:JTActiveSafety.Protocol.Extensions.HexExtensions.ToHexBytes(System.String)"> | |||
<member name="M:JTActiveSafety.Protocol.Extensions.HexExtensions.ToHexBytes(System.String,System.String)"> | |||
<summary> | |||
16进制字符串转16进制数组 | |||
</summary> | |||