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.

179 line
8.9 KiB

  1. using JT808.Protocol.Enums;
  2. using JT808.Protocol.Formatters;
  3. using JT808.Protocol.Interfaces;
  4. using JT808.Protocol.MessagePack;
  5. using JT808.Protocol.Extensions;
  6. using System;
  7. using System.Text.Json;
  8. namespace JT808.Protocol.MessageBody
  9. {
  10. /// <summary>
  11. /// 驾驶员身份信息采集上报
  12. /// </summary>
  13. public class JT808_0x0702 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x0702>, IJT808Analyze, IJT808_2019_Version
  14. {
  15. /// <summary>
  16. /// 0x0702
  17. /// </summary>
  18. public override ushort MsgId { get; } = 0x0702;
  19. /// <summary>
  20. /// Description
  21. /// </summary>
  22. public override string Description => "驾驶员身份信息采集上报";
  23. /// <summary>
  24. /// 状态
  25. /// 0x01:从业资格证 IC 卡插入(驾驶员上班);
  26. /// 0x02:从业资格证 IC 卡拔出(驾驶员下班)。
  27. /// </summary>
  28. public JT808ICCardStatus IC_Card_Status { get; set; }
  29. /// <summary>
  30. /// 插卡/拔卡时间,YY-MM-DD-hh-mm-ss;
  31. /// 以下字段在状态为 0x01 时才有效并做填充。
  32. /// BCD[6]
  33. /// </summary>
  34. public DateTime IC_Card_PlugDateTime { get; set; }
  35. /// <summary>
  36. /// IC 卡读取结果
  37. /// 0x00:IC 卡读卡成功;
  38. /// 0x01:读卡失败,原因为卡片密钥认证未通过;
  39. /// 0x02:读卡失败,原因为卡片已被锁定;
  40. /// 0x03:读卡失败,原因为卡片被拔出;
  41. /// 0x04:读卡失败,原因为数据校验错误。
  42. /// 以下字段在 IC 卡读取结果等于 0x00 时才有效。
  43. /// </summary>
  44. public JT808ICCardReadResult IC_Card_ReadResult { get; set; }
  45. /// <summary>
  46. /// 驾驶员姓名长度
  47. /// </summary>
  48. public byte DriverUserNameLength { get; set; }
  49. /// <summary>
  50. /// 驾驶员姓名
  51. /// </summary>
  52. public string DriverUserName { get; set; }
  53. /// <summary>
  54. /// 从业资格证编码
  55. /// 长度 20 位,不足补 0x00。
  56. /// </summary>
  57. public string QualificationCode { get; set; }
  58. /// <summary>
  59. /// 发证机构名称长度
  60. /// </summary>
  61. public byte LicenseIssuingLength { get; set; }
  62. /// <summary>
  63. /// 发证机构名称
  64. /// </summary>
  65. public string LicenseIssuing { get; set; }
  66. /// <summary>
  67. /// 证件有效期 BCD[4]
  68. /// </summary>
  69. public DateTime CertificateExpiresDate { get; set; }
  70. /// <summary>
  71. /// 驾驶员身份证号 长度20 不足补0
  72. /// 2019版本
  73. /// </summary>
  74. public string DriverIdentityCard { get; set; }
  75. /// <summary>
  76. ///
  77. /// </summary>
  78. /// <param name="reader"></param>
  79. /// <param name="writer"></param>
  80. /// <param name="config"></param>
  81. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  82. {
  83. JT808_0x0702 value = new JT808_0x0702();
  84. value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
  85. writer.WriteNumber($"[{((byte)value.IC_Card_Status).ReadNumber()}]状态-{value.IC_Card_Status.ToString()}", (byte)value.IC_Card_Status);
  86. value.IC_Card_PlugDateTime = reader.ReadDateTime6();
  87. writer.WriteString($"[{value.IC_Card_PlugDateTime.ToString("yyMMddHHmmss")}]插拔卡时间", value.IC_Card_PlugDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
  88. if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
  89. {
  90. value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte();
  91. writer.WriteNumber($"[{((byte)value.IC_Card_ReadResult).ReadNumber()}]IC卡读取结果-{value.IC_Card_ReadResult.ToString()}", (byte)value.IC_Card_ReadResult);
  92. if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
  93. {
  94. value.DriverUserNameLength = reader.ReadByte();
  95. writer.WriteNumber($"[{value.DriverUserNameLength.ReadNumber()}]驾驶员姓名长度", value.DriverUserNameLength);
  96. var driverUserNameBuffer= reader.ReadVirtualArray(value.DriverUserNameLength);
  97. value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
  98. writer.WriteString($"[{driverUserNameBuffer.ToArray().ToHexString()}]驾驶员姓名", value.DriverUserName);
  99. var qualificationCodeBuffer = reader.ReadVirtualArray(20);
  100. value.QualificationCode = reader.ReadString(20);
  101. writer.WriteString($"[{qualificationCodeBuffer.ToArray().ToHexString()}]从业资格证编码", value.QualificationCode);
  102. value.LicenseIssuingLength = reader.ReadByte();
  103. writer.WriteNumber($"[{value.LicenseIssuingLength.ReadNumber()}]发证机构名称长度", value.LicenseIssuingLength);
  104. var licenseIssuingLengtheBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength);
  105. value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
  106. writer.WriteString($"[{licenseIssuingLengtheBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing);
  107. value.CertificateExpiresDate = reader.ReadDateTime4();
  108. writer.WriteString($"[{value.CertificateExpiresDate.ToString("yyMMdd")}]插拔卡时间", value.CertificateExpiresDate.ToString("yyyy-MM-dd"));
  109. if (reader.Version == JT808Version.JTT2019)
  110. {
  111. var driverIdentityCardBuffer = reader.ReadVirtualArray(20);
  112. value.DriverIdentityCard = reader.ReadString(20);
  113. writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard);
  114. }
  115. }
  116. }
  117. }
  118. /// <summary>
  119. ///
  120. /// </summary>
  121. /// <param name="reader"></param>
  122. /// <param name="config"></param>
  123. /// <returns></returns>
  124. public JT808_0x0702 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  125. {
  126. JT808_0x0702 value = new JT808_0x0702();
  127. value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
  128. value.IC_Card_PlugDateTime = reader.ReadDateTime6();
  129. if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
  130. {
  131. value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte();
  132. if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
  133. {
  134. value.DriverUserNameLength = reader.ReadByte();
  135. value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
  136. value.QualificationCode = reader.ReadString(20);
  137. value.LicenseIssuingLength = reader.ReadByte();
  138. value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
  139. value.CertificateExpiresDate = reader.ReadDateTime4();
  140. if(reader.Version== JT808Version.JTT2019)
  141. {
  142. value.DriverIdentityCard = reader.ReadString(20);
  143. }
  144. }
  145. }
  146. return value;
  147. }
  148. /// <summary>
  149. ///
  150. /// </summary>
  151. /// <param name="writer"></param>
  152. /// <param name="value"></param>
  153. /// <param name="config"></param>
  154. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0702 value, IJT808Config config)
  155. {
  156. writer.WriteByte((byte)value.IC_Card_Status);
  157. writer.WriteDateTime6(value.IC_Card_PlugDateTime);
  158. if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
  159. {
  160. writer.WriteByte((byte)value.IC_Card_ReadResult);
  161. if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
  162. {
  163. writer.WriteByte((byte)value.DriverUserName.Length);
  164. writer.WriteString(value.DriverUserName);
  165. writer.WriteString(value.QualificationCode.PadRight(20, '\0').ValiString(nameof(value.QualificationCode),20));
  166. writer.WriteByte((byte)value.LicenseIssuing.Length);
  167. writer.WriteString(value.LicenseIssuing);
  168. writer.WriteDateTime4(value.CertificateExpiresDate);
  169. if (writer.Version == JT808Version.JTT2019)
  170. {
  171. writer.WriteString(value.DriverIdentityCard.PadRight(20,'\0').ValiString(nameof(value.DriverIdentityCard), 20));
  172. }
  173. }
  174. }
  175. }
  176. }
  177. }