Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

91 строка
3.4 KiB

  1. using JT808.Protocol.Attributes;
  2. using JT808.Protocol.Enums;
  3. using JT808.Protocol.Exceptions;
  4. using JT808.Protocol.Formatters;
  5. using JT808.Protocol.MessagePack;
  6. using System;
  7. namespace JT808.Protocol
  8. {
  9. /// <summary>
  10. /// JT808头部数据包
  11. /// </summary>
  12. public class JT808HeaderPackage: IJT808MessagePackFormatter<JT808HeaderPackage>
  13. {
  14. /// <summary>
  15. /// 起始符
  16. /// </summary>
  17. public byte Begin { get; set; }
  18. /// <summary>
  19. /// 头数据
  20. /// </summary>
  21. public JT808Header Header { get; set; }
  22. /// <summary>
  23. /// 数据体
  24. /// </summary>
  25. public byte[] Bodies { get; set; }
  26. /// <summary>
  27. /// 校验码
  28. /// 从消息头开始,同后一字节异或,直到校验码前一个字节,占用一个字节。
  29. /// </summary>
  30. public byte CheckCode { get; set; }
  31. /// <summary>
  32. /// 终止符
  33. /// </summary>
  34. public byte End { get; set; }
  35. public JT808HeaderPackage Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  36. {
  37. // 1. 验证校验和
  38. if (!config.SkipCRCCode)
  39. {
  40. if (!reader.CheckXorCodeVali)
  41. {
  42. throw new JT808Exception(JT808ErrorCode.CheckCodeNotEqual, $"{reader.RealCheckXorCode}!={reader.CalculateCheckXorCode}");
  43. }
  44. }
  45. JT808HeaderPackage jT808Package = new JT808HeaderPackage();
  46. // ---------------开始解包--------------
  47. // 2.读取起始位置
  48. jT808Package.Begin = reader.ReadStart();
  49. // 3.读取头部信息
  50. jT808Package.Header = new JT808Header();
  51. // 3.1.读取消息Id
  52. jT808Package.Header.MsgId = reader.ReadUInt16();
  53. // 3.2.读取消息体属性
  54. ushort messageBodyPropertyValue = reader.ReadUInt16();
  55. // 3.2.1.解包消息体属性
  56. jT808Package.Header.MessageBodyProperty = new JT808HeaderMessageBodyProperty(messageBodyPropertyValue);
  57. // 3.3.读取终端手机号
  58. jT808Package.Header.TerminalPhoneNo = reader.ReadBCD(config.TerminalPhoneNoLength, config.Trim);
  59. // 3.4.读取消息流水号
  60. jT808Package.Header.MsgNum = reader.ReadUInt16();
  61. // 3.5.判断有无分包
  62. if (jT808Package.Header.MessageBodyProperty.IsPackage)
  63. {
  64. //3.5.1.读取消息包总数
  65. jT808Package.Header.PackgeCount = reader.ReadUInt16();
  66. //3.5.2.读取消息包序号
  67. jT808Package.Header.PackageIndex = reader.ReadUInt16();
  68. }
  69. // 4.处理数据体
  70. // 4.1.判断有无数据体
  71. if (jT808Package.Header.MessageBodyProperty.DataLength > 0)
  72. {
  73. jT808Package.Bodies = reader.ReadContent().ToArray();
  74. }
  75. // 5.读取校验码
  76. jT808Package.CheckCode = reader.ReadByte();
  77. // 6.读取终止位置
  78. jT808Package.End = reader.ReadEnd();
  79. // ---------------解包完成--------------
  80. return jT808Package;
  81. }
  82. public void Serialize(ref JT808MessagePackWriter writer, JT808HeaderPackage value, IJT808Config config)
  83. {
  84. throw new NotImplementedException("只适用反序列化");
  85. }
  86. }
  87. }