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

149 行
5.3 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.Linq;
  8. using System.Text.Json;
  9. namespace JT808.Protocol.MessageBody
  10. {
  11. /// <summary>
  12. /// 设置终端参数
  13. /// </summary>
  14. public class JT808_0x8103 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x8103>, IJT808Analyze
  15. {
  16. /// <summary>
  17. /// 0x8103
  18. /// </summary>
  19. public override ushort MsgId { get; } = 0x8103;
  20. /// <summary>
  21. /// 设置终端参数
  22. /// </summary>
  23. public override string Description => "设置终端参数";
  24. /// <summary>
  25. /// 参数总数
  26. /// </summary>
  27. internal byte ParamCount
  28. {
  29. get
  30. {
  31. if (CustomParamList != null)
  32. {
  33. return (byte)(ParamList.Count + CustomParamList.Count);
  34. }
  35. return (byte)(ParamList.Count);
  36. }
  37. }
  38. /// <summary>
  39. /// 参数列表
  40. /// </summary>
  41. public List<JT808_0x8103_BodyBase> ParamList { get; set; }
  42. /// <summary>
  43. /// 自定义参数列表
  44. /// </summary>
  45. public List<JT808_0x8103_CustomBodyBase> CustomParamList { get; set; }
  46. /// <summary>
  47. ///
  48. /// </summary>
  49. /// <param name="reader"></param>
  50. /// <param name="config"></param>
  51. /// <returns></returns>
  52. public JT808_0x8103 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  53. {
  54. JT808_0x8103 value = new JT808_0x8103
  55. {
  56. ParamList = new List<JT808_0x8103_BodyBase>(),
  57. CustomParamList = new List<JT808_0x8103_CustomBodyBase>()
  58. };
  59. var paramCount = reader.ReadByte();//参数总数
  60. try
  61. {
  62. for (int i = 0; i < paramCount; i++)
  63. {
  64. var paramId = reader.ReadVirtualUInt32();//参数ID
  65. if (config.JT808_0X8103_Factory.Map.TryGetValue(paramId, out object instance))
  66. {
  67. dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(instance, ref reader, config);
  68. value.ParamList.Add(attachImpl);
  69. }
  70. else if (config.JT808_0X8103_Custom_Factory.Map.TryGetValue(paramId, out object customInstance))
  71. {
  72. dynamic attachImpl = JT808MessagePackFormatterResolverExtensions.JT808DynamicDeserialize(customInstance, ref reader, config);
  73. value.CustomParamList.Add(attachImpl);
  74. }
  75. }
  76. }
  77. catch (Exception ex)
  78. {
  79. }
  80. return value;
  81. }
  82. /// <summary>
  83. ///
  84. /// </summary>
  85. /// <param name="writer"></param>
  86. /// <param name="value"></param>
  87. /// <param name="config"></param>
  88. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103 value, IJT808Config config)
  89. {
  90. writer.WriteByte(value.ParamCount);
  91. try
  92. {
  93. foreach (var item in value.ParamList)
  94. {
  95. JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config);
  96. }
  97. if (value.CustomParamList != null)
  98. {
  99. foreach (var item in value.CustomParamList)
  100. {
  101. JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(item, ref writer, item, config);
  102. }
  103. }
  104. }
  105. catch (Exception ex) { }
  106. }
  107. /// <summary>
  108. ///
  109. /// </summary>
  110. /// <param name="reader"></param>
  111. /// <param name="writer"></param>
  112. /// <param name="config"></param>
  113. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  114. {
  115. var paramCount = reader.ReadByte();//参数总数
  116. writer.WriteNumber($"[{paramCount.ReadNumber()}]参数总数", paramCount);
  117. try
  118. {
  119. writer.WriteStartArray("参数项");
  120. for (int i = 0; i < paramCount; i++)
  121. {
  122. var paramId = reader.ReadVirtualUInt32();//参数ID
  123. if (config.JT808_0X8103_Factory.Map.TryGetValue(paramId, out object instance))
  124. {
  125. writer.WriteStartObject();
  126. instance.Analyze(ref reader, writer, config);
  127. writer.WriteEndObject();
  128. }
  129. else if (config.JT808_0X8103_Custom_Factory.Map.TryGetValue(paramId, out object customInstance))
  130. {
  131. writer.WriteStartObject();
  132. customInstance.Analyze(ref reader, writer, config);
  133. writer.WriteEndObject();
  134. }
  135. }
  136. writer.WriteEndArray();
  137. }
  138. catch (Exception ex)
  139. {
  140. writer.WriteString($"异常信息", ex.StackTrace);
  141. }
  142. }
  143. }
  144. }