Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

65 wiersze
3.4 KiB

  1. using JT809.Protocol.JT809Attributes;
  2. using JT809.Protocol.JT809Enums;
  3. using JT809.Protocol.JT809Exceptions;
  4. using JT809.Protocol.JT809Extensions;
  5. using JT809.Protocol.JT809MessageBody;
  6. using System;
  7. using System.Buffers;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. namespace JT809.Protocol.JT809Formatters.JT809MessageBodyFormatters
  11. {
  12. public class JT809_0x9200Formatter : IJT809Formatter<JT809_0x9200>
  13. {
  14. public JT809_0x9200 Deserialize(ReadOnlySpan<byte> bytes, out int readSize)
  15. {
  16. int offset = 0;
  17. JT809_0x9200 jT809_0X9200 = new JT809_0x9200();
  18. jT809_0X9200.VehicleNo = JT809BinaryExtensions.ReadStringLittle(bytes, ref offset, 21);
  19. jT809_0X9200.VehicleColor = (JT809VehicleColorType)JT809BinaryExtensions.ReadByteLittle(bytes, ref offset);
  20. jT809_0X9200.SubBusinessType = (JT809SubBusinessType)JT809BinaryExtensions.ReadUInt16Little(bytes, ref offset);
  21. jT809_0X9200.DataLength = JT809BinaryExtensions.ReadUInt32Little(bytes, ref offset);
  22. //JT809.Protocol.JT809Enums.JT809BusinessType 映射对应消息特性
  23. JT809BodiesTypeAttribute jT809SubBodiesTypeAttribute = jT809_0X9200.SubBusinessType.GetAttribute<JT809BodiesTypeAttribute>();
  24. if (jT809SubBodiesTypeAttribute == null)
  25. {
  26. throw new JT809Exception(JT809ErrorCode.GetAttributeError, $"JT809BodiesTypeAttribute Not Found>{jT809_0X9200.SubBusinessType.ToString()}");
  27. }
  28. try
  29. {
  30. jT809_0X9200.JT809SubBodies = JT809FormatterResolverExtensions.JT809DynamicDeserialize(JT809FormatterExtensions.GetFormatter(jT809SubBodiesTypeAttribute.JT809BodiesType), bytes.Slice(offset, (int)jT809_0X9200.DataLength), out readSize);
  31. }
  32. catch
  33. {
  34. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{jT809_0X9200.SubBusinessType.ToString()}");
  35. }
  36. readSize = offset;
  37. return jT809_0X9200;
  38. }
  39. public int Serialize(IMemoryOwner<byte> memoryOwner, int offset, JT809_0x9200 value)
  40. {
  41. offset += JT809BinaryExtensions.WriteStringLittle(memoryOwner, offset, value.VehicleNo, 21);
  42. offset += JT809BinaryExtensions.WriteByteLittle(memoryOwner, offset, (byte)value.VehicleColor);
  43. offset += JT809BinaryExtensions.WriteUInt16Little(memoryOwner, offset, (ushort)value.SubBusinessType);
  44. offset += JT809BinaryExtensions.WriteUInt32Little(memoryOwner, offset, value.DataLength);
  45. //JT809.Protocol.JT809Enums.JT809BusinessType 映射对应消息特性
  46. JT809BodiesTypeAttribute jT809SubBodiesTypeAttribute = value.SubBusinessType.GetAttribute<JT809BodiesTypeAttribute>();
  47. if (jT809SubBodiesTypeAttribute == null)
  48. {
  49. throw new JT809Exception(JT809ErrorCode.GetAttributeError, $"JT809BodiesTypeAttribute Not Found>{value.SubBusinessType.ToString()}");
  50. }
  51. try
  52. {
  53. offset = JT809FormatterResolverExtensions.JT809DynamicSerialize(JT809FormatterExtensions.GetFormatter(jT809SubBodiesTypeAttribute.JT809BodiesType), memoryOwner, offset, value.JT809SubBodies);
  54. }
  55. catch
  56. {
  57. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  58. }
  59. return offset;
  60. }
  61. }
  62. }