using JT808.Protocol.Extensions;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using System;
using System.Collections.Generic;
using System.Text.Json;
namespace JT808.Protocol.MessageBody
{
///
/// 提问下发
/// 0x8302
/// 2019版本已作删除
///
public class JT808_0x8302 : JT808Bodies, IJT808MessagePackFormatter, IJT808Analyze, IJT808_2019_Version
{
///
/// 0x8302
///
public override ushort MsgId { get; } = 0x8302;
///
/// 提问下发
///
public override string Description => "提问下发";
///
/// 标志
/// 提问下发标志位定义
///
public byte Flag { get; set; }
///
/// 问题内容长度
///
public byte IssueContentLength { get; set; }
///
/// 问题
/// 问题文本,经 GBK 编码,长度为 N
///
public string Issue { get; set; }
///
/// 候选答案列表
///
public List Answers { get; set; }
///
/// 候选答案信息
///
public class Answer
{
///
/// 答案 ID
///
public byte Id { get; set; }
///
/// 答案内容长度
/// 答案内容字段字节长度
///
public ushort ContentLength { get; set; }
///
/// 答案内容
/// 答案内容,经 GBK 编码
///
public string Content { get; set; }
}
///
///
///
///
///
///
public JT808_0x8302 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x8302 jT808_0X8302 = new JT808_0x8302();
jT808_0X8302.Flag = reader.ReadByte();
jT808_0X8302.IssueContentLength = reader.ReadByte();
jT808_0X8302.Issue = reader.ReadString(jT808_0X8302.IssueContentLength);
jT808_0X8302.Answers = new List();
while (reader.ReadCurrentRemainContentLength() > 0)
{
try
{
JT808_0x8302.Answer answer = new JT808_0x8302.Answer();
answer.Id = reader.ReadByte();
answer.ContentLength = reader.ReadUInt16();
answer.Content = reader.ReadString(answer.ContentLength);
jT808_0X8302.Answers.Add(answer);
}
catch
{
break;
}
}
return jT808_0X8302;
}
///
///
///
///
///
///
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8302 value, IJT808Config config)
{
writer.WriteByte(value.Flag);
// 先计算内容长度(汉字为两个字节)
writer.Skip(1, out int issuePosition);
writer.WriteString(value.Issue);
ushort issueLength = (ushort)(writer.GetCurrentPosition() - issuePosition - 1);
writer.WriteByteReturn((byte)issueLength, issuePosition);
if (value.Answers != null && value.Answers.Count > 0)
{
foreach (var item in value.Answers)
{
writer.WriteByte(item.Id);
writer.Skip(2, out int answerPosition);
writer.WriteString(item.Content);
ushort answerLength = (ushort)(writer.GetCurrentPosition() - answerPosition - 2);
writer.WriteUInt16Return(answerLength, answerPosition);
}
}
}
///
///
///
///
///
///
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x8302 value = new JT808_0x8302();
value.Flag = reader.ReadByte();
writer.WriteNumber($"[{value.Flag.ReadNumber()}]标志", value.Flag);
value.IssueContentLength = reader.ReadByte();
writer.WriteNumber($"[{value.IssueContentLength.ReadNumber()}]问题内容长度", value.IssueContentLength);
var issueBuffer= reader.ReadVirtualArray(value.IssueContentLength).ToArray();
value.Issue = reader.ReadString(value.IssueContentLength);
writer.WriteString($"[{issueBuffer.ToHexString()}]问题文本", value.Issue);
writer.WriteStartArray("候选答案列表");
while (reader.ReadCurrentRemainContentLength() > 0)
{
writer.WriteStartObject();
JT808_0x8302.Answer answer = new JT808_0x8302.Answer();
answer.Id = reader.ReadByte();
writer.WriteNumber($"[{answer.Id.ReadNumber()}]答案ID", answer.Id);
answer.ContentLength = reader.ReadUInt16();
writer.WriteNumber($"[{answer.ContentLength.ReadNumber()}]答案内容长度", answer.ContentLength);
var answerBuffer = reader.ReadVirtualArray(answer.ContentLength).ToArray();
answer.Content = reader.ReadString(answer.ContentLength);
writer.WriteString($"[{answerBuffer.ToHexString()}]答案内容", answer.Content);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
}