using JT808.Protocol.Extensions.YueBiao.Metadata;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using System;
using System.Text.Json;
namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
///
/// 报警附件上传指令
///
public class JT808_0x9208: JT808MessagePackFormatter, JT808Bodies, IJT808Analyze, IJT808_2019_Version
{
///
/// Description
///
public string Description => "报警附件上传指令";
///
/// 服务IP地址长度
///
public byte AttachmentServerIPLength { get; set; }
///
/// 服务IP地址
///
public string AttachmentServerIP { get; set; }
///
/// TCP端口
///
public ushort AttachmentServerIPTcpPort { get; set; }
///
/// UDP端口
///
public ushort AttachmentServerIPUdpPort { get; set; }
///
/// 报警标识号
///
public AlarmIdentificationProperty AlarmIdentification { get; set; }
///
/// 平台给报警分配的唯一编号
/// 32
///
public string AlarmId { get; set; }
///
/// 预留
///
public byte[] Retain { get; set; } = new byte[16];
///
/// 报警附件上传指令Id
///
public ushort MsgId => 0x9208;
///
///
///
///
///
///
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x9208 value = new JT808_0x9208();
value.AttachmentServerIPLength = reader.ReadByte();
writer.WriteNumber($"[{value.AttachmentServerIPLength.ReadNumber()}]服务IP地址长度", value.AttachmentServerIPLength);
string attachmentServerIPHex = reader.ReadVirtualArray(value.AttachmentServerIPLength).ToArray().ToHexString();
value.AttachmentServerIP = reader.ReadString(value.AttachmentServerIPLength);
writer.WriteString($"[{AttachmentServerIP}]服务IP地址", value.AttachmentServerIP);
value.AttachmentServerIPTcpPort = reader.ReadUInt16();
writer.WriteNumber($"[{value.AttachmentServerIPTcpPort.ReadNumber()}]TCP端口", value.AttachmentServerIPTcpPort);
value.AttachmentServerIPUdpPort = reader.ReadUInt16();
writer.WriteNumber($"[{value.AttachmentServerIPUdpPort.ReadNumber()}]UDP端口", value.AttachmentServerIPUdpPort);
value.AlarmIdentification = new AlarmIdentificationProperty();
string terminalIdHex = reader.ReadVirtualArray(30).ToArray().ToHexString();
value.AlarmIdentification.TerminalId = reader.ReadString(30);
value.AlarmIdentification.Time = reader.ReadDateTime_yyMMddHHmmss();
value.AlarmIdentification.SN = reader.ReadByte();
value.AlarmIdentification.AttachCount = reader.ReadByte();
value.AlarmIdentification.Retain1 = reader.ReadByte();
value.AlarmIdentification.Retain2 = reader.ReadByte();
writer.WriteString($"[{terminalIdHex}]终端ID", value.AlarmIdentification.TerminalId);
writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss"));
writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN);
writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount);
writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1);
writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2);
string alarmIdHex = reader.ReadVirtualArray(32).ToArray().ToHexString();
value.AlarmId = reader.ReadString(32);
writer.WriteString($"[{alarmIdHex}]平台给报警分配的唯一编号", value.AlarmId);
string retainHex = reader.ReadVirtualArray(16).ToArray().ToHexString();
writer.WriteString($"预留", retainHex);
}
///
///
///
///
///
///
public override JT808_0x9208 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x9208 value = new JT808_0x9208();
value.AttachmentServerIPLength = reader.ReadByte();
value.AttachmentServerIP = reader.ReadString(value.AttachmentServerIPLength);
value.AttachmentServerIPTcpPort = reader.ReadUInt16();
value.AttachmentServerIPUdpPort = reader.ReadUInt16();
value.AlarmIdentification = new AlarmIdentificationProperty
{
TerminalId = reader.ReadString(30),
Time = reader.ReadDateTime_yyMMddHHmmss(),
SN = reader.ReadByte(),
AttachCount = reader.ReadByte(),
Retain1 = reader.ReadByte(),
Retain2 = reader.ReadByte()
};
value.AlarmId = reader.ReadString(32);
value.Retain = reader.ReadArray(16).ToArray();
return value;
}
///
///
///
///
///
///
public override void Serialize(ref JT808MessagePackWriter writer, JT808_0x9208 value, IJT808Config config)
{
writer.Skip(1, out int AttachmentServerIPLengthPosition);
writer.WriteString(value.AttachmentServerIP);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - AttachmentServerIPLengthPosition - 1), AttachmentServerIPLengthPosition);
writer.WriteUInt16(value.AttachmentServerIPTcpPort);
writer.WriteUInt16(value.AttachmentServerIPUdpPort);
if (value.AlarmIdentification == null)
{
throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");
}
writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0'));
writer.WriteDateTime_yyMMddHHmmss(value.AlarmIdentification.Time);
writer.WriteByte(value.AlarmIdentification.SN);
writer.WriteByte(value.AlarmIdentification.AttachCount);
writer.WriteByte(value.AlarmIdentification.Retain1);
writer.WriteByte(value.AlarmIdentification.Retain2);
writer.WriteString(value.AlarmId);
writer.WriteArray(value.Retain);
}
}
}