Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

122 rader
5.0 KiB

  1. using JT808.Protocol.Exceptions;
  2. using JT808.Protocol.Extensions;
  3. using JT808.Protocol.Formatters;
  4. using JT808.Protocol.Interfaces;
  5. using JT808.Protocol.MessagePack;
  6. using JT808.Protocol.Metadata;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text.Json;
  10. namespace JT808.Protocol.MessageBody
  11. {
  12. /// <summary>
  13. /// CAN 总线数据上传
  14. /// 0x0705
  15. /// </summary>
  16. public class JT808_0x0705 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0705>, IJT808Analyze, IJT808_2019_Version
  17. {
  18. /// <summary>
  19. /// 0x0705
  20. /// </summary>
  21. public override ushort MsgId { get; } = 0x0705;
  22. /// <summary>
  23. /// CAN总线数据上传
  24. /// </summary>
  25. public override string Description => "CAN总线数据上传";
  26. /// <summary>
  27. /// 数据项个数
  28. /// 包含的 CAN 总线数据项个数,>0
  29. /// </summary>
  30. public ushort CanItemCount { get; set; }
  31. /// <summary>
  32. /// CAN 总线数据接收时间
  33. /// 第 1 条 CAN 总线数据的接收时间,hh-mm-ss-msms
  34. /// </summary>
  35. public DateTime FirstCanReceiveTime { get; set; }
  36. /// <summary>
  37. /// CAN 总线数据项
  38. /// </summary>
  39. public List<JT808CanProperty> CanItems { get; set; }
  40. /// <summary>
  41. ///
  42. /// </summary>
  43. /// <param name="reader"></param>
  44. /// <param name="writer"></param>
  45. /// <param name="config"></param>
  46. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  47. {
  48. JT808_0x0705 value = new JT808_0x0705();
  49. value.CanItemCount = reader.ReadUInt16();
  50. writer.WriteNumber($"[{value.CanItemCount.ReadNumber()}]数据项个数", value.CanItemCount);
  51. var dateTimeBuffer = reader.ReadVirtualArray(5).ToArray();
  52. value.FirstCanReceiveTime = reader.ReadDateTime5();
  53. writer.WriteString($"[{dateTimeBuffer.ToHexString()}]CAN总线数据接收时间", value.FirstCanReceiveTime.ToString("HH-mm-ss:fff"));
  54. writer.WriteStartArray("CAN总线数据项");
  55. for (var i = 0; i < value.CanItemCount; i++)
  56. {
  57. writer.WriteStartObject();
  58. JT808CanProperty jT808CanProperty = new JT808CanProperty();
  59. jT808CanProperty.CanId = reader.ReadUInt32();
  60. writer.WriteNumber($"[{ jT808CanProperty.CanId.ReadNumber()}]CAN_ID", jT808CanProperty.CanId);
  61. jT808CanProperty.CanData = reader.ReadArray(8).ToArray();
  62. writer.WriteString($"CAN_数据", jT808CanProperty.CanData.ToHexString());
  63. if (jT808CanProperty.CanData.Length != 8)
  64. {
  65. throw new JT808Exception(Enums.JT808ErrorCode.NotEnoughLength, $"{nameof(jT808CanProperty.CanData)}->8");
  66. }
  67. writer.WriteEndObject();
  68. }
  69. writer.WriteEndArray();
  70. }
  71. /// <summary>
  72. ///
  73. /// </summary>
  74. /// <param name="reader"></param>
  75. /// <param name="config"></param>
  76. /// <returns></returns>
  77. public JT808_0x0705 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  78. {
  79. JT808_0x0705 value = new JT808_0x0705();
  80. value.CanItemCount = reader.ReadUInt16();
  81. value.FirstCanReceiveTime = reader.ReadDateTime5();
  82. value.CanItems = new List<JT808CanProperty>();
  83. for (var i = 0; i < value.CanItemCount; i++)
  84. {
  85. JT808CanProperty jT808CanProperty = new JT808CanProperty();
  86. jT808CanProperty.CanId = reader.ReadUInt32();
  87. jT808CanProperty.CanData = reader.ReadArray(8).ToArray();
  88. if (jT808CanProperty.CanData.Length != 8)
  89. {
  90. throw new JT808Exception(Enums.JT808ErrorCode.NotEnoughLength, $"{nameof(jT808CanProperty.CanData)}->8");
  91. }
  92. value.CanItems.Add(jT808CanProperty);
  93. }
  94. return value;
  95. }
  96. /// <summary>
  97. ///
  98. /// </summary>
  99. /// <param name="writer"></param>
  100. /// <param name="value"></param>
  101. /// <param name="config"></param>
  102. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0705 value, IJT808Config config)
  103. {
  104. if (value.CanItems != null && value.CanItems.Count > 0)
  105. {
  106. writer.WriteUInt16((ushort)value.CanItems.Count);
  107. writer.WriteDateTime5(value.FirstCanReceiveTime);
  108. foreach (var item in value.CanItems)
  109. {
  110. writer.WriteUInt32(item.CanId);
  111. if (item.CanData.Length != 8)
  112. {
  113. throw new JT808Exception(Enums.JT808ErrorCode.NotEnoughLength, $"{nameof(item.CanData)}->8");
  114. }
  115. writer.WriteArray(item.CanData);
  116. }
  117. }
  118. }
  119. }
  120. }