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.

80 lines
3.3 KiB

  1. using JT809.Protocol.Enums;
  2. using JT809.Protocol.Exceptions;
  3. using JT809.Protocol.Extensions;
  4. using JT809.Protocol.Formatters;
  5. using JT809.Protocol.MessagePack;
  6. namespace JT809.Protocol.MessageBody
  7. {
  8. /// <summary>
  9. /// 主链路报警信息交互消息
  10. /// <para>主链路车辆报警信息业务</para>
  11. /// <para>链路类型:主链路</para>
  12. /// <para>消息方向:下级平台往上级平台</para>
  13. /// <para>业务数据类型标识:UP_WARN_MSG</para>
  14. /// <para>描述:下级平台向上级平台发送车辆报警信息业务</para>
  15. /// </summary>
  16. public class JT809_0x1400: JT809ExchangeMessageBodies, IJT809MessagePackFormatter<JT809_0x1400>
  17. {
  18. public override ushort MsgId => JT809BusinessType.主链路报警信息交互消息.ToUInt16Value();
  19. public override string Description => "主链路报警信息交互消息";
  20. public override JT809_LinkType LinkType => JT809_LinkType.main;
  21. public JT809_0x1400 Deserialize(ref JT809MessagePackReader reader, IJT809Config config)
  22. {
  23. JT809_0x1400 value = new JT809_0x1400();
  24. value.VehicleNo = reader.ReadString(21);
  25. value.VehicleColor = (JT809VehicleColorType)reader.ReadByte();
  26. value.SubBusinessType = reader.ReadUInt16();
  27. value.DataLength = reader.ReadUInt32();
  28. try
  29. {
  30. if (config.SubBusinessTypeFactory.TryGetValue(value.SubBusinessType, out object instance))
  31. {
  32. if (instance is JT809SubBodies subBodies)
  33. {
  34. if (!subBodies.SkipSerialization)
  35. {
  36. value.SubBodies = JT809MessagePackFormatterResolverExtensions.JT809DynamicDeserialize(
  37. instance,
  38. ref reader, config);
  39. }
  40. }
  41. }
  42. }
  43. catch
  44. {
  45. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  46. }
  47. return value;
  48. }
  49. public void Serialize(ref JT809MessagePackWriter writer, JT809_0x1400 value, IJT809Config config)
  50. {
  51. writer.WriteStringPadRight(value.VehicleNo, 21);
  52. writer.WriteByte((byte)value.VehicleColor);
  53. writer.WriteUInt16(value.SubBusinessType);
  54. try
  55. {
  56. // 先写入内容,然后在根据内容反写内容长度
  57. writer.Skip(4, out int subContentLengthPosition);
  58. if (value.SubBodies != null)
  59. {
  60. if (!value.SubBodies.SkipSerialization)
  61. {
  62. JT809MessagePackFormatterResolverExtensions.JT809DynamicSerialize(
  63. value.SubBodies,
  64. ref writer, value.SubBodies,
  65. config);
  66. }
  67. }
  68. writer.WriteInt32Return(writer.GetCurrentPosition() - subContentLengthPosition - 4, subContentLengthPosition);
  69. }
  70. catch
  71. {
  72. throw new JT809Exception(JT809ErrorCode.SubBodiesParseError, $"SubBusinessType>{value.SubBusinessType.ToString()}");
  73. }
  74. }
  75. }
  76. }