Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

83 Zeilen
2.6 KiB

  1. using JT808.Protocol.Attributes;
  2. using JT808.Protocol.Enums;
  3. using JT808.Protocol.Formatters;
  4. using System;
  5. namespace JT808.Protocol
  6. {
  7. public struct JT808HeaderMessageBodyProperty
  8. {
  9. public JT808HeaderMessageBodyProperty(int dataLength,bool isPackage, JT808EncryptMethod jT808EncryptMethod= JT808EncryptMethod.None)
  10. {
  11. IsPackage = isPackage;
  12. Encrypt = jT808EncryptMethod;
  13. DataLength = dataLength;
  14. }
  15. public JT808HeaderMessageBodyProperty(ushort value)
  16. {
  17. IsPackage = (value >> 13) == 1;
  18. switch ((value & 0x400) >> 10)
  19. {
  20. case 0:
  21. Encrypt = JT808EncryptMethod.None;
  22. break;
  23. case 1:
  24. Encrypt = JT808EncryptMethod.RSA;
  25. break;
  26. default:
  27. Encrypt = JT808EncryptMethod.None;
  28. break;
  29. }
  30. DataLength = value & 0x3FF;
  31. }
  32. /// <summary>
  33. /// 是否分包
  34. /// true-1 表示消息体为长消息,进行分包发送处理
  35. /// false-0 消息头中无消息包封装项字段。
  36. /// </summary>
  37. public bool IsPackage { get; set; }
  38. /// <summary>
  39. /// 加密标识,0为不加密
  40. /// 当此三位都为 0,表示消息体不加密;
  41. /// 当第 10 位为 1,表示消息体经过 RSA 算法加密;
  42. /// todo:没有涉及到加密先不考虑
  43. /// </summary>
  44. public JT808EncryptMethod Encrypt { get; set; }
  45. /// <summary>
  46. /// 消息体长度
  47. /// </summary>
  48. public int DataLength { get; set; }
  49. public ushort Wrap()
  50. {
  51. // 1.是否分包
  52. int tmpIsPacke = 0;
  53. // 2.是否加密
  54. int tmpEncrypt = 0;
  55. if (IsPackage)
  56. {
  57. tmpIsPacke = 1 << 13;
  58. }
  59. // 2.3.数据加密方式
  60. switch (Encrypt)
  61. {
  62. case JT808EncryptMethod.None:
  63. tmpEncrypt = 0;
  64. break;
  65. case JT808EncryptMethod.RSA:
  66. tmpEncrypt=1 << 10;
  67. break;
  68. default:
  69. tmpEncrypt = 0;
  70. break;
  71. }
  72. // 2.4.数据长度
  73. if (DataLength <= 0)
  74. {
  75. // 判断有无数据体长度
  76. DataLength = 0;
  77. }
  78. return (ushort)(tmpIsPacke | tmpEncrypt | DataLength);
  79. }
  80. }
  81. }