No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

240 líneas
14 KiB

  1. using JT808.Protocol.Enums;
  2. using JT808.Protocol.Extensions;
  3. using JT808.Protocol.Formatters;
  4. using JT808.Protocol.Interfaces;
  5. using JT808.Protocol.MessagePack;
  6. using System;
  7. using System.Collections;
  8. using System.Linq;
  9. using System.Text.Json;
  10. namespace JT808.Protocol.MessageBody
  11. {
  12. /// <summary>
  13. /// 查询终端属性应答
  14. /// </summary>
  15. public class JT808_0x0107 : JT808MessagePackFormatter<JT808_0x0107>, JT808Bodies, IJT808_2019_Version,IJT808Analyze
  16. {
  17. /// <summary>
  18. /// 0x0107
  19. /// </summary>
  20. public ushort MsgId => 0x0107;
  21. /// <summary>
  22. ///
  23. /// </summary>
  24. public bool SkipSerialization => false;
  25. /// <summary>
  26. /// 查询终端属性应答
  27. /// </summary>
  28. public string Description => "查询终端属性应答";
  29. /// <summary>
  30. /// 终端类型
  31. /// bit0,0:不适用客运车辆,1:适用客运车辆;
  32. /// bit1,0:不适用危险品车辆,1:适用危险品车辆;
  33. /// bit2,0:不适用普通货运车辆,1:适用普通货运车辆;
  34. /// bit3,0:不适用出租车辆,1:适用出租车辆;
  35. /// bit6,0:不支持硬盘录像,1:支持硬盘录像;
  36. /// bit7,0:一体机,1:分体机
  37. /// </summary>
  38. public ushort TerminalType { get; set; }
  39. /// <summary>
  40. /// 制造商 ID
  41. /// 2013版本 5 个字节,终端制造商编码
  42. /// </summary>
  43. public string MakerId { get; set; }
  44. /// <summary>
  45. /// 终端型号
  46. /// BYTE[20] 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。
  47. /// 2019版本
  48. /// BYTE[30] 30 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。
  49. /// </summary>
  50. public string TerminalModel { get; set; }
  51. /// <summary>
  52. /// 终端ID
  53. /// BYTE[7] 7 个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00”
  54. /// 2019版本
  55. /// BYTE[30] 30 个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00”
  56. /// </summary>
  57. public string TerminalId { get; set; }
  58. /// <summary>
  59. /// 终端 SIM 卡 ICCID
  60. /// BCD[10]
  61. /// </summary>
  62. public string Terminal_SIM_ICCID { get; set; }
  63. /// <summary>
  64. /// 终端硬件版本号长度
  65. /// </summary>
  66. public byte Terminal_Hardware_Version_Length { get; set; }
  67. /// <summary>
  68. /// 终端硬件版本号
  69. /// </summary>
  70. public string Terminal_Hardware_Version_Num { get; set; }
  71. /// <summary>
  72. /// 终端固件版本号长度
  73. /// </summary>
  74. public byte Terminal_Firmware_Version_Length { get; set; }
  75. /// <summary>
  76. /// 终端固件版本号
  77. /// </summary>
  78. public string Terminal_Firmware_Version_Num { get; set; }
  79. /// <summary>
  80. /// GNSS 模块属性
  81. /// bit0,0:不支持 GPS 定位, 1:支持 GPS 定位;
  82. /// bit1,0:不支持北斗定位, 1:支持北斗定位;
  83. /// bit2,0:不支持 GLONASS 定位, 1:支持 GLONASS 定位;
  84. /// bit3,0:不支持 Galileo 定位, 1:支持 Galileo 定位
  85. /// </summary>
  86. public byte GNSSModule { get; set; }
  87. /// <summary>
  88. /// 通信模块属性
  89. /// bit0,0:不支持GPRS通信, 1:支持GPRS通信;
  90. /// bit1,0:不支持CDMA通信, 1:支持CDMA通信;
  91. /// bit2,0:不支持TD-SCDMA通信, 1:支持TD-SCDMA通信;
  92. /// bit3,0:不支持WCDMA通信, 1:支持WCDMA通信;
  93. /// bit4,0:不支持CDMA2000通信, 1:支持CDMA2000通信。
  94. /// bit5,0:不支持TD-LTE通信, 1:支持TD-LTE通信;
  95. /// bit7,0:不支持其他通信方式, 1:支持其他通信方式
  96. /// </summary>
  97. public byte CommunicationModule { get; set; }
  98. /// <summary>
  99. ///
  100. /// </summary>
  101. /// <param name="reader"></param>
  102. /// <param name="config"></param>
  103. /// <returns></returns>
  104. public override JT808_0x0107 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
  105. {
  106. JT808_0x0107 jT808_0X0107 = new JT808_0x0107();
  107. jT808_0X0107.TerminalType = reader.ReadUInt16();
  108. jT808_0X0107.MakerId = reader.ReadString(5);
  109. if (reader.Version == JT808Version.JTT2019)
  110. {
  111. jT808_0X0107.TerminalModel = reader.ReadString(30);
  112. jT808_0X0107.TerminalId = reader.ReadString(30);
  113. }
  114. else
  115. {
  116. jT808_0X0107.TerminalModel = reader.ReadString(20);
  117. jT808_0X0107.TerminalId = reader.ReadString(7);
  118. }
  119. jT808_0X0107.Terminal_SIM_ICCID = reader.ReadBCD(20, config.Trim);
  120. jT808_0X0107.Terminal_Hardware_Version_Length = reader.ReadByte();
  121. jT808_0X0107.Terminal_Hardware_Version_Num = reader.ReadString(jT808_0X0107.Terminal_Hardware_Version_Length);
  122. jT808_0X0107.Terminal_Firmware_Version_Length = reader.ReadByte();
  123. jT808_0X0107.Terminal_Firmware_Version_Num = reader.ReadString(jT808_0X0107.Terminal_Firmware_Version_Length);
  124. jT808_0X0107.GNSSModule = reader.ReadByte();
  125. jT808_0X0107.CommunicationModule = reader.ReadByte();
  126. return jT808_0X0107;
  127. }
  128. /// <summary>
  129. ///
  130. /// </summary>
  131. /// <param name="writer"></param>
  132. /// <param name="value"></param>
  133. /// <param name="config"></param>
  134. public override void Serialize(ref JT808MessagePackWriter writer, JT808_0x0107 value, IJT808Config config)
  135. {
  136. writer.WriteUInt16(value.TerminalType);
  137. writer.WriteString(value.MakerId.PadRight(5, '\0').ValiString(nameof(value.MakerId), 5));
  138. if (writer.Version == JT808Version.JTT2019)
  139. {
  140. writer.WriteString(value.TerminalModel.PadRight(30, '\0').ValiString(nameof(value.TerminalModel), 30));
  141. writer.WriteString(value.TerminalId.PadRight(30, '\0').ValiString(nameof(value.TerminalId), 30));
  142. }
  143. else
  144. {
  145. writer.WriteString(value.TerminalModel.PadRight(20, '\0').ValiString(nameof(value.TerminalModel), 20));
  146. writer.WriteString(value.TerminalId.PadRight(7, '\0').ValiString(nameof(value.TerminalId), 7));
  147. }
  148. writer.WriteBCD(value.Terminal_SIM_ICCID.ValiString(nameof(value.Terminal_SIM_ICCID), 20), 20);
  149. writer.WriteByte((byte)value.Terminal_Hardware_Version_Num.Length);
  150. writer.WriteString(value.Terminal_Hardware_Version_Num);
  151. writer.WriteByte((byte)value.Terminal_Firmware_Version_Num.Length);
  152. writer.WriteString(value.Terminal_Firmware_Version_Num);
  153. writer.WriteByte(value.GNSSModule);
  154. writer.WriteByte(value.CommunicationModule);
  155. }
  156. /// <summary>
  157. ///
  158. /// </summary>
  159. /// <param name="reader"></param>
  160. /// <param name="writer"></param>
  161. /// <param name="config"></param>
  162. public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
  163. {
  164. JT808_0x0107 jT808_0X0107 = new JT808_0x0107();
  165. jT808_0X0107.TerminalType = reader.ReadUInt16();
  166. writer.WriteNumber($"[{jT808_0X0107.TerminalType.ReadNumber()}]终端类型", jT808_0X0107.TerminalType);
  167. ReadOnlySpan<char> terminalTypeBits =string.Join("", Convert.ToString(jT808_0X0107.TerminalType, 2).PadLeft(16, '0').Reverse()).AsSpan();
  168. writer.WriteStartObject("终端类型");
  169. writer.WriteString("bit0", terminalTypeBits[0] == '0' ? "不适用客运车辆" : "适用客运车辆");
  170. writer.WriteString("bit1", terminalTypeBits[1] == '0' ? "不适用危险品车辆" : "适用危险品车辆");
  171. writer.WriteString("bit2", terminalTypeBits[2] == '0' ? "不适用普通货运车辆" : "适用普通货运车辆");
  172. writer.WriteString("bit3", terminalTypeBits[3] == '0' ? "不适用出租车辆" : "适用出租车辆");
  173. writer.WriteString("bit6", terminalTypeBits[6] == '0' ? "不支持硬盘录像" : "支持硬盘录像");
  174. writer.WriteString("bit7", terminalTypeBits[7] == '0' ? "一体机" : "分体机");
  175. if (reader.Version == JT808Version.JTT2019)
  176. {
  177. writer.WriteString("bit8", terminalTypeBits[8] == '0' ? "不适用挂车" : "适用挂车");
  178. }
  179. writer.WriteEndObject();
  180. ReadOnlySpan<byte> makerIdSpan = reader.ReadVirtualArray(5);
  181. jT808_0X0107.MakerId = reader.ReadString(5);
  182. writer.WriteString($"[{makerIdSpan.ToArray().ToHexString()}]制造商ID", jT808_0X0107.MakerId);
  183. if (reader.Version == JT808Version.JTT2019)
  184. {
  185. ReadOnlySpan<byte> terminalModelSpan = reader.ReadVirtualArray(30);
  186. jT808_0X0107.TerminalModel = reader.ReadString(30);
  187. writer.WriteString($"[{terminalModelSpan.ToArray().ToHexString()}]终端型号", jT808_0X0107.TerminalModel);
  188. ReadOnlySpan<byte> terminalIdSpan = reader.ReadVirtualArray(30);
  189. jT808_0X0107.TerminalId = reader.ReadString(30);
  190. writer.WriteString($"[{terminalIdSpan.ToArray().ToHexString()}]终端ID", jT808_0X0107.TerminalId);
  191. }
  192. else
  193. {
  194. ReadOnlySpan<byte> terminalModelSpan = reader.ReadVirtualArray(20);
  195. jT808_0X0107.TerminalModel = reader.ReadString(20);
  196. writer.WriteString($"[{terminalModelSpan.ToArray().ToHexString()}]终端型号", jT808_0X0107.TerminalModel);
  197. ReadOnlySpan<byte> terminalIdSpan = reader.ReadVirtualArray(7);
  198. jT808_0X0107.TerminalId = reader.ReadString(7);
  199. writer.WriteString($"[{terminalIdSpan.ToArray().ToHexString()}]终端ID", jT808_0X0107.TerminalId);
  200. }
  201. ReadOnlySpan<byte> iccidSpan = reader.ReadVirtualArray(10);
  202. jT808_0X0107.Terminal_SIM_ICCID = reader.ReadBCD(20, config.Trim);
  203. writer.WriteString($"[{iccidSpan.ToArray().ToHexString()}]终端SIM卡ICCID", jT808_0X0107.Terminal_SIM_ICCID);
  204. jT808_0X0107.Terminal_Hardware_Version_Length = reader.ReadByte();
  205. writer.WriteNumber($"[{jT808_0X0107.Terminal_Hardware_Version_Length.ReadNumber()}]终端硬件版本号长度", jT808_0X0107.Terminal_Hardware_Version_Length);
  206. ReadOnlySpan<byte> hardwareVersionNumSpan = reader.ReadVirtualArray(jT808_0X0107.Terminal_Hardware_Version_Length);
  207. jT808_0X0107.Terminal_Hardware_Version_Num = reader.ReadString(jT808_0X0107.Terminal_Hardware_Version_Length);
  208. writer.WriteString($"[{hardwareVersionNumSpan.ToArray().ToHexString()}]终端硬件版本号", jT808_0X0107.Terminal_Hardware_Version_Num);
  209. jT808_0X0107.Terminal_Firmware_Version_Length = reader.ReadByte();
  210. writer.WriteNumber($"[{jT808_0X0107.Terminal_Firmware_Version_Length.ReadNumber()}]终端硬件版本号长度", jT808_0X0107.Terminal_Firmware_Version_Length);
  211. ReadOnlySpan<byte> firmwareVersionNumSpan = reader.ReadVirtualArray(jT808_0X0107.Terminal_Firmware_Version_Length);
  212. jT808_0X0107.Terminal_Firmware_Version_Num = reader.ReadString(jT808_0X0107.Terminal_Firmware_Version_Length);
  213. writer.WriteString($"[{firmwareVersionNumSpan.ToArray().ToHexString()}]终端固件版本号", jT808_0X0107.Terminal_Firmware_Version_Num);
  214. jT808_0X0107.GNSSModule = reader.ReadByte();
  215. ReadOnlySpan<char> gNSSModuleBits =string.Join("", Convert.ToString(jT808_0X0107.GNSSModule, 2).PadLeft(8,'0').Reverse()).AsSpan();
  216. writer.WriteNumber($"[{jT808_0X0107.GNSSModule.ReadNumber()}]GNSS模块属性", jT808_0X0107.GNSSModule);
  217. writer.WriteStartObject("GNSS模块属性");
  218. writer.WriteString("bit0", gNSSModuleBits[0] == '0' ? "不支持GPS定位" : "支持GPS定位");
  219. writer.WriteString("bit1", gNSSModuleBits[1] == '0' ? "不支持北斗定位" : "支持北斗定位");
  220. writer.WriteString("bit2", gNSSModuleBits[2] == '0' ? "不支持GLONASS定位" : "支持GLONASS定位");
  221. writer.WriteString("bit3", gNSSModuleBits[3] == '0' ? "不支持Galileo定位" : "支持Galileo定位");
  222. writer.WriteEndObject();
  223. jT808_0X0107.CommunicationModule = reader.ReadByte();
  224. ReadOnlySpan<char> communicationModuleBits=string.Join("",Convert.ToString(jT808_0X0107.CommunicationModule, 2).PadLeft(8, '0').Reverse()).AsSpan();
  225. writer.WriteNumber($"[{jT808_0X0107.CommunicationModule.ReadNumber()}]通信模块属性", jT808_0X0107.CommunicationModule);
  226. writer.WriteStartObject("通信模块属性");
  227. writer.WriteString("bit0", communicationModuleBits[0] == '0' ? "不支持GPRS通信" : "支持GPRS通信");
  228. writer.WriteString("bit1", communicationModuleBits[1] == '0' ? "不支持CDMA通信" : "支持CDMA通信");
  229. writer.WriteString("bit2", communicationModuleBits[2] == '0' ? "不支持TD-SCDMA通信" : "支持TD-SCDMA通信");
  230. writer.WriteString("bit3", communicationModuleBits[3] == '0' ? "不支持WCDMA通信" : "支持WCDMA通信");
  231. writer.WriteString("bit4", communicationModuleBits[4] == '0' ? "不支持CDMA2000通信" : "支持CDMA2000通信");
  232. writer.WriteString("bit5", communicationModuleBits[5] == '0' ? "不支持TD-LTE通信" : "支持TD-LTE通信");
  233. writer.WriteString("bit6", "保留");
  234. writer.WriteString("bit7", communicationModuleBits[7] == '0' ? "不支持其他通信方式" : "不支持其他通信方式");
  235. writer.WriteEndObject();
  236. }
  237. }
  238. }