選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

157 行
5.7 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
  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 { }
  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. if(instance is IJT808Description description)
  127. {
  128. writer.WriteString("参数名称", description.Description);
  129. }
  130. instance.Analyze(ref reader, writer, config);
  131. writer.WriteEndObject();
  132. }
  133. else if (config.JT808_0X8103_Custom_Factory.Map.TryGetValue(paramId, out object customInstance))
  134. {
  135. writer.WriteStartObject();
  136. if (customInstance is IJT808Description description)
  137. {
  138. writer.WriteString("自定义参数名称", description.Description);
  139. }
  140. customInstance.Analyze(ref reader, writer, config);
  141. writer.WriteEndObject();
  142. }
  143. }
  144. writer.WriteEndArray();
  145. }
  146. catch (Exception ex)
  147. {
  148. writer.WriteString($"异常信息", ex.StackTrace);
  149. }
  150. }
  151. }
  152. }