您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

141 行
6.0 KiB

  1. using JT808.Protocol.Enums;
  2. using JT808.Protocol.Extensions;
  3. using JT808.Protocol.Formatters;
  4. using JT808.Protocol.Interfaces;
  5. using JT808.Protocol.MessagePack;
  6. using System;
  7. using System.Linq;
  8. using System.Text.Json;
  9. namespace JT808.Protocol.MessageBody
  10. {
  11. /// <summary>
  12. /// 文本信息下发
  13. /// </summary>
  14. public class JT808_0x8300 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8300>, IJT808Analyze, IJT808_2019_Version
  15. {
  16. /// <summary>
  17. /// 0x8300
  18. /// </summary>
  19. public override ushort MsgId { get; } = 0x8300;
  20. /// <summary>
  21. /// 文本信息下发
  22. /// </summary>
  23. public override string Description => "文本信息下发";
  24. /// <summary>
  25. /// 文本信息标志位含义见 表 38
  26. /// </summary>
  27. public byte TextFlag { get; set; }
  28. /// <summary>
  29. /// 文本类型
  30. /// 1=通知,2=服务
  31. /// 2019版本
  32. /// </summary>
  33. public byte TextType { get; set; }
  34. /// <summary>
  35. /// 文本信息
  36. /// 最长为 1024 字节,经GBK编码
  37. /// </summary>
  38. public string TextInfo { get; set; }
  39. /// <summary>
  40. ///
  41. /// </summary>
  42. /// <param name="reader"></param>
  43. /// <param name="config"></param>
  44. /// <returns></returns>
  45. public JT808_0x8300 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  46. {
  47. JT808_0x8300 jT808_0X8300 = new JT808_0x8300();
  48. jT808_0X8300.TextFlag = reader.ReadByte();
  49. if(reader.Version== JT808Version.JTT2019)
  50. {
  51. jT808_0X8300.TextType = reader.ReadByte();
  52. }
  53. jT808_0X8300.TextInfo = reader.ReadRemainStringContent();
  54. return jT808_0X8300;
  55. }
  56. /// <summary>
  57. ///
  58. /// </summary>
  59. /// <param name="writer"></param>
  60. /// <param name="value"></param>
  61. /// <param name="config"></param>
  62. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8300 value, IJT808Config config)
  63. {
  64. writer.WriteByte(value.TextFlag);
  65. if (writer.Version == JT808Version.JTT2019)
  66. {
  67. writer.WriteByte(value.TextType);
  68. }
  69. writer.WriteString(value.TextInfo);
  70. }
  71. /// <summary>
  72. ///
  73. /// </summary>
  74. /// <param name="reader"></param>
  75. /// <param name="writer"></param>
  76. /// <param name="config"></param>
  77. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  78. {
  79. JT808_0x8300 value = new JT808_0x8300();
  80. value.TextFlag = reader.ReadByte();
  81. writer.WriteNumber($"[{ value.TextFlag.ReadNumber()}]文本信息标志位", value.TextFlag);
  82. ReadOnlySpan<char> textFlagBits =string.Join("",Convert.ToString(value.TextFlag, 2).PadLeft(8, '0').Reverse()).AsSpan();
  83. if (reader.Version == JT808Version.JTT2019)
  84. {
  85. writer.WriteStartObject($"文本信息标志对象[{textFlagBits.ToString()}]");
  86. writer.WriteString($"[bit6~-bit7]保留", textFlagBits.Slice(6, 2).ToString());
  87. writer.WriteString($"[bit5]{textFlagBits[5]}", textFlagBits[5] == '0' ? "中心导航信息" : "CAN故障码信息");
  88. writer.WriteString($"[bit4]{textFlagBits[4]}", "-");
  89. writer.WriteString($"[bit3]{textFlagBits[3]}", "终端TTS播读");
  90. writer.WriteString($"[bit2]{textFlagBits[2]}", "终端显示器显示");
  91. var bit0And1= textFlagBits.Slice(0, 2).ToString().Reverse();
  92. switch (bit0And1)
  93. {
  94. case "01":
  95. writer.WriteString($"[bit0~1]{textFlagBits[0]}", "服务");
  96. break;
  97. case "10":
  98. writer.WriteString($"[bit0~1]{textFlagBits[0]}", "紧急");
  99. break;
  100. case "11":
  101. writer.WriteString($"[bit0~1]{textFlagBits[0]}", "通知");
  102. break;
  103. case "00":
  104. writer.WriteString($"[bit0~1]{textFlagBits[0]}", "保留");
  105. break;
  106. }
  107. writer.WriteEndObject();
  108. value.TextType = reader.ReadByte();
  109. if (value.TextType == 1)
  110. {
  111. writer.WriteNumber($"[{ value.TextType.ReadNumber()}]文本类型-通知", value.TextType);
  112. }
  113. else if (value.TextType == 2)
  114. {
  115. writer.WriteNumber($"[{ value.TextType.ReadNumber()}]文本类型-服务", value.TextType);
  116. }
  117. else {
  118. writer.WriteNumber($"[{ value.TextType.ReadNumber()}]文本类型-未设置", value.TextType);
  119. }
  120. }
  121. else
  122. {
  123. writer.WriteStartObject($"文本信息标志对象[{textFlagBits.ToString()}]");
  124. writer.WriteString($"[bit6~-bit7]保留", textFlagBits.Slice(6, 2).ToString());
  125. writer.WriteString($"[bit5]{textFlagBits[5]}", textFlagBits[5] == '0' ? "中心导航信息" : "CAN故障码信息");
  126. writer.WriteString($"[bit4]{textFlagBits[4]}", "广告屏显示");
  127. writer.WriteString($"[bit3]{textFlagBits[3]}", "终端TTS播读");
  128. writer.WriteString($"[bit2]{textFlagBits[2]}", "终端显示器显示");
  129. writer.WriteString($"[bit1]{textFlagBits[1]}", "保留");
  130. writer.WriteString($"[bit0]{textFlagBits[0]}", "紧急");
  131. writer.WriteEndObject();
  132. }
  133. var txtBuffer = reader.ReadVirtualArray(reader.ReadCurrentRemainContentLength()).ToArray();
  134. value.TextInfo = reader.ReadRemainStringContent();
  135. writer.WriteString($"[{txtBuffer.ToHexString()}]答案内容", value.TextInfo);
  136. }
  137. }
  138. }