You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
3.0 KiB

  1. using JT809.Protocol.Attributes;
  2. using JT809.Protocol.Enums;
  3. using JT809.Protocol.Exceptions;
  4. using JT809.Protocol.Extensions;
  5. using JT809.Protocol.Interfaces;
  6. using JT809.Protocol.MessagePack;
  7. using System;
  8. namespace JT809.Protocol.Formatters
  9. {
  10. public class JT809HeaderPackageFormatter : IJT809MessagePackFormatter<JT809HeaderPackage>
  11. {
  12. public readonly static JT809HeaderPackageFormatter Instance = new JT809HeaderPackageFormatter();
  13. public JT809HeaderPackage Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
  14. {
  15. // 1. 验证校验码
  16. if (!config.SkipCRCCode)
  17. {
  18. // 1.2. 验证校验码
  19. if (!reader.CheckXorCodeVali)
  20. {
  21. throw new JT809Exception(JT809ErrorCode.CRC16CheckInvalid, $"{reader.CalculateCheckXorCode.ToString()}!={reader.RealCheckXorCode.ToString()}");
  22. }
  23. }
  24. JT809HeaderPackage jT809Package = new JT809HeaderPackage();
  25. // 2.读取起始头
  26. jT809Package.BeginFlag = reader.ReadStart();
  27. // 3.初始化消息头
  28. try
  29. {
  30. jT809Package.Header = JT809HeaderFormatter.Instance.Deserialize(ref reader, config);
  31. }
  32. catch (Exception ex)
  33. {
  34. throw new JT809Exception(JT809ErrorCode.HeaderParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex);
  35. }
  36. // 5.数据体处理
  37. // 5.1 判断是否有数据体(总长度-固定长度)> 0
  38. if ((jT809Package.Header.MsgLength - JT809Package.FixedByteLength) > 0)
  39. {
  40. try
  41. {
  42. // 5.2 是否加密
  43. switch (jT809Package.Header.EncryptFlag)
  44. {
  45. case JT809Header_Encrypt.None:
  46. // 5.3 处理消息体
  47. jT809Package.Bodies = reader.ReadContent().ToArray();
  48. break;
  49. case JT809Header_Encrypt.Common:
  50. // 5.4. 处理加密消息体
  51. byte[] bodiesData = config.Encrypt.Decrypt(reader.ReadContent(), config.EncryptOptions, jT809Package.Header.EncryptKey);
  52. jT809Package.Bodies = bodiesData;
  53. break;
  54. }
  55. }
  56. catch (Exception ex)
  57. {
  58. throw new JT809Exception(JT809ErrorCode.BodiesParseError, $"offset>{reader.ReadCurrentRemainContentLength().ToString()}", ex);
  59. }
  60. }
  61. jT809Package.CRCCode = reader.CalculateCheckXorCode;
  62. jT809Package.EndFlag = reader.ReadEnd();
  63. return jT809Package;
  64. }
  65. public void Serialize(ref JT809MessagePackWriter writer, JT809HeaderPackage value, IJT809Config config)
  66. {
  67. throw new NotImplementedException("只适用反序列化");
  68. }
  69. }
  70. }