@@ -105,6 +105,14 @@ namespace JT808.Protocol.Test.MessageBody | |||||
} | } | ||||
[Fact] | |||||
public void Test3() | |||||
{ | |||||
byte[] bytes = "01 03 00 00 05 F2 00 DE 07 5B CD 15 07 5B CD 15 00 00 00 C8 00 3C C8 00 00 05 F3 00 00 07 5B CD 15 07 5B CD 15 00 00 00 C8 00 00 05 F4 08 A3 07 5B CD 15 07 5B CD 15 00 00 00 C8 18 10 18 00 00 12 18 10 19 00 00 12 00 3C C8".ToHexBytes(); | |||||
string json = JT808Serializer.Analyze<JT808_0x8600>(bytes); | |||||
} | |||||
[Fact] | [Fact] | ||||
public void Test_2019_1() | public void Test_2019_1() | ||||
{ | { | ||||
@@ -151,6 +151,10 @@ namespace JT808.Protocol.MessageBody | |||||
writer.WriteString("bit3", terminalTypeBits[3] == '0' ? "不适用出租车辆" : "适用出租车辆"); | writer.WriteString("bit3", terminalTypeBits[3] == '0' ? "不适用出租车辆" : "适用出租车辆"); | ||||
writer.WriteString("bit6", terminalTypeBits[6] == '0' ? "不支持硬盘录像" : "支持硬盘录像"); | writer.WriteString("bit6", terminalTypeBits[6] == '0' ? "不支持硬盘录像" : "支持硬盘录像"); | ||||
writer.WriteString("bit7", terminalTypeBits[7] == '0' ? "一体机" : "分体机"); | writer.WriteString("bit7", terminalTypeBits[7] == '0' ? "一体机" : "分体机"); | ||||
if (reader.Version == JT808Version.JTT2019) | |||||
{ | |||||
writer.WriteString("bit8", terminalTypeBits[8] == '0' ? "不适用挂车" : "适用挂车"); | |||||
} | |||||
writer.WriteEndObject(); | writer.WriteEndObject(); | ||||
if (reader.Version == JT808Version.JTT2019) | if (reader.Version == JT808Version.JTT2019) | ||||
{ | { | ||||
@@ -130,9 +130,10 @@ namespace JT808.Protocol.MessageBody | |||||
{ | { | ||||
JT808_0x8600 value = new JT808_0x8600(); | JT808_0x8600 value = new JT808_0x8600(); | ||||
value.SettingAreaProperty = reader.ReadByte(); | value.SettingAreaProperty = reader.ReadByte(); | ||||
writer.WriteNumber($"[{ value.SettingAreaProperty.ReadNumber()}]设置属性", value.SettingAreaProperty); | |||||
JT808SettingProperty jT808SettingProperty = (JT808SettingProperty)value.SettingAreaProperty; | |||||
writer.WriteNumber($"[{ value.SettingAreaProperty.ReadNumber()}]设置属性-{jT808SettingProperty.ToString()}", value.SettingAreaProperty); | |||||
value.AreaCount = reader.ReadByte(); | value.AreaCount = reader.ReadByte(); | ||||
writer.WriteNumber($"[{ value.AreaCount.ReadNumber()}]区域数", value.AreaCount); | |||||
writer.WriteNumber($"[{ value.AreaCount.ReadNumber()}]区域总数", value.AreaCount); | |||||
writer.WriteStartArray("区域项"); | writer.WriteStartArray("区域项"); | ||||
for (var i = 0; i < value.AreaCount; i++) | for (var i = 0; i < value.AreaCount; i++) | ||||
{ | { | ||||
@@ -142,6 +143,39 @@ namespace JT808.Protocol.MessageBody | |||||
writer.WriteNumber($"[{ jT808CircleAreaProperty.AreaId.ReadNumber()}]区域ID", jT808CircleAreaProperty.AreaId); | writer.WriteNumber($"[{ jT808CircleAreaProperty.AreaId.ReadNumber()}]区域ID", jT808CircleAreaProperty.AreaId); | ||||
jT808CircleAreaProperty.AreaProperty = reader.ReadUInt16(); | jT808CircleAreaProperty.AreaProperty = reader.ReadUInt16(); | ||||
writer.WriteNumber($"[{ jT808CircleAreaProperty.AreaProperty.ReadNumber()}]区域属性", jT808CircleAreaProperty.AreaProperty); | writer.WriteNumber($"[{ jT808CircleAreaProperty.AreaProperty.ReadNumber()}]区域属性", jT808CircleAreaProperty.AreaProperty); | ||||
ReadOnlySpan<char> areaPropertyBits = Convert.ToString(jT808CircleAreaProperty.AreaProperty, 2).PadLeft(16, '0').AsSpan(); | |||||
writer.WriteStartObject($"区域属性对象[{areaPropertyBits.ToString()}]"); | |||||
if (reader.Version == JT808Version.JTT2019) | |||||
{ | |||||
writer.WriteString($"[bit15]{areaPropertyBits[15]}", areaPropertyBits[15]=='0'?"进区域不采集GNSS详细定位数据":"进区域采集GNSS详细定位数据"); | |||||
writer.WriteString($"[bit14]{areaPropertyBits[14]}", areaPropertyBits[14]=='0'?"进区域开启通信模块":"进区域关闭通信模块"); | |||||
writer.WriteString("[bit9~bit13]保留", areaPropertyBits.Slice(9,5)); | |||||
writer.WriteString($"[bit8]{areaPropertyBits[8]}", areaPropertyBits[8] == '0' ? "允许开门" : "禁止开门"); | |||||
writer.WriteString($"[bit7]{areaPropertyBits[7]}", areaPropertyBits[7] == '0' ? "东经" : "西经"); | |||||
writer.WriteString($"[bit6]{areaPropertyBits[6]}", areaPropertyBits[6] == '0' ? "北纬" : "南纬"); | |||||
writer.WriteString($"[bit5]出区域是否报警给平台-{areaPropertyBits[5]}", areaPropertyBits[5] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit4]出区域是否报警给平驾驶员-{areaPropertyBits[4]}", areaPropertyBits[4] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit3]进区域是否报警给平台-{areaPropertyBits[3]}", areaPropertyBits[3] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit2]进区域是否报警给驾驶员-{areaPropertyBits[2]}", areaPropertyBits[2] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit1]是否启用最高速度、超速持续时间和夜间最高速度的判断规则-{areaPropertyBits[1]}", areaPropertyBits[1] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit0]是否启用起始时间与结束时间的判断规则-{areaPropertyBits[0]}", areaPropertyBits[0] == '0' ? "否" : "是"); | |||||
} | |||||
else | |||||
{ | |||||
writer.WriteString($"[bit15]{areaPropertyBits[15]}", areaPropertyBits[15] == '0' ? "进区域不采集GNSS详细定位数据" : "进区域采集GNSS详细定位数据"); | |||||
writer.WriteString($"[bit14]{areaPropertyBits[14]}", areaPropertyBits[14] == '0' ? "进区域开启通信模块" : "进区域关闭通信模块"); | |||||
writer.WriteString("[bit9~bit13]保留", areaPropertyBits.Slice(9, 5)); | |||||
writer.WriteString($"[bit8]{areaPropertyBits[8]}", areaPropertyBits[8] == '0' ? "允许开门" : "禁止开门"); | |||||
writer.WriteString($"[bit7]{areaPropertyBits[7]}", areaPropertyBits[7] == '0' ? "东经" : "西经"); | |||||
writer.WriteString($"[bit6]{areaPropertyBits[6]}", areaPropertyBits[6] == '0' ? "北纬" : "南纬"); | |||||
writer.WriteString($"[bit5]{areaPropertyBits[5]}", areaPropertyBits[5] == '1' ? "出区域报警给平台" : "无"); | |||||
writer.WriteString($"[bit4]{areaPropertyBits[4]}", areaPropertyBits[4] == '1' ? "出区域报警给驾驶员" : "无"); | |||||
writer.WriteString($"[bit3]{areaPropertyBits[3]}", areaPropertyBits[3] == '1' ? "进区域报警给平台" : "无"); | |||||
writer.WriteString($"[bit2]{areaPropertyBits[2]}", areaPropertyBits[2] == '1' ? "进区域报警给驾驶员" : "无"); | |||||
writer.WriteString($"[bit1]{areaPropertyBits[1]}", areaPropertyBits[1] == '1' ? "限速" : "无"); | |||||
writer.WriteString($"[bit0]{areaPropertyBits[0]}", areaPropertyBits[0] == '1' ? "根据时间" : "无"); | |||||
} | |||||
writer.WriteEndObject(); | |||||
jT808CircleAreaProperty.CenterPointLat = reader.ReadUInt32(); | jT808CircleAreaProperty.CenterPointLat = reader.ReadUInt32(); | ||||
writer.WriteNumber($"[{ jT808CircleAreaProperty.CenterPointLat.ReadNumber()}]中心点纬度", jT808CircleAreaProperty.CenterPointLat); | writer.WriteNumber($"[{ jT808CircleAreaProperty.CenterPointLat.ReadNumber()}]中心点纬度", jT808CircleAreaProperty.CenterPointLat); | ||||
jT808CircleAreaProperty.CenterPointLng = reader.ReadUInt32(); | jT808CircleAreaProperty.CenterPointLng = reader.ReadUInt32(); | ||||
@@ -142,6 +142,40 @@ namespace JT808.Protocol.MessageBody | |||||
areaProperty.AreaId = reader.ReadUInt32(); | areaProperty.AreaId = reader.ReadUInt32(); | ||||
writer.WriteNumber($"[{areaProperty.AreaId.ReadNumber()}]区域ID", areaProperty.AreaId); | writer.WriteNumber($"[{areaProperty.AreaId.ReadNumber()}]区域ID", areaProperty.AreaId); | ||||
areaProperty.AreaProperty = reader.ReadUInt16(); | areaProperty.AreaProperty = reader.ReadUInt16(); | ||||
ReadOnlySpan<char> areaPropertyBits = Convert.ToString(areaProperty.AreaProperty, 2).PadLeft(16, '0').AsSpan(); | |||||
writer.WriteStartObject($"区域属性对象[{areaPropertyBits.ToString()}]"); | |||||
if (reader.Version == JT808Version.JTT2019) | |||||
{ | |||||
writer.WriteString($"[bit15]{areaPropertyBits[15]}", areaPropertyBits[15] == '0' ? "进区域不采集GNSS详细定位数据" : "进区域采集GNSS详细定位数据"); | |||||
writer.WriteString($"[bit14]{areaPropertyBits[14]}", areaPropertyBits[14] == '0' ? "进区域开启通信模块" : "进区域关闭通信模块"); | |||||
writer.WriteString("[bit9~bit13]保留", areaPropertyBits.Slice(9, 5)); | |||||
writer.WriteString($"[bit8]{areaPropertyBits[8]}", areaPropertyBits[8] == '0' ? "允许开门" : "禁止开门"); | |||||
writer.WriteString($"[bit7]{areaPropertyBits[7]}", areaPropertyBits[7] == '0' ? "东经" : "西经"); | |||||
writer.WriteString($"[bit6]{areaPropertyBits[6]}", areaPropertyBits[6] == '0' ? "北纬" : "南纬"); | |||||
writer.WriteString($"[bit5]出区域是否报警给平台-{areaPropertyBits[5]}", areaPropertyBits[5] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit4]出区域是否报警给平驾驶员-{areaPropertyBits[4]}", areaPropertyBits[4] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit3]进区域是否报警给平台-{areaPropertyBits[3]}", areaPropertyBits[3] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit2]进区域是否报警给驾驶员-{areaPropertyBits[2]}", areaPropertyBits[2] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit1]是否启用最高速度、超速持续时间和夜间最高速度的判断规则-{areaPropertyBits[1]}", areaPropertyBits[1] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit0]是否启用起始时间与结束时间的判断规则-{areaPropertyBits[0]}", areaPropertyBits[0] == '0' ? "否" : "是"); | |||||
} | |||||
else | |||||
{ | |||||
writer.WriteString($"[bit15]{areaPropertyBits[15]}", areaPropertyBits[15] == '0' ? "进区域不采集GNSS详细定位数据" : "进区域采集GNSS详细定位数据"); | |||||
writer.WriteString($"[bit14]{areaPropertyBits[14]}", areaPropertyBits[14] == '0' ? "进区域开启通信模块" : "进区域关闭通信模块"); | |||||
writer.WriteString("[bit9~bit13]保留", areaPropertyBits.Slice(9, 5)); | |||||
writer.WriteString($"[bit8]{areaPropertyBits[8]}", areaPropertyBits[8] == '0' ? "允许开门" : "禁止开门"); | |||||
writer.WriteString($"[bit7]{areaPropertyBits[7]}", areaPropertyBits[7] == '0' ? "东经" : "西经"); | |||||
writer.WriteString($"[bit6]{areaPropertyBits[6]}", areaPropertyBits[6] == '0' ? "北纬" : "南纬"); | |||||
writer.WriteString($"[bit5]{areaPropertyBits[5]}", areaPropertyBits[5] == '1' ? "出区域报警给平台" : "无"); | |||||
writer.WriteString($"[bit4]{areaPropertyBits[4]}", areaPropertyBits[4] == '1' ? "出区域报警给驾驶员" : "无"); | |||||
writer.WriteString($"[bit3]{areaPropertyBits[3]}", areaPropertyBits[3] == '1' ? "进区域报警给平台" : "无"); | |||||
writer.WriteString($"[bit2]{areaPropertyBits[2]}", areaPropertyBits[2] == '1' ? "进区域报警给驾驶员" : "无"); | |||||
writer.WriteString($"[bit1]{areaPropertyBits[1]}", areaPropertyBits[1] == '1' ? "限速" : "无"); | |||||
writer.WriteString($"[bit0]{areaPropertyBits[0]}", areaPropertyBits[0] == '1' ? "根据时间" : "无"); | |||||
} | |||||
writer.WriteEndObject(); | |||||
writer.WriteNumber($"[{areaProperty.AreaProperty.ReadNumber()}]区域属性", areaProperty.AreaProperty); | writer.WriteNumber($"[{areaProperty.AreaProperty.ReadNumber()}]区域属性", areaProperty.AreaProperty); | ||||
areaProperty.UpLeftPointLat = reader.ReadUInt32(); | areaProperty.UpLeftPointLat = reader.ReadUInt32(); | ||||
writer.WriteNumber($"[{areaProperty.UpLeftPointLat.ReadNumber()}]左上点纬度", areaProperty.UpLeftPointLat); | writer.WriteNumber($"[{areaProperty.UpLeftPointLat.ReadNumber()}]左上点纬度", areaProperty.UpLeftPointLat); | ||||
@@ -167,6 +167,40 @@ namespace JT808.Protocol.MessageBody | |||||
writer.WriteNumber($"[{ value.AreaId.ReadNumber()}]区域ID", value.AreaId); | writer.WriteNumber($"[{ value.AreaId.ReadNumber()}]区域ID", value.AreaId); | ||||
value.AreaProperty = reader.ReadUInt16(); | value.AreaProperty = reader.ReadUInt16(); | ||||
writer.WriteNumber($"[{ value.AreaProperty.ReadNumber()}]区域属性", value.AreaProperty); | writer.WriteNumber($"[{ value.AreaProperty.ReadNumber()}]区域属性", value.AreaProperty); | ||||
ReadOnlySpan<char> areaPropertyBits = Convert.ToString(value.AreaProperty, 2).PadLeft(16, '0').AsSpan(); | |||||
writer.WriteStartObject($"区域属性对象[{areaPropertyBits.ToString()}]"); | |||||
if (reader.Version == JT808Version.JTT2019) | |||||
{ | |||||
writer.WriteString($"[bit15]{areaPropertyBits[15]}", areaPropertyBits[15] == '0' ? "进区域不采集GNSS详细定位数据" : "进区域采集GNSS详细定位数据"); | |||||
writer.WriteString($"[bit14]{areaPropertyBits[14]}", areaPropertyBits[14] == '0' ? "进区域开启通信模块" : "进区域关闭通信模块"); | |||||
writer.WriteString("[bit9~bit13]保留", areaPropertyBits.Slice(9, 5)); | |||||
writer.WriteString($"[bit8]{areaPropertyBits[8]}", areaPropertyBits[8] == '0' ? "允许开门" : "禁止开门"); | |||||
writer.WriteString($"[bit7]{areaPropertyBits[7]}", areaPropertyBits[7] == '0' ? "东经" : "西经"); | |||||
writer.WriteString($"[bit6]{areaPropertyBits[6]}", areaPropertyBits[6] == '0' ? "北纬" : "南纬"); | |||||
writer.WriteString($"[bit5]出区域是否报警给平台-{areaPropertyBits[5]}", areaPropertyBits[5] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit4]出区域是否报警给平驾驶员-{areaPropertyBits[4]}", areaPropertyBits[4] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit3]进区域是否报警给平台-{areaPropertyBits[3]}", areaPropertyBits[3] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit2]进区域是否报警给驾驶员-{areaPropertyBits[2]}", areaPropertyBits[2] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit1]是否启用最高速度、超速持续时间和夜间最高速度的判断规则-{areaPropertyBits[1]}", areaPropertyBits[1] == '0' ? "否" : "是"); | |||||
writer.WriteString($"[bit0]是否启用起始时间与结束时间的判断规则-{areaPropertyBits[0]}", areaPropertyBits[0] == '0' ? "否" : "是"); | |||||
} | |||||
else | |||||
{ | |||||
writer.WriteString($"[bit15]{areaPropertyBits[15]}", areaPropertyBits[15] == '0' ? "进区域不采集GNSS详细定位数据" : "进区域采集GNSS详细定位数据"); | |||||
writer.WriteString($"[bit14]{areaPropertyBits[14]}", areaPropertyBits[14] == '0' ? "进区域开启通信模块" : "进区域关闭通信模块"); | |||||
writer.WriteString("[bit9~bit13]保留", areaPropertyBits.Slice(9, 5)); | |||||
writer.WriteString($"[bit8]{areaPropertyBits[8]}", areaPropertyBits[8] == '0' ? "允许开门" : "禁止开门"); | |||||
writer.WriteString($"[bit7]{areaPropertyBits[7]}", areaPropertyBits[7] == '0' ? "东经" : "西经"); | |||||
writer.WriteString($"[bit6]{areaPropertyBits[6]}", areaPropertyBits[6] == '0' ? "北纬" : "南纬"); | |||||
writer.WriteString($"[bit5]{areaPropertyBits[5]}", areaPropertyBits[5] == '1' ? "出区域报警给平台" : "无"); | |||||
writer.WriteString($"[bit4]{areaPropertyBits[4]}", areaPropertyBits[4] == '1' ? "出区域报警给驾驶员" : "无"); | |||||
writer.WriteString($"[bit3]{areaPropertyBits[3]}", areaPropertyBits[3] == '1' ? "进区域报警给平台" : "无"); | |||||
writer.WriteString($"[bit2]{areaPropertyBits[2]}", areaPropertyBits[2] == '1' ? "进区域报警给驾驶员" : "无"); | |||||
writer.WriteString($"[bit1]{areaPropertyBits[1]}", areaPropertyBits[1] == '1' ? "限速" : "无"); | |||||
writer.WriteString($"[bit0]{areaPropertyBits[0]}", areaPropertyBits[0] == '1' ? "根据时间" : "无"); | |||||
} | |||||
writer.WriteEndObject(); | |||||
ReadOnlySpan<char> areaProperty16Bit = Convert.ToString(value.AreaProperty, 2).PadLeft(16, '0').AsSpan(); | ReadOnlySpan<char> areaProperty16Bit = Convert.ToString(value.AreaProperty, 2).PadLeft(16, '0').AsSpan(); | ||||
bool bit0Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 1).ToString().Equals("0"); | bool bit0Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 1).ToString().Equals("0"); | ||||
if (!bit0Flag) | if (!bit0Flag) | ||||