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

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