|
- using JT808.Protocol.Enums;
- using JT808.Protocol.Extensions;
- using JT808.Protocol.Formatters;
- using JT808.Protocol.Interfaces;
- using JT808.Protocol.MessagePack;
- using JT808.Protocol.Metadata;
- using System;
- using System.Collections.Generic;
- using System.Text.Json;
-
- namespace JT808.Protocol.MessageBody
- {
- /// <summary>
- /// 设置矩形区域
- /// 0x8602
- /// </summary>
- public class JT808_0x8602 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8602>, IJT808Analyze, IJT808_2019_Version
- {
- public override ushort MsgId { get; } = 0x8602;
- public override string Description => "设置矩形区域";
- /// <summary>
- /// 设置属性
- /// <see cref="JT808.Protocol.Enums.JT808SettingProperty"/>
- /// </summary>
- public byte SettingAreaProperty { get; set; }
- /// <summary>
- /// 区域总数
- /// </summary>
- public byte AreaCount { get; set; }
- /// <summary>
- /// 区域项
- /// </summary>
- public List<JT808RectangleAreaProperty> AreaItems { get; set; }
-
- public JT808_0x8602 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
- {
- JT808_0x8602 jT808_0X8602 = new JT808_0x8602();
- jT808_0X8602.SettingAreaProperty = reader.ReadByte();
- jT808_0X8602.AreaCount = reader.ReadByte();
- jT808_0X8602.AreaItems = new List<JT808RectangleAreaProperty>();
- for (var i = 0; i < jT808_0X8602.AreaCount; i++)
- {
- JT808RectangleAreaProperty areaProperty = new JT808RectangleAreaProperty();
- areaProperty.AreaId = reader.ReadUInt32();
- areaProperty.AreaProperty = reader.ReadUInt16();
- areaProperty.UpLeftPointLat = reader.ReadUInt32();
- areaProperty.UpLeftPointLng = reader.ReadUInt32();
- areaProperty.LowRightPointLat = reader.ReadUInt32();
- areaProperty.LowRightPointLng = reader.ReadUInt32();
- ReadOnlySpan<char> areaProperty16Bit = Convert.ToString(areaProperty.AreaProperty, 2).PadLeft(16, '0').AsSpan();
- bool bit0Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 1).ToString().Equals("0");
- if (!bit0Flag)
- {
- areaProperty.StartTime = reader.ReadDateTime6();
- areaProperty.EndTime = reader.ReadDateTime6();
- }
- bool bit1Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 2, 1).ToString().Equals("0");
- if (!bit1Flag)
- {
- areaProperty.HighestSpeed = reader.ReadUInt16();
- areaProperty.OverspeedDuration = reader.ReadByte();
- if (reader.Version == JT808Version.JTT2019)
- {
- areaProperty.NightMaximumSpeed = reader.ReadUInt16();
- }
- }
- if (reader.Version == JT808Version.JTT2019)
- {
- areaProperty.NameLength = reader.ReadUInt16();
- areaProperty.AreaName = reader.ReadString(areaProperty.NameLength);
- }
- jT808_0X8602.AreaItems.Add(areaProperty);
- }
- return jT808_0X8602;
- }
-
- public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8602 value, IJT808Config config)
- {
- writer.WriteByte(value.SettingAreaProperty);
- if (value.AreaItems != null)
- {
- writer.WriteByte((byte)value.AreaItems.Count);
- foreach (var item in value.AreaItems)
- {
- writer.WriteUInt32(item.AreaId);
- writer.WriteUInt16(item.AreaProperty);
- writer.WriteUInt32(item.UpLeftPointLat);
- writer.WriteUInt32(item.UpLeftPointLng);
- writer.WriteUInt32(item.LowRightPointLat);
- writer.WriteUInt32(item.LowRightPointLng);
- ReadOnlySpan<char> areaProperty16Bit = Convert.ToString(item.AreaProperty, 2).PadLeft(16, '0').AsSpan();
- bool bit0Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 1).ToString().Equals("0");
- if (!bit0Flag)
- {
- if (item.StartTime.HasValue)
- {
- writer.WriteDateTime6(item.StartTime.Value);
- }
- if (item.EndTime.HasValue)
- {
- writer.WriteDateTime6(item.EndTime.Value);
- }
- }
- bool bit1Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 2, 1).ToString().Equals("0");
- if (!bit1Flag)
- {
- if (item.HighestSpeed.HasValue)
- {
- writer.WriteUInt16(item.HighestSpeed.Value);
- }
- if (item.OverspeedDuration.HasValue)
- {
- writer.WriteByte(item.OverspeedDuration.Value);
- }
- if (writer.Version == JT808Version.JTT2019)
- {
- writer.WriteUInt16(item.NightMaximumSpeed);
- }
- }
- if (writer.Version == JT808Version.JTT2019)
- {
- writer.Skip(2, out int AreaNameLengthPosition);
- writer.WriteString(item.AreaName);
- writer.WriteUInt16Return((ushort)(writer.GetCurrentPosition() - AreaNameLengthPosition - 2), AreaNameLengthPosition);
- }
- }
- }
- }
-
- public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
- {
- JT808_0x8602 value = new JT808_0x8602();
- value.SettingAreaProperty = reader.ReadByte();
- writer.WriteNumber($"[{ value.SettingAreaProperty.ReadNumber()}]设置属性", value.SettingAreaProperty);
- value.AreaCount = reader.ReadByte();
- writer.WriteNumber($"[{ value.AreaCount.ReadNumber()}]区域总数", value.AreaCount);
- writer.WriteStartArray("区域项");
- for (var i = 0; i < value.AreaCount; i++)
- {
- writer.WriteStartObject();
- JT808RectangleAreaProperty areaProperty = new JT808RectangleAreaProperty();
- areaProperty.AreaId = reader.ReadUInt32();
- writer.WriteNumber($"[{areaProperty.AreaId.ReadNumber()}]区域ID", areaProperty.AreaId);
- areaProperty.AreaProperty = reader.ReadUInt16();
- writer.WriteNumber($"[{areaProperty.AreaProperty.ReadNumber()}]区域属性", areaProperty.AreaProperty);
- areaProperty.UpLeftPointLat = reader.ReadUInt32();
- writer.WriteNumber($"[{areaProperty.UpLeftPointLat.ReadNumber()}]左上点纬度", areaProperty.UpLeftPointLat);
- areaProperty.UpLeftPointLng = reader.ReadUInt32();
- writer.WriteNumber($"[{areaProperty.UpLeftPointLng.ReadNumber()}]左上点经度", areaProperty.UpLeftPointLng);
- areaProperty.LowRightPointLat = reader.ReadUInt32();
- writer.WriteNumber($"[{areaProperty.LowRightPointLat.ReadNumber()}]右下点纬度", areaProperty.LowRightPointLat);
- areaProperty.LowRightPointLng = reader.ReadUInt32();
- writer.WriteNumber($"[{areaProperty.LowRightPointLng.ReadNumber()}]右下点经度", areaProperty.LowRightPointLng);
- ReadOnlySpan<char> areaProperty16Bit = Convert.ToString(areaProperty.AreaProperty, 2).PadLeft(16, '0').AsSpan();
- bool bit0Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 1).ToString().Equals("0");
- if (!bit0Flag)
- {
- areaProperty.StartTime = reader.ReadDateTime6();
- writer.WriteString($"[{ areaProperty.StartTime.Value.ToString("yyMMddHHmmss")}]起始时间", areaProperty.StartTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));
- areaProperty.EndTime = reader.ReadDateTime6();
- writer.WriteString($"[{ areaProperty.EndTime.Value.ToString("yyMMddHHmmss")}]起始时间", areaProperty.EndTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));
- }
- bool bit1Flag = areaProperty16Bit.Slice(areaProperty16Bit.Length - 2, 1).ToString().Equals("0");
- if (!bit1Flag)
- {
- areaProperty.HighestSpeed = reader.ReadUInt16();
- writer.WriteNumber($"[{areaProperty.HighestSpeed.Value.ReadNumber()}]最高速度", areaProperty.HighestSpeed.Value);
- areaProperty.OverspeedDuration = reader.ReadByte();
- writer.WriteNumber($"[{areaProperty.OverspeedDuration.Value.ReadNumber()}]超速持续时间", areaProperty.OverspeedDuration.Value);
- if (reader.Version == JT808Version.JTT2019)
- {
- areaProperty.NightMaximumSpeed = reader.ReadUInt16();
- writer.WriteNumber($"[{areaProperty.NightMaximumSpeed.ReadNumber()}]夜间最高速度", areaProperty.NightMaximumSpeed);
- }
- }
- if (reader.Version == JT808Version.JTT2019)
- {
- areaProperty.NameLength = reader.ReadUInt16();
- writer.WriteNumber($"[{areaProperty.NameLength.ReadNumber()}]夜间最高速度", areaProperty.NameLength);
- var areaNameBuffer = reader.ReadVirtualArray(areaProperty.NameLength);
- areaProperty.AreaName = reader.ReadString(areaProperty.NameLength);
- writer.WriteString($"[{ areaNameBuffer.ToArray().ToHexString()}]区域名称", areaProperty.AreaName);
- }
- writer.WriteEndObject();
- }
- writer.WriteEndArray();
- }
- }
- }
|