您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

271 行
14 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 : JT808MessagePackFormatter<JT808_0x0702>, JT808Bodies, IJT808Analyze, IJT808_2019_Version
  14. {
  15. /// <summary>
  16. /// 0x0702
  17. /// </summary>
  18. public ushort MsgId => 0x0702;
  19. /// <summary>
  20. ///
  21. /// </summary>
  22. public bool SkipSerialization => false;
  23. /// <summary>
  24. /// Description
  25. /// </summary>
  26. public string Description => "驾驶员身份信息采集上报";
  27. /// <summary>
  28. /// 状态
  29. /// 0x01:从业资格证 IC 卡插入(驾驶员上班);
  30. /// 0x02:从业资格证 IC 卡拔出(驾驶员下班)。
  31. /// </summary>
  32. public JT808ICCardStatus IC_Card_Status { get; set; }
  33. /// <summary>
  34. /// 插卡/拔卡时间,YY-MM-DD-hh-mm-ss;
  35. /// 以下字段在状态为 0x01 时才有效并做填充。
  36. /// BCD[6]
  37. /// </summary>
  38. public DateTime IC_Card_PlugDateTime { get; set; }
  39. /// <summary>
  40. /// IC 卡读取结果
  41. /// 0x00:IC 卡读卡成功;
  42. /// 0x01:读卡失败,原因为卡片密钥认证未通过;
  43. /// 0x02:读卡失败,原因为卡片已被锁定;
  44. /// 0x03:读卡失败,原因为卡片被拔出;
  45. /// 0x04:读卡失败,原因为数据校验错误。
  46. /// 以下字段在 IC 卡读取结果等于 0x00 时才有效。
  47. /// </summary>
  48. public JT808ICCardReadResult IC_Card_ReadResult { get; set; }
  49. /// <summary>
  50. /// 驾驶员姓名长度
  51. /// </summary>
  52. public byte DriverUserNameLength { get; set; }
  53. /// <summary>
  54. /// 驾驶员姓名
  55. /// </summary>
  56. public string DriverUserName { get; set; }
  57. /// <summary>
  58. /// 从业资格证编码
  59. /// 2011 长度40 位 ,不足补 '\0';
  60. /// 2013 长度 20 位,不足补 '\0'。
  61. /// </summary>
  62. public string QualificationCode { get; set; }
  63. /// <summary>
  64. /// 发证机构名称长度
  65. /// </summary>
  66. public byte LicenseIssuingLength { get; set; }
  67. /// <summary>
  68. /// 发证机构名称
  69. /// </summary>
  70. public string LicenseIssuing { get; set; }
  71. /// <summary>
  72. /// 证件有效期 BCD[4]
  73. /// </summary>
  74. public DateTime CertificateExpiresDate { get; set; }
  75. /// <summary>
  76. /// 驾驶员身份证号 长度20 不足补 '\0'
  77. /// 2011版本
  78. /// 2019版本
  79. /// </summary>
  80. public string DriverIdentityCard { get; set; }
  81. /// <summary>
  82. /// 人脸匹配度
  83. /// 身份证或从业资格证照片与人脸匹配度比例:0~100
  84. /// 2019版本
  85. /// </summary>
  86. public byte? FaceMatchValue { get; set; }
  87. /// <summary>
  88. /// 身份证 UID
  89. /// 长度 20 位,不足补0x00
  90. /// 2019版本
  91. /// </summary>
  92. public string UID { get; set; }
  93. /// <summary>
  94. ///
  95. /// </summary>
  96. /// <param name="reader"></param>
  97. /// <param name="writer"></param>
  98. /// <param name="config"></param>
  99. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  100. {
  101. JT808_0x0702 value = new JT808_0x0702();
  102. var firstByte = reader.ReadVirtualByte();
  103. //因2011第一个字节代表姓名长度 所以该值长度只能为 2,3,4,整个数据长度 62+m+n
  104. if (firstByte == 0x01 || firstByte == 0x02)
  105. {
  106. value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
  107. writer.WriteNumber($"[{((byte)value.IC_Card_Status).ReadNumber()}]状态-{value.IC_Card_Status.ToString()}", (byte)value.IC_Card_Status);
  108. value.IC_Card_PlugDateTime = reader.ReadDateTime_yyMMddHHmmss();
  109. writer.WriteString($"[{value.IC_Card_PlugDateTime.ToString("yyMMddHHmmss")}]插拔卡时间", value.IC_Card_PlugDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
  110. if (reader.ReadCurrentRemainContentLength() > 0)
  111. {
  112. value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte();
  113. writer.WriteNumber($"[{((byte)value.IC_Card_ReadResult).ReadNumber()}]IC卡读取结果-{value.IC_Card_ReadResult.ToString()}", (byte)value.IC_Card_ReadResult);
  114. if (value.IC_Card_ReadResult == JT808ICCardReadResult.ic_card_reading_succeeded)
  115. {
  116. value.DriverUserNameLength = reader.ReadByte();
  117. writer.WriteNumber($"[{value.DriverUserNameLength.ReadNumber()}]驾驶员姓名长度", value.DriverUserNameLength);
  118. var driverUserNameBuffer = reader.ReadVirtualArray(value.DriverUserNameLength);
  119. value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
  120. writer.WriteString($"[{driverUserNameBuffer.ToArray().ToHexString()}]驾驶员姓名", value.DriverUserName);
  121. var qualificationCodeBuffer = reader.ReadVirtualArray(20);
  122. value.QualificationCode = reader.ReadString(20);
  123. writer.WriteString($"[{qualificationCodeBuffer.ToArray().ToHexString()}]从业资格证编码", value.QualificationCode);
  124. value.LicenseIssuingLength = reader.ReadByte();
  125. writer.WriteNumber($"[{value.LicenseIssuingLength.ReadNumber()}]发证机构名称长度", value.LicenseIssuingLength);
  126. var licenseIssuingLengtheBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength);
  127. value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
  128. writer.WriteString($"[{licenseIssuingLengtheBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing);
  129. value.CertificateExpiresDate = reader.ReadDateTime_YYYYMMDD();
  130. writer.WriteString($"[{value.CertificateExpiresDate.ToString("yyMMdd")}]插拔卡时间", value.CertificateExpiresDate.ToString("yyyy-MM-dd"));
  131. if (reader.Version == JT808Version.JTT2019)
  132. {
  133. var driverIdentityCardBuffer = reader.ReadVirtualArray(20);
  134. value.DriverIdentityCard = reader.ReadString(20);
  135. writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard);
  136. //兼容808-2019 补充
  137. if (reader.ReadCurrentRemainContentLength() > 0)
  138. {
  139. value.FaceMatchValue = reader.ReadByte();
  140. writer.WriteNumber($"[{value.FaceMatchValue.Value.ReadNumber()}]人脸匹配度", value.FaceMatchValue.Value);
  141. var uidBuffer = reader.ReadVirtualArray(20);
  142. value.UID = reader.ReadString(20);
  143. writer.WriteString($"[{uidBuffer.ToArray().ToHexString()}]身份证UID", value.UID);
  144. }
  145. }
  146. }
  147. }
  148. }
  149. else
  150. {
  151. value.DriverUserNameLength = reader.ReadByte();
  152. writer.WriteNumber($"[{value.DriverUserNameLength.ReadNumber()}]驾驶员姓名长度", value.DriverUserNameLength);
  153. var driverUserNameBuffer = reader.ReadVirtualArray(value.DriverUserNameLength);
  154. value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
  155. writer.WriteString($"[{driverUserNameBuffer.ToArray().ToHexString()}]驾驶员姓名", value.DriverUserName);
  156. var driverIdentityCardBuffer = reader.ReadVirtualArray(20);
  157. value.DriverIdentityCard = reader.ReadString(20);
  158. writer.WriteString($"[{driverIdentityCardBuffer.ToArray().ToHexString()}]驾驶员身份证号", value.DriverIdentityCard);
  159. var qualificationCodeBuffer = reader.ReadVirtualArray(40);
  160. value.QualificationCode = reader.ReadString(40);
  161. writer.WriteString($"[{qualificationCodeBuffer.ToArray().ToHexString()}]从业资格证编码", value.QualificationCode);
  162. value.LicenseIssuingLength = reader.ReadByte();
  163. writer.WriteNumber($"[{value.LicenseIssuingLength.ReadNumber()}]发证机构名称长度", value.LicenseIssuingLength);
  164. var licenseIssuingBuffer = reader.ReadVirtualArray(value.LicenseIssuingLength);
  165. value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
  166. writer.WriteString($"[{licenseIssuingBuffer.ToArray().ToHexString()}]发证机构名称", value.LicenseIssuing);
  167. }
  168. }
  169. /// <summary>
  170. ///
  171. /// </summary>
  172. /// <param name="reader"></param>
  173. /// <param name="config"></param>
  174. /// <returns></returns>
  175. public override JT808_0x0702 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  176. {
  177. JT808_0x0702 value = new JT808_0x0702();
  178. var firstByte = reader.ReadVirtualByte();
  179. //因2011第一个字节代表姓名长度 所以该值长度只能为 2,3,4,整个数据长度 62+m+n
  180. if (firstByte == 0x01|| firstByte == 0x02)
  181. {
  182. value.IC_Card_Status = (JT808ICCardStatus)reader.ReadByte();
  183. value.IC_Card_PlugDateTime = reader.ReadDateTime_yyMMddHHmmss();
  184. if (reader.ReadCurrentRemainContentLength()>0)
  185. {
  186. value.IC_Card_ReadResult = (JT808ICCardReadResult)reader.ReadByte();
  187. if (value.IC_Card_ReadResult == JT808ICCardReadResult.ic_card_reading_succeeded)
  188. {
  189. value.DriverUserNameLength = reader.ReadByte();
  190. value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
  191. value.QualificationCode = reader.ReadString(20);
  192. value.LicenseIssuingLength = reader.ReadByte();
  193. value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
  194. value.CertificateExpiresDate = reader.ReadDateTime_YYYYMMDD();
  195. if (reader.Version == JT808Version.JTT2019)
  196. {
  197. value.DriverIdentityCard = reader.ReadString(20);
  198. //兼容808-2019 补充
  199. if (reader.ReadCurrentRemainContentLength() > 0)
  200. {
  201. value.FaceMatchValue = reader.ReadByte();
  202. value.UID = reader.ReadString(20);
  203. }
  204. }
  205. }
  206. }
  207. }
  208. else
  209. {
  210. //默认是2011版本
  211. value.DriverUserNameLength = reader.ReadByte();
  212. value.DriverUserName = reader.ReadString(value.DriverUserNameLength);
  213. value.DriverIdentityCard = reader.ReadString(20);
  214. value.QualificationCode = reader.ReadString(40);
  215. value.LicenseIssuingLength = reader.ReadByte();
  216. value.LicenseIssuing = reader.ReadString(value.LicenseIssuingLength);
  217. }
  218. return value;
  219. }
  220. /// <summary>
  221. ///
  222. /// </summary>
  223. /// <param name="writer"></param>
  224. /// <param name="value"></param>
  225. /// <param name="config"></param>
  226. public override void Serialize(ref JT808MessagePackWriter writer, JT808_0x0702 value, IJT808Config config)
  227. {
  228. if (writer.Version == JT808Version.JTT2011)
  229. {
  230. writer.WriteByte((byte)value.DriverUserName.Length);
  231. writer.WriteString(value.DriverUserName);
  232. writer.WriteString(value.DriverIdentityCard.PadLeft(20,'\0').ValiString(nameof(value.DriverIdentityCard), 20));
  233. writer.WriteString(value.QualificationCode.PadLeft(40, '\0').ValiString(nameof(value.QualificationCode), 40));
  234. writer.WriteByte((byte)value.LicenseIssuing.Length);
  235. writer.WriteString(value.LicenseIssuing);
  236. }
  237. else {
  238. writer.WriteByte((byte)value.IC_Card_Status);
  239. writer.WriteDateTime_yyMMddHHmmss(value.IC_Card_PlugDateTime);
  240. if (value.IC_Card_Status == JT808ICCardStatus.ic_card_into)
  241. {
  242. writer.WriteByte((byte)value.IC_Card_ReadResult);
  243. if (value.IC_Card_ReadResult == JT808ICCardReadResult.ic_card_reading_succeeded)
  244. {
  245. writer.WriteByte((byte)value.DriverUserName.Length);
  246. writer.WriteString(value.DriverUserName);
  247. writer.WriteString(value.QualificationCode.PadLeft(20, '\0').ValiString(nameof(value.QualificationCode), 20));
  248. writer.WriteByte((byte)value.LicenseIssuing.Length);
  249. writer.WriteString(value.LicenseIssuing);
  250. writer.WriteDateTime_YYYYMMDD(value.CertificateExpiresDate);
  251. if (writer.Version == JT808Version.JTT2019)
  252. {
  253. writer.WriteString(value.DriverIdentityCard.PadLeft(20, '\0').ValiString(nameof(value.DriverIdentityCard), 20));
  254. //兼容808-2019 补充
  255. if (value.FaceMatchValue.HasValue)
  256. {
  257. writer.WriteByte(value.FaceMatchValue.Value);
  258. }
  259. if (!string.IsNullOrEmpty(value.UID))
  260. {
  261. writer.WriteString(value.UID.PadLeft(20, '\0').ValiString(nameof(value.UID), 20));
  262. }
  263. }
  264. }
  265. }
  266. }
  267. }
  268. }
  269. }