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.

285 lines
16 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. /// 2011 长度40 位 ,不足补 '\0';
  56. /// 2013 长度 20 位,不足补 '\0'。
  57. /// </summary>
  58. public string QualificationCode { get; set; }
  59. /// <summary>
  60. /// 发证机构名称长度
  61. /// </summary>
  62. public byte LicenseIssuingLength { get; set; }
  63. /// <summary>
  64. /// 发证机构名称
  65. /// </summary>
  66. public string LicenseIssuing { get; set; }
  67. /// <summary>
  68. /// 证件有效期 BCD[4]
  69. /// </summary>
  70. public DateTime CertificateExpiresDate { get; set; }
  71. /// <summary>
  72. /// 驾驶员身份证号 长度20 不足补 '\0'
  73. /// 2011版本
  74. /// 2019版本
  75. /// </summary>
  76. public string DriverIdentityCard { get; set; }
  77. /// <summary>
  78. /// 人脸匹配度
  79. /// 身份证或从业资格证照片与人脸匹配度比例:0~100
  80. /// 2019版本
  81. /// </summary>
  82. public byte? FaceMatchValue { get; set; }
  83. /// <summary>
  84. /// 身份证 UID
  85. /// 长度 20 位,不足补0x00
  86. /// 2019版本
  87. /// </summary>
  88. public string UID { get; set; }
  89. /// <summary>
  90. ///
  91. /// </summary>
  92. /// <param name="reader"></param>
  93. /// <param name="writer"></param>
  94. /// <param name="config"></param>
  95. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  96. {
  97. JT808_0x0702 value = new JT808_0x0702();
  98. var firstByte = reader.ReadVirtualByte();
  99. //因2011第一个字节代表姓名长度 所以该值长度只能为 2,3,4,整个数据长度 62+m+n
  100. if (firstByte == 0x01)
  101. {
  102. value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
  103. writer.WriteNumber($"[{((byte)value.IC_Card_Status).ReadNumber()}]状态-{value.IC_Card_Status.ToString()}", (byte)value.IC_Card_Status);
  104. value.IC_Card_PlugDateTime = reader.ReadDateTime6();
  105. writer.WriteString($"[{value.IC_Card_PlugDateTime.ToString("yyMMddHHmmss")}]插拔卡时间", value.IC_Card_PlugDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
  106. if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
  107. {
  108. value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte();
  109. writer.WriteNumber($"[{((byte)value.IC_Card_ReadResult).ReadNumber()}]IC卡读取结果-{value.IC_Card_ReadResult.ToString()}", (byte)value.IC_Card_ReadResult);
  110. if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
  111. {
  112. value.DriverUserNameLength = reader.ReadByte();
  113. writer.WriteNumber($"[{value.DriverUserNameLength.ReadNumber()}]驾驶员姓名长度", value.DriverUserNameLength);
  114. var driverUserNameBuffer = reader.ReadVirtualArray(value.DriverUserNameLength);
  115. value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
  116. writer.WriteString($"[{driverUserNameBuffer.ToArray().ToHexString()}]驾驶员姓名", value.DriverUserName);
  117. var qualificationCodeBuffer = reader.ReadVirtualArray(20);
  118. value.QualificationCode = reader.ReadString(20);
  119. writer.WriteString($"[{qualificationCodeBuffer.ToArray().ToHexString()}]从业资格证编码", value.QualificationCode);
  120. value.LicenseIssuingLength = reader.ReadByte();
  121. writer.WriteNumber($"[{value.LicenseIssuingLength.ReadNumber()}]发证机构名称长度", value.LicenseIssuingLength);
  122. var licenseIssuingLengtheBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength);
  123. value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
  124. writer.WriteString($"[{licenseIssuingLengtheBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing);
  125. value.CertificateExpiresDate = reader.ReadDateTime4();
  126. writer.WriteString($"[{value.CertificateExpiresDate.ToString("yyMMdd")}]插拔卡时间", value.CertificateExpiresDate.ToString("yyyy-MM-dd"));
  127. if (reader.Version == JT808Version.JTT2019)
  128. {
  129. var driverIdentityCardBuffer = reader.ReadVirtualArray(20);
  130. value.DriverIdentityCard = reader.ReadString(20);
  131. writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard);
  132. //兼容808-2019 补充
  133. if (reader.ReadCurrentRemainContentLength() > 0)
  134. {
  135. value.FaceMatchValue = reader.ReadByte();
  136. writer.WriteNumber($"[{value.FaceMatchValue.Value.ReadNumber()}]人脸匹配度", value.FaceMatchValue.Value);
  137. var uidBuffer = reader.ReadVirtualArray(20);
  138. value.UID = reader.ReadString(20);
  139. writer.WriteString($"[{uidBuffer.ToArray().ToHexString()}]身份证UID", value.UID);
  140. }
  141. }
  142. }
  143. }
  144. }
  145. else
  146. {
  147. if (firstByte == 0x02 && reader.ReadCurrentRemainContentLength() == 7)
  148. {
  149. //如果字节是0x02且长度只有7,那么该协议就是2013或者2019
  150. value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
  151. writer.WriteNumber($"[{((byte)value.IC_Card_Status).ReadNumber()}]状态-{value.IC_Card_Status.ToString()}", (byte)value.IC_Card_Status);
  152. value.IC_Card_PlugDateTime = reader.ReadDateTime6();
  153. writer.WriteString($"[{value.IC_Card_PlugDateTime.ToString("yyMMddHHmmss")}]插拔卡时间", value.IC_Card_PlugDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
  154. }
  155. else
  156. {
  157. value.DriverUserNameLength = reader.ReadByte();
  158. writer.WriteNumber($"[{value.DriverUserNameLength.ReadNumber()}]驾驶员姓名长度", value.DriverUserNameLength);
  159. var driverUserNameBuffer = reader.ReadVirtualArray(value.DriverUserNameLength);
  160. value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
  161. writer.WriteString($"[{driverUserNameBuffer.ToArray().ToHexString()}]驾驶员姓名", value.DriverUserName);
  162. var driverIdentityCardBuffer = reader.ReadVirtualArray(20);
  163. value.DriverIdentityCard = reader.ReadString(20);
  164. writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard);
  165. var qualificationCodeBuffer = reader.ReadVirtualArray(40);
  166. value.QualificationCode = reader.ReadString(40);
  167. writer.WriteString($"[{qualificationCodeBuffer.ToArray().ToHexString()}]从业资格证编码", value.QualificationCode);
  168. value.LicenseIssuingLength = reader.ReadByte();
  169. writer.WriteNumber($"[{value.LicenseIssuingLength.ReadNumber()}]发证机构名称长度", value.LicenseIssuingLength);
  170. var licenseIssuingBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength);
  171. value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
  172. writer.WriteString($"[{licenseIssuingBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing);
  173. }
  174. }
  175. }
  176. /// <summary>
  177. ///
  178. /// </summary>
  179. /// <param name="reader"></param>
  180. /// <param name="config"></param>
  181. /// <returns></returns>
  182. public JT808_0x0702 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  183. {
  184. JT808_0x0702 value = new JT808_0x0702();
  185. var firstByte = reader.ReadVirtualByte();
  186. //因2011第一个字节代表姓名长度 所以该值长度只能为 2,3,4,整个数据长度 62+m+n
  187. if (firstByte == 0x01)
  188. {
  189. value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
  190. value.IC_Card_PlugDateTime = reader.ReadDateTime6();
  191. if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
  192. {
  193. value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte();
  194. if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
  195. {
  196. value.DriverUserNameLength = reader.ReadByte();
  197. value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
  198. value.QualificationCode = reader.ReadString(20);
  199. value.LicenseIssuingLength = reader.ReadByte();
  200. value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
  201. value.CertificateExpiresDate = reader.ReadDateTime4();
  202. if (reader.Version == JT808Version.JTT2019)
  203. {
  204. value.DriverIdentityCard = reader.ReadString(20);
  205. //兼容808-2019 补充
  206. if (reader.ReadCurrentRemainContentLength() > 0)
  207. {
  208. value.FaceMatchValue = reader.ReadByte();
  209. value.UID = reader.ReadString(20);
  210. }
  211. }
  212. }
  213. }
  214. }
  215. else
  216. {
  217. if (firstByte == 0x02 && reader.ReadCurrentRemainContentLength() == 7)
  218. {
  219. //如果字节是0x02且长度只有7,那么该协议就是2013或者2019
  220. value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
  221. value.IC_Card_PlugDateTime = reader.ReadDateTime6();
  222. }
  223. else {
  224. value.DriverUserNameLength = reader.ReadByte();
  225. value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
  226. value.DriverIdentityCard = reader.ReadString(20);
  227. value.QualificationCode = reader.ReadString(40);
  228. value.LicenseIssuingLength = reader.ReadByte();
  229. value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
  230. }
  231. }
  232. return value;
  233. }
  234. /// <summary>
  235. ///
  236. /// </summary>
  237. /// <param name="writer"></param>
  238. /// <param name="value"></param>
  239. /// <param name="config"></param>
  240. public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0702 value, IJT808Config config)
  241. {
  242. if (writer.Version == JT808Version.JTT2011)
  243. {
  244. writer.WriteByte((byte)value.DriverUserName.Length);
  245. writer.WriteString(value.DriverUserName);
  246. writer.WriteString(value.DriverIdentityCard.PadLeft(20,'\0').ValiString(nameof(value.DriverIdentityCard), 20));
  247. writer.WriteString(value.QualificationCode.PadLeft(40, '\0').ValiString(nameof(value.QualificationCode), 40));
  248. writer.WriteByte((byte)value.LicenseIssuing.Length);
  249. writer.WriteString(value.LicenseIssuing);
  250. }
  251. else {
  252. writer.WriteByte((byte)value.IC_Card_Status);
  253. writer.WriteDateTime6(value.IC_Card_PlugDateTime);
  254. if (value.IC_Card_Status == JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班)
  255. {
  256. writer.WriteByte((byte)value.IC_Card_ReadResult);
  257. if (value.IC_Card_ReadResult == JT808ICCardReadResult.IC卡读卡成功)
  258. {
  259. writer.WriteByte((byte)value.DriverUserName.Length);
  260. writer.WriteString(value.DriverUserName);
  261. writer.WriteString(value.QualificationCode.PadLeft(20, '\0').ValiString(nameof(value.QualificationCode), 20));
  262. writer.WriteByte((byte)value.LicenseIssuing.Length);
  263. writer.WriteString(value.LicenseIssuing);
  264. writer.WriteDateTime4(value.CertificateExpiresDate);
  265. if (writer.Version == JT808Version.JTT2019)
  266. {
  267. writer.WriteString(value.DriverIdentityCard.PadLeft(20, '\0').ValiString(nameof(value.DriverIdentityCard), 20));
  268. //兼容808-2019 补充
  269. if (value.FaceMatchValue.HasValue)
  270. {
  271. writer.WriteByte(value.FaceMatchValue.Value);
  272. }
  273. if (!string.IsNullOrEmpty(value.UID))
  274. {
  275. writer.WriteString(value.UID.PadLeft(20, '\0').ValiString(nameof(value.UID), 20));
  276. }
  277. }
  278. }
  279. }
  280. }
  281. }
  282. }
  283. }