選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

154 行
6.0 KiB

  1. using JT808.Protocol.Extensions;
  2. using JT808.Protocol.Formatters;
  3. using JT808.Protocol.Interfaces;
  4. using JT808.Protocol.MessagePack;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Text.Json;
  8. namespace JT808.Protocol.MessageBody
  9. {
  10. /// <summary>
  11. /// 提问下发
  12. /// 0x8302
  13. /// 2019版本已作删除
  14. /// </summary>
  15. public class JT808_0x8302 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8302>, IJT808Analyze, IJT808_2019_Version
  16. {
  17. /// <summary>
  18. /// 0x8302
  19. /// </summary>
  20. public override ushort MsgId { get; } = 0x8302;
  21. /// <summary>
  22. /// 提问下发
  23. /// </summary>
  24. public override string Description => "提问下发";
  25. /// <summary>
  26. /// 标志
  27. /// 提问下发标志位定义
  28. /// </summary>
  29. public byte Flag { get; set; }
  30. /// <summary>
  31. /// 问题内容长度
  32. /// </summary>
  33. public byte IssueContentLength { get; set; }
  34. /// <summary>
  35. /// 问题
  36. /// 问题文本,经 GBK 编码,长度为 N
  37. /// </summary>
  38. public string Issue { get; set; }
  39. /// <summary>
  40. /// 候选答案列表
  41. /// </summary>
  42. public List<Answer> Answers { get; set; }
  43. /// <summary>
  44. /// 候选答案信息
  45. /// </summary>
  46. public class Answer
  47. {
  48. /// <summary>
  49. /// 答案 ID
  50. /// </summary>
  51. public byte Id { get; set; }
  52. /// <summary>
  53. /// 答案内容长度
  54. /// 答案内容字段字节长度
  55. /// </summary>
  56. public ushort ContentLength { get; set; }
  57. /// <summary>
  58. /// 答案内容
  59. /// 答案内容,经 GBK 编码
  60. /// </summary>
  61. public string Content { get; set; }
  62. }
  63. /// <summary>
  64. ///
  65. /// </summary>
  66. /// <param name="reader"></param>
  67. /// <param name="config"></param>
  68. /// <returns></returns>
  69. public JT808_0x8302 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  70. {
  71. JT808_0x8302 jT808_0X8302 = new JT808_0x8302();
  72. jT808_0X8302.Flag = reader.ReadByte();
  73. jT808_0X8302.IssueContentLength = reader.ReadByte();
  74. jT808_0X8302.Issue = reader.ReadString(jT808_0X8302.IssueContentLength);
  75. jT808_0X8302.Answers = new List<JT808_0x8302.Answer>();
  76. while (reader.ReadCurrentRemainContentLength() > 0)
  77. {
  78. try
  79. {
  80. JT808_0x8302.Answer answer = new JT808_0x8302.Answer();
  81. answer.Id = reader.ReadByte();
  82. answer.ContentLength = reader.ReadUInt16();
  83. answer.Content = reader.ReadString(answer.ContentLength);
  84. jT808_0X8302.Answers.Add(answer);
  85. }
  86. catch
  87. {
  88. break;
  89. }
  90. }
  91. return jT808_0X8302;
  92. }
  93. /// <summary>
  94. ///
  95. /// </summary>
  96. /// <param name="writer"></param>
  97. /// <param name="value"></param>
  98. /// <param name="config"></param>
  99. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8302 value, IJT808Config config)
  100. {
  101. writer.WriteByte(value.Flag);
  102. // 先计算内容长度(汉字为两个字节)
  103. writer.Skip(1, out int issuePosition);
  104. writer.WriteString(value.Issue);
  105. ushort issueLength = (ushort)(writer.GetCurrentPosition() - issuePosition - 1);
  106. writer.WriteByteReturn((byte)issueLength, issuePosition);
  107. if (value.Answers != null && value.Answers.Count > 0)
  108. {
  109. foreach (var item in value.Answers)
  110. {
  111. writer.WriteByte(item.Id);
  112. writer.Skip(2, out int answerPosition);
  113. writer.WriteString(item.Content);
  114. ushort answerLength = (ushort)(writer.GetCurrentPosition() - answerPosition - 2);
  115. writer.WriteUInt16Return(answerLength, answerPosition);
  116. }
  117. }
  118. }
  119. /// <summary>
  120. ///
  121. /// </summary>
  122. /// <param name="reader"></param>
  123. /// <param name="writer"></param>
  124. /// <param name="config"></param>
  125. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  126. {
  127. JT808_0x8302 value = new JT808_0x8302();
  128. value.Flag = reader.ReadByte();
  129. writer.WriteNumber($"[{value.Flag.ReadNumber()}]标志", value.Flag);
  130. value.IssueContentLength = reader.ReadByte();
  131. writer.WriteNumber($"[{value.IssueContentLength.ReadNumber()}]问题内容长度", value.IssueContentLength);
  132. var issueBuffer= reader.ReadVirtualArray(value.IssueContentLength).ToArray();
  133. value.Issue = reader.ReadString(value.IssueContentLength);
  134. writer.WriteString($"[{issueBuffer.ToHexString()}]问题文本", value.Issue);
  135. writer.WriteStartArray("候选答案列表");
  136. while (reader.ReadCurrentRemainContentLength() > 0)
  137. {
  138. writer.WriteStartObject();
  139. JT808_0x8302.Answer answer = new JT808_0x8302.Answer();
  140. answer.Id = reader.ReadByte();
  141. writer.WriteNumber($"[{answer.Id.ReadNumber()}]答案ID", answer.Id);
  142. answer.ContentLength = reader.ReadUInt16();
  143. writer.WriteNumber($"[{answer.ContentLength.ReadNumber()}]答案内容长度", answer.ContentLength);
  144. var answerBuffer = reader.ReadVirtualArray(answer.ContentLength).ToArray();
  145. answer.Content = reader.ReadString(answer.ContentLength);
  146. writer.WriteString($"[{answerBuffer.ToHexString()}]答案内容", answer.Content);
  147. writer.WriteEndObject();
  148. }
  149. writer.WriteEndArray();
  150. }
  151. }
  152. }