25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
3.3 KiB

  1. using JT808.Protocol.Formatters;
  2. using JT808.Protocol.Interfaces;
  3. using JT808.Protocol.MessagePack;
  4. using JT808.Protocol.Extensions;
  5. using System.Text.Json;
  6. using JT808.Protocol.Enums;
  7. namespace JT808.Protocol.MessageBody
  8. {
  9. /// <summary>
  10. /// 终端补传分包请求
  11. /// 2019版本
  12. /// </summary>
  13. public class JT808_0x0005 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0005>, IJT808_2019_Version, IJT808Analyze
  14. {
  15. public override ushort MsgId { get; } = 0x0005;
  16. public override string Description => "终端补传分包请求";
  17. /// <summary>
  18. /// 原始消息流水号
  19. /// 对应要求补传的原始消息第一包的消息流水号
  20. /// </summary>
  21. public ushort OriginalMsgNum { get; set; }
  22. /// <summary>
  23. /// 重传包总数
  24. /// n
  25. /// </summary>
  26. public ushort AgainPackageCount { get; set; }
  27. /// <summary>
  28. /// 重传包 ID 列表
  29. /// BYTE[2*n]
  30. /// 重传包序号顺序排列,如“包 ID1 包 ID2......包 IDn”。
  31. /// </summary>
  32. public byte[] AgainPackageData { get; set; }
  33. public JT808_0x0005 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  34. {
  35. JT808_0x0005 value = new JT808_0x0005();
  36. value.OriginalMsgNum = reader.ReadUInt16();
  37. if(reader.Version== JT808Version.JTT2013)
  38. {
  39. value.AgainPackageCount = reader.ReadByte();
  40. }
  41. else
  42. {
  43. value.AgainPackageCount = reader.ReadUInt16();
  44. }
  45. value.AgainPackageData = reader.ReadArray(value.AgainPackageCount * 2).ToArray();
  46. return value;
  47. }
  48. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0005 value, IJT808Config config)
  49. {
  50. writer.WriteUInt16(value.OriginalMsgNum);
  51. if(writer.Version== JT808Version.JTT2013)
  52. {
  53. writer.WriteByte((byte)(value.AgainPackageData.Length / 2));
  54. }
  55. else
  56. {
  57. writer.WriteUInt16((ushort)(value.AgainPackageData.Length / 2));
  58. }
  59. writer.WriteArray(value.AgainPackageData);
  60. }
  61. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  62. {
  63. var originalMsgNum = reader.ReadUInt16();
  64. ushort againPackageCount;
  65. if (reader.Version == JT808Version.JTT2013)
  66. {
  67. againPackageCount = reader.ReadByte();
  68. }
  69. else
  70. {
  71. againPackageCount = reader.ReadUInt16();
  72. }
  73. var againPackageData = reader.ReadArray(againPackageCount * 2);
  74. writer.WriteNumber($"[{originalMsgNum.ReadNumber()}]原始消息流水号", originalMsgNum);
  75. writer.WriteNumber($"[{againPackageCount.ReadNumber()}]重传包总数", againPackageCount);
  76. writer.WriteString("重传包ID", string.Join(",", againPackageData.ToArray()));
  77. writer.WriteStartArray("重传包ID列表");
  78. for (var i=0;i< againPackageCount; i++)
  79. {
  80. writer.WriteStringValue(string.Join(",",againPackageData.Slice(i*2,2).ToArray()));
  81. }
  82. writer.WriteEndArray();
  83. }
  84. }
  85. }