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

58 行
2.4 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.Text.Json;
  7. namespace JT808.Protocol.MessageBody
  8. {
  9. /// <summary>
  10. /// 电子运单上报
  11. /// 0x0701
  12. /// </summary>
  13. public class JT808_0x0701 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0701>, IJT808Analyze
  14. {
  15. public override ushort MsgId { get; } = 0x0701;
  16. public override string Description => "电子运单上报";
  17. /// <summary>
  18. /// 电子运单长度
  19. /// </summary>
  20. public uint ElectronicWaybillLength { get; set; }
  21. public byte[] ElectronicContent { get; set; }
  22. /// <summary>
  23. /// 电子运单内容
  24. /// 注意:需要具体的实现
  25. /// </summary>
  26. public JT808_0x0701_CustomBodyBase ElectronicContentObj { get; set; }
  27. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  28. {
  29. JT808_0x0701 value = new JT808_0x0701();
  30. value.ElectronicWaybillLength = reader.ReadUInt32();
  31. writer.WriteNumber($"[{value.ElectronicWaybillLength.ReadNumber()}]电子运单长度", value.ElectronicWaybillLength);
  32. value.ElectronicContent = reader.ReadArray((int)value.ElectronicWaybillLength).ToArray();
  33. writer.WriteString($"电子运单", value.ElectronicContent.ToHexString());
  34. }
  35. public JT808_0x0701 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  36. {
  37. JT808_0x0701 value = new JT808_0x0701();
  38. value.ElectronicWaybillLength = reader.ReadUInt32();
  39. value.ElectronicContent = reader.ReadArray((int)value.ElectronicWaybillLength).ToArray();
  40. return value;
  41. }
  42. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0701 value, IJT808Config config)
  43. {
  44. writer.Skip(4, out int skipPosition);
  45. object obj = config.GetMessagePackFormatterByType(value.ElectronicContentObj.GetType());
  46. JT808MessagePackFormatterResolverExtensions.JT808DynamicSerialize(obj, ref writer, value.ElectronicContentObj, config);
  47. int contentLength = writer.GetCurrentPosition() - skipPosition - 4;
  48. writer.WriteInt32Return(contentLength, skipPosition);
  49. }
  50. }
  51. }