Преглед изворни кода

1.调整0x0200附加基类,增加一个4个字节的扩展附加信息长度属性

2.修改苏标的主动安全报警附件信息消息的终端ID属性
3.增加粤标协议(待完善)
tags/v2.4.1
SmallChi(Koike) пре 4 година
родитељ
комит
985142353b
38 измењених фајлова са 5958 додато и 18 уклоњено
  1. +0
    -7
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808.Protocol.Extensions.JTActiveSafety.Test.csproj
  2. +2
    -2
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x1210_Test.cs
  3. +2
    -2
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml
  4. +6
    -6
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x1210.cs
  5. +33
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/ActivePhotographyStrategyType.cs
  6. +33
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/JT808_YueBiao_MsgId.cs
  7. +41
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/PhotoResolutionType.cs
  8. +29
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/USBIDType.cs
  9. +45
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/VideoRecordingResolutionType.cs
  10. +33
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/WorkingConditionType.cs
  11. +1
    -1
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.csproj
  12. +2017
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.xml
  13. +53
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808_YueBiao_Constants.cs
  14. +352
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x64.cs
  15. +315
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x65.cs
  16. +316
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x66.cs
  17. +283
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x67.cs
  18. +122
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF7.cs
  19. +175
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF8.cs
  20. +179
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1210.cs
  21. +87
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1211.cs
  22. +87
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1212.cs
  23. +456
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF364.cs
  24. +365
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF365.cs
  25. +151
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF366.cs
  26. +77
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF367.cs
  27. +90
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF7.cs
  28. +90
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF8.cs
  29. +143
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9208.cs
  30. +139
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9212.cs
  31. +40
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmIdentificationProperty.cs
  32. +33
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmOrEventProperty.cs
  33. +26
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AttachProperty.cs
  34. +21
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/DataPackageProperty.cs
  35. +31
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF7_USB.cs
  36. +72
    -0
      src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF8_USB.cs
  37. +7
    -0
      src/JT808.Protocol/JT808.Protocol.xml
  38. +6
    -0
      src/JT808.Protocol/MessageBody/JT808_0x0200_BodyBase.cs

+ 0
- 7
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808.Protocol.Extensions.JTActiveSafety.Test.csproj Прегледај датотеку

@@ -6,13 +6,6 @@
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<None Include="..\..\LICENSE" Link="LICENSE">
<PackagePath></PackagePath>
<Pack>True</Pack>
</None>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" />


+ 2
- 2
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety.Test/JT808_0x1210_Test.cs Прегледај датотеку

@@ -43,7 +43,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test
FileSize=10
}
},
MakerID = "4444444",
TerminalId = "4444444",
InfoType = 0
};
var hex = JT808Serializer.Serialize(jT808UploadLocationRequest).ToHexString();
@@ -68,7 +68,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.Test
Assert.Equal(9, jT808UploadLocationRequest.AttachInfos[1].FileNameLength);
Assert.Equal(10u, jT808UploadLocationRequest.AttachInfos[1].FileSize);

Assert.Equal("4444444", jT808UploadLocationRequest.MakerID);
Assert.Equal("4444444", jT808UploadLocationRequest.TerminalId);
Assert.Equal(0, jT808UploadLocationRequest.InfoType);

}


+ 2
- 2
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/JT808.Protocol.Extensions.JTActiveSafety.xml Прегледај датотеку

@@ -783,9 +783,9 @@
报警附件信息消息
</summary>
</member>
<member name="P:JT808.Protocol.Extensions.JTActiveSafety.MessageBody.JT808_0x1210.MakerID">
<member name="P:JT808.Protocol.Extensions.JTActiveSafety.MessageBody.JT808_0x1210.TerminalId">
<summary>
制造商Id
终端ID
7 个字节,由大写字母和数字组成,此终端ID 由制造商自行定义,位数不足时,后补“0x00”
</summary>
</member>


+ 6
- 6
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.JTActiveSafety/MessageBody/JT808_0x1210.cs Прегледај датотеку

@@ -15,10 +15,10 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody
public class JT808_0x1210: JT808Bodies, IJT808MessagePackFormatter<JT808_0x1210>, IJT808Analyze
{
/// <summary>
/// 制造商Id
/// 终端ID
/// 7 个字节,由大写字母和数字组成,此终端ID 由制造商自行定义,位数不足时,后补“0x00”
/// </summary>
public string MakerID { get; set; }
public string TerminalId { get; set; }
/// <summary>
/// 报警标识号
/// </summary>
@@ -60,8 +60,8 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody
{
JT808_0x1210 value = new JT808_0x1210();
string makerIdHex=reader.ReadVirtualArray(7).ToArray().ToHexString();
value.MakerID = reader.ReadString(7);
writer.WriteString($"[{makerIdHex}]制造商Id", value.MakerID);
value.TerminalId = reader.ReadString(7);
writer.WriteString($"[{makerIdHex}]终端ID", value.TerminalId);
value.AlarmIdentification = new AlarmIdentificationProperty();
string terminalIDHex = reader.ReadVirtualArray(7).ToArray().ToHexString();
value.AlarmIdentification.TerminalID = reader.ReadString(7);
@@ -109,7 +109,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody
public JT808_0x1210 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x1210 value = new JT808_0x1210();
value.MakerID = reader.ReadString(7);
value.TerminalId = reader.ReadString(7);
value.AlarmIdentification = new AlarmIdentificationProperty
{
TerminalID = reader.ReadString(7),
@@ -143,7 +143,7 @@ namespace JT808.Protocol.Extensions.JTActiveSafety.MessageBody
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x1210 value, IJT808Config config)
{
writer.WriteString(value.MakerID.PadRight(7, '\0'));
writer.WriteString(value.TerminalId.PadRight(7, '\0'));
if (value.AlarmIdentification == null)
{
throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");


+ 33
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/ActivePhotographyStrategyType.cs Прегледај датотеку

@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Enums
{
/// <summary>
/// 主动拍照策略
/// </summary>
public enum ActivePhotographyStrategyType:byte
{
/// <summary>
/// 不开启
/// </summary>
不开启 = 0x00,
/// <summary>
/// 定时拍照
/// </summary>
定时拍照 = 0x01,
/// <summary>
/// 定距拍照
/// </summary>
定距拍照 = 0x02,
/// <summary>
/// 保留
/// </summary>
保留 = 0x03,
/// <summary>
/// 不修改参数
/// </summary>
不修改参数 = 0xFF
}
}

+ 33
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/JT808_YueBiao_MsgId.cs Прегледај датотеку

@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Enums
{
/// <summary>
/// 主动安全消息Id
/// </summary>
public enum JT808_YueBiao_MsgId : ushort
{
/// <summary>
/// 报警附件信息消息
/// </summary>
报警附件信息消息 = 0x1210,
/// <summary>
/// 文件信息上传
/// </summary>
文件信息上传 = 0x1211,
/// <summary>
/// 文件上传完成消息
/// </summary>
文件上传完成消息 = 0x1212,
/// <summary>
/// 报警附件上传指令
/// </summary>
报警附件上传指令 = 0x9208,
/// <summary>
/// 文件上传完成消息应答
/// </summary>
文件上传完成消息应答 = 0x9212,
}
}

+ 41
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/PhotoResolutionType.cs Прегледај датотеку

@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Enums
{
/// <summary>
/// 拍照分辨率
/// </summary>
public enum PhotoResolutionType:byte
{
/// <summary>
/// 352x288
/// </summary>
x352_288 = 0x01,
/// <summary>
/// 704x288
/// </summary>
x704_288 = 0x02,
/// <summary>
/// 704x576
/// </summary>
x704_576 = 0x03,
/// <summary>
/// 640x480
/// </summary>
x640_480 = 0x04,
/// <summary>
/// 1280x720
/// </summary>
x1280_720 = 0x05,
/// <summary>
/// 1920x1080
/// </summary>
x1920_1080 = 0x06,
/// <summary>
/// 不修改参数
/// </summary>
不修改参数 = 0xFF
}
}

+ 29
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/USBIDType.cs Прегледај датотеку

@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Enums
{
/// <summary>
/// USB编号类型
/// </summary>
public enum USBIDType:byte
{
/// <summary>
/// 高级驾驶辅助系统
/// </summary>
ADAS = 0x64,
/// <summary>
/// 驾驶员状态监控系统
/// </summary>
DSM = 0x65,
/// <summary>
/// 轮胎气压监测系统
/// </summary>
TPMS = 0x66,
/// <summary>
/// 盲点监测系统
/// </summary>
BSD = 0x67
}
}

+ 45
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/VideoRecordingResolutionType.cs Прегледај датотеку

@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Enums
{
/// <summary>
/// 视频录制分辨率
/// </summary>
public enum VideoRecordingResolutionType:byte
{
/// <summary>
/// CIF
/// </summary>
CIF = 0x01,
/// <summary>
/// HD1
/// </summary>
HD1 = 0x02,
/// <summary>
/// D1
/// </summary>
D1 = 0x03,
/// <summary>
/// WD1
/// </summary>
WD1 = 0x04,
/// <summary>
/// VGA
/// </summary>
VGA = 0x05,
/// <summary>
/// 720P
/// </summary>
_720P = 0x06,
/// <summary>
/// 1080P
/// </summary>
_1080P = 0x07,
/// <summary>
/// 不修改参数
/// </summary>
不修改参数 = 0xFF
}
}

+ 33
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Enums/WorkingConditionType.cs Прегледај датотеку

@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Enums
{
/// <summary>
/// 工作状态
/// </summary>
public enum WorkingConditionType:byte
{
/// <summary>
/// 正常工作
/// </summary>
正常工作 = 0x01,
/// <summary>
/// 待机状态
/// </summary>
待机状态 = 0x02,
/// <summary>
/// 升级维护
/// </summary>
升级维护 = 0x03,
/// <summary>
/// 设备异常
/// </summary>
设备异常 = 0x04,
/// <summary>
/// 断开连接
/// </summary>
断开连接 = 0x10,
}
}

+ 1
- 1
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.csproj Прегледај датотеку

@@ -13,7 +13,7 @@
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<None Include="..\..\..\README.md" Pack="true" PackagePath="\"/>
<None Include="..\..\..\README.md" Pack="true" PackagePath="\" />
</ItemGroup>

<ItemGroup>


+ 2017
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808.Protocol.Extensions.YueBiao.xml
Разлика између датотеке није приказан због своје велике величине
Прегледај датотеку


+ 53
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/JT808_YueBiao_Constants.cs Прегледај датотеку

@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao
{
/// <summary>
/// 主动安全常量
/// </summary>
public static class JT808_YueBiao_Constants
{
/// <summary>
/// 附加信息ID 高级驾驶辅助系统报警信息
/// </summary>
public const byte JT808_0X0200_0x64 = 0x64;
/// <summary>
/// 附加信息ID 驾驶员状态监测系统报警信息
/// </summary>
public const byte JT808_0X0200_0x65 = 0x65;
/// <summary>
/// 附加信息ID 胎压监测系统报警信息
/// </summary>
public const byte JT808_0X0200_0x66 = 0x66;
/// <summary>
/// 附加信息ID 盲区监测系统报警信息
/// </summary>
public const byte JT808_0X0200_0x67 = 0x67;
/// <summary>
/// 高级驾驶辅助系统参数设置
/// </summary>
public const uint JT808_0X8103_0xF364 = 0xF364;
/// <summary>
/// 驾驶员状态监测系统参数设置
/// </summary>
public const uint JT808_0X8103_0xF365 = 0xF365;
/// <summary>
/// 胎压监测系统参数设置
/// </summary>
public const uint JT808_0X8103_0xF366 = 0xF366;
/// <summary>
/// 盲区监测系统参数设置
/// </summary>
public const uint JT808_0X8103_0xF367 = 0xF367;
/// <summary>
/// 状态查询
/// </summary>
public const byte JT808_0X0900_0xF7 = 0xF7;
/// <summary>
/// 信息查询
/// </summary>
public const byte JT808_0X0900_0xF8 = 0xF8;
}
}

+ 352
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x64.cs Прегледај датотеку

@@ -0,0 +1,352 @@
using JT808.Protocol.Extensions.YueBiao.Metadata;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 高级驾驶辅助系统报警信息
/// </summary>
public class JT808_0x0200_0x64 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x64>, IJT808Analyze
{
/// <summary>
/// 高级驾驶辅助系统报警信息Id
/// </summary>
public override byte AttachInfoId { get; set; } = JT808_YueBiao_Constants.JT808_0X0200_0x64;
/// <summary>
/// 高级驾驶辅助系统报警信息附加长度
/// </summary>
public override byte AttachInfoLength { get; set; } = 32;
/// <summary>
/// 报警ID
/// </summary>
public uint AlarmId { get; set; }
/// <summary>
/// 标志状态
/// </summary>
public byte FlagState { get; set; }
/// <summary>
/// 报警/事件类型
/// </summary>
public byte AlarmOrEventType{ get; set; }
/// <summary>
/// 报警/事件类型
/// </summary>
public byte AlarmLevel { get; set; }
/// <summary>
/// 前车车速
/// </summary>
public byte VehicleSpeed { get; set; }
/// <summary>
/// 前车/行人距离
/// </summary>
public byte CarOrPedestrianDistanceAhead { get; set; }
/// <summary>
/// 偏离类型
/// </summary>
public byte DeviateType { get; set; }
/// <summary>
/// 道路标志识别类型
/// </summary>
public byte RoadSignIdentificationType { get; set; }
/// <summary>
/// 道路标志识别类型
/// </summary>
public byte RoadSignIdentificationData { get; set; }
/// <summary>
/// 车速
/// </summary>
public byte Speed { get; set; }
/// <summary>
/// 高程
/// </summary>
public ushort Altitude { get; set; }
/// <summary>
/// 纬度
/// </summary>
public int Latitude { get; set; }
/// <summary>
/// 经度
/// </summary>
public int Longitude { get; set; }
/// <summary>
/// 日期时间
/// YYMMDDhhmmss
/// BCD[6]
/// </summary>
public DateTime AlarmTime { get; set; }
/// <summary>
/// 车辆状态
/// </summary>
public ushort VehicleState { get; set; }
/// <summary>
/// 报警标识号
/// </summary>
public AlarmIdentificationProperty AlarmIdentification { get; set; }
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x0200_0x64 value = new JT808_0x0200_0x64();
value.AttachInfoId = reader.ReadByte();
writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId);
value.AttachInfoLength = reader.ReadByte();
writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength);
value.AlarmId = reader.ReadUInt32();
writer.WriteNumber($"[{value.AlarmId.ReadNumber()}]报警ID", value.AlarmId);
value.FlagState = reader.ReadByte();
string flagStateString = "未知";
switch (value.FlagState)
{
case 0:
flagStateString = "不可用";
break;
case 1:
flagStateString = "开始标志";
break;
case 2:
flagStateString = "结束标志";
break;
}
writer.WriteNumber($"[{value.FlagState.ReadNumber()}]标志状态-{flagStateString}", value.FlagState);
value.AlarmOrEventType = reader.ReadByte();
string alarmOrEventTypeString = "";
string vehicleSpeedString = "无效";
string carOrPedestrianDistanceAheadString = "无效";
string deviateTypeString = "无效";
string roadSignIdentificationTypeString = "无效";
switch (value.AlarmOrEventType)
{
case 0x01:
alarmOrEventTypeString = "前向碰撞报警";
vehicleSpeedString = "有效";
carOrPedestrianDistanceAheadString = "有效";
break;
case 0x02:
alarmOrEventTypeString = "车道偏离报警";
vehicleSpeedString = "有效";
carOrPedestrianDistanceAheadString = "有效";
deviateTypeString = "有效";
break;
case 0x03:
alarmOrEventTypeString = "车距过近报警";
break;
case 0x04:
alarmOrEventTypeString = "行人碰撞报警";
vehicleSpeedString = "有效";
break;
case 0x05:
alarmOrEventTypeString = "频繁变道报警";
break;
case 0x06:
alarmOrEventTypeString = "道路标识超限报警";
roadSignIdentificationTypeString = "有效";
break;
case 0x07:
alarmOrEventTypeString = "障碍物报警";
break;
case 0x08:
case 0x09:
case 0x0A:
case 0x0B:
case 0x0C:
case 0x0D:
case 0x0E:
case 0x0F:
alarmOrEventTypeString = "用户自定义";
break;
case 0x10:
roadSignIdentificationTypeString = "有效";
alarmOrEventTypeString = "道路标志识别事件";
break;
case 0x11:
alarmOrEventTypeString = "主动抓拍事件";
break;
case 0x12:
alarmOrEventTypeString = "实现变道报警";
break;
case 0x13:
alarmOrEventTypeString = "车厢过道行人检测报警";
break;
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1A:
case 0x1B:
case 0x1C:
case 0x1D:
case 0x1E:
case 0x1F:
alarmOrEventTypeString = "用户自定义";
break;
}
writer.WriteNumber($"[{value.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", value.AlarmOrEventType);
value.AlarmLevel = reader.ReadByte();
string alarmLevelString = "未知";
switch (value.AlarmLevel)
{
case 0x01:
alarmLevelString = "一级报警";
break;
case 0x02:
alarmLevelString = "二级报警";
break;
}
writer.WriteNumber($"[{value.AlarmLevel.ReadNumber()}]报警级别-{alarmLevelString}", value.AlarmLevel);
value.VehicleSpeed = reader.ReadByte();
writer.WriteNumber($"[{value.VehicleSpeed.ReadNumber()}]前车车速-{vehicleSpeedString}", value.VehicleSpeed);
value.CarOrPedestrianDistanceAhead = reader.ReadByte();
writer.WriteNumber($"[{value.CarOrPedestrianDistanceAhead.ReadNumber()}]前车_行人距离-{carOrPedestrianDistanceAheadString}", value.CarOrPedestrianDistanceAhead);
value.DeviateType = reader.ReadByte();
string deviateType = value.DeviateType == 0x01 ? "左侧偏离" : "右侧偏离";
writer.WriteNumber($"[{value.DeviateType.ReadNumber()}]偏离类型-{deviateType}-{deviateTypeString}", value.DeviateType);
value.RoadSignIdentificationType = reader.ReadByte();
string roadSignIdentificationType = "未知标志";
if (value.RoadSignIdentificationType == 0x01)
{
roadSignIdentificationType = "限速标志";
}
else if (value.RoadSignIdentificationType == 0x02)
{
roadSignIdentificationType = "限高标志";
}
else if (value.RoadSignIdentificationType == 0x03)
{
roadSignIdentificationType = "限重标志";
}
writer.WriteNumber($"[{value.RoadSignIdentificationType.ReadNumber()}]道路标志识别类型-{roadSignIdentificationType}-{roadSignIdentificationTypeString}", value.RoadSignIdentificationType);
value.RoadSignIdentificationData = reader.ReadByte();
writer.WriteNumber($"[{value.RoadSignIdentificationData.ReadNumber()}]道路标志识别数据", value.RoadSignIdentificationData);
value.Speed = reader.ReadByte();
writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed);
value.Altitude = reader.ReadUInt16();
writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude);
value.Latitude = (int)reader.ReadUInt32();
writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude);
value.Longitude = (int)reader.ReadUInt32();
writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude);
value.AlarmTime = reader.ReadDateTime6();
writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss"));
value.VehicleState = reader.ReadUInt16();
writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState);
var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0');
writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]");
writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动");
writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡");
writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString());
writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString());
writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString());
writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString());
writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位");
writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString());
writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString());
writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString());
writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString());
writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString());
writer.WriteEndObject();
value.AlarmIdentification = new AlarmIdentificationProperty();
string terminalIDHex = reader.ReadVirtualArray(30).ToArray().ToHexString();
value.AlarmIdentification.TerminalId = reader.ReadString(30);
value.AlarmIdentification.Time = reader.ReadDateTime6();
value.AlarmIdentification.SN = reader.ReadByte();
value.AlarmIdentification.AttachCount = reader.ReadByte();
value.AlarmIdentification.Retain1 = reader.ReadByte();
value.AlarmIdentification.Retain2 = reader.ReadByte();
writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalId);
writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss"));
writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN);
writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount);
writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1);
writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2);
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x0200_0x64 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x0200_0x64 value = new JT808_0x0200_0x64();
value.AttachInfoId = reader.ReadByte();
value.AttachInfoLength = reader.ReadByte();
value.AlarmId = reader.ReadUInt32();
value.FlagState = reader.ReadByte();
value.AlarmOrEventType = reader.ReadByte();
value.AlarmLevel = reader.ReadByte();
value.VehicleSpeed = reader.ReadByte();
value.CarOrPedestrianDistanceAhead = reader.ReadByte();
value.DeviateType = reader.ReadByte();
value.RoadSignIdentificationType = reader.ReadByte();
value.RoadSignIdentificationData = reader.ReadByte();
value.Speed = reader.ReadByte();
value.Altitude = reader.ReadUInt16();
value.Latitude = (int)reader.ReadUInt32();
value.Longitude = (int)reader.ReadUInt32();
value.AlarmTime = reader.ReadDateTime6();
value.VehicleState = reader.ReadUInt16();
value.AlarmIdentification = new AlarmIdentificationProperty
{
TerminalId = reader.ReadString(30),
Time = reader.ReadDateTime6(),
SN = reader.ReadByte(),
AttachCount = reader.ReadByte(),
Retain1 = reader.ReadByte(),
Retain2 = reader.ReadByte()
};
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x64 value, IJT808Config config)
{
writer.WriteByte(value.AttachInfoId);
writer.WriteByte(value.AttachInfoLength);
writer.WriteUInt32(value.AlarmId);
writer.WriteByte(value.FlagState);
writer.WriteByte(value.AlarmOrEventType);
writer.WriteByte(value.AlarmLevel);
writer.WriteByte(value.VehicleSpeed);
writer.WriteByte(value.CarOrPedestrianDistanceAhead);
writer.WriteByte(value.DeviateType);
writer.WriteByte(value.RoadSignIdentificationType);
writer.WriteByte(value.RoadSignIdentificationData);
writer.WriteByte(value.Speed);
writer.WriteUInt16(value.Altitude);
writer.WriteUInt32((uint)value.Latitude);
writer.WriteUInt32((uint)value.Longitude);
writer.WriteDateTime6(value.AlarmTime);
writer.WriteUInt16(value.VehicleState);
if (value.AlarmIdentification == null) {
throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");
}
writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0'));
writer.WriteDateTime6(value.AlarmIdentification.Time);
writer.WriteByte(value.AlarmIdentification.SN);
writer.WriteByte(value.AlarmIdentification.AttachCount);
writer.WriteByte(value.AlarmIdentification.Retain1);
writer.WriteByte(value.AlarmIdentification.Retain2);
}
}
}

+ 315
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x65.cs Прегледај датотеку

@@ -0,0 +1,315 @@
using JT808.Protocol.Extensions.YueBiao.Metadata;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 驾驶员状态监测系统报警信息
/// </summary>
public class JT808_0x0200_0x65 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x65>, IJT808Analyze
{
/// <summary>
/// 驾驶员状态监测系统报警信息Id
/// </summary>
public override byte AttachInfoId { get; set; } = JT808_YueBiao_Constants.JT808_0X0200_0x65;
/// <summary>
/// 驾驶员状态监测系统报警信息长度
/// </summary>
public override byte AttachInfoLength { get; set; } = 47;
/// <summary>
/// 报警ID
/// </summary>
public uint AlarmId { get; set; }
/// <summary>
/// 标志状态
/// </summary>
public byte FlagState { get; set; }
/// <summary>
/// 报警/事件类型
/// </summary>
public byte AlarmOrEventType{ get; set; }
/// <summary>
/// 报警级别
/// </summary>
public byte AlarmLevel { get; set; }
/// <summary>
/// 疲劳程度
/// </summary>
public byte Fatigue { get; set; }
/// <summary>
/// 预留
/// </summary>
public byte[] Retain { get; set; } = new byte[4];
/// <summary>
/// 车速
/// </summary>
public byte Speed { get; set; }
/// <summary>
/// 高程
/// </summary>
public ushort Altitude { get; set; }
/// <summary>
/// 纬度
/// </summary>
public int Latitude { get; set; }
/// <summary>
/// 经度
/// </summary>
public int Longitude { get; set; }
/// <summary>
/// 日期时间
/// YYMMDDhhmmss
/// BCD[6]
/// </summary>
public DateTime AlarmTime { get; set; }
/// <summary>
/// 车辆状态
/// </summary>
public ushort VehicleState { get; set; }
/// <summary>
/// 报警标识号
/// </summary>
public AlarmIdentificationProperty AlarmIdentification { get; set; }
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x0200_0x65 value = new JT808_0x0200_0x65();
value.AttachInfoId = reader.ReadByte();
writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId);
value.AttachInfoLength = reader.ReadByte();
writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength);
value.AlarmId = reader.ReadUInt32();
writer.WriteNumber($"[{value.AlarmId.ReadNumber()}]报警ID", value.AlarmId);
value.FlagState = reader.ReadByte();
string flagStateString = "未知";
switch (value.FlagState)
{
case 0:
flagStateString = "不可用";
break;
case 1:
flagStateString = "开始标志";
break;
case 2:
flagStateString = "结束标志";
break;
}
writer.WriteNumber($"[{value.FlagState.ReadNumber()}]标志状态-{flagStateString}", value.FlagState);
value.AlarmOrEventType = reader.ReadByte();
string alarmOrEventTypeString = "";
switch (value.AlarmOrEventType)
{
case 0x01:
alarmOrEventTypeString = "疲劳驾驶报警";
break;
case 0x02:
alarmOrEventTypeString = "接打手持电话报警";
break;
case 0x03:
alarmOrEventTypeString = "抽烟报警";
break;
case 0x04:
alarmOrEventTypeString = "不目视前方报警";
break;
case 0x05:
alarmOrEventTypeString = "驾驶员异常报警";
break;
case 0x06:
alarmOrEventTypeString = "探头遮挡报警";
break;
case 0x07:
alarmOrEventTypeString = "用户自定义";
break;
case 0x08:
alarmOrEventTypeString = "超时驾驶报警";
break;
case 0x09:
alarmOrEventTypeString = "用户自定义";
break;
case 0x0A:
alarmOrEventTypeString = "未系安全带报警";
break;
case 0x0B:
alarmOrEventTypeString = "红外阻断型墨镜失效报警";
break;
case 0x0C:
alarmOrEventTypeString = "双脱把报警(双手同时脱离方向盘)";
break;
case 0x0D:
alarmOrEventTypeString = "玩手机报警";
break;
case 0x0E:
case 0x0F:
alarmOrEventTypeString = "用户自定义";
break;
case 0x10:
alarmOrEventTypeString = "自动抓拍事件";
break;
case 0x11:
alarmOrEventTypeString = "驾驶员变更事件";
break;
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1A:
case 0x1B:
case 0x1C:
case 0x1D:
case 0x1E:
case 0x1F:
alarmOrEventTypeString = "用户自定义";
break;
}
writer.WriteNumber($"[{value.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", value.AlarmOrEventType);
value.AlarmLevel = reader.ReadByte();
string alarmLevelString = "未知";
switch (value.AlarmLevel)
{
case 0x01:
alarmLevelString = "一级报警";
break;
case 0x02:
alarmLevelString = "二级报警";
break;
}
writer.WriteNumber($"[{value.AlarmLevel.ReadNumber()}]报警级别-{alarmLevelString}", value.AlarmLevel);
value.Fatigue = reader.ReadByte();
writer.WriteNumber($"[{value.Fatigue.ReadNumber()}]疲劳程度", value.Fatigue);
value.Retain = reader.ReadArray(4).ToArray();
writer.WriteString("预留", value.Retain.ToHexString());
value.Speed = reader.ReadByte();
writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed);
value.Altitude = reader.ReadUInt16();
writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude);
value.Latitude = (int)reader.ReadUInt32();
writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude);
value.Longitude = (int)reader.ReadUInt32();
writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude);
value.AlarmTime = reader.ReadDateTime6();
writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss"));
value.VehicleState = reader.ReadUInt16();
writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState);
var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0');
writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]");
writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动");
writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡");
writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString());
writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString());
writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString());
writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString());
writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位");
writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString());
writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString());
writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString());
writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString());
writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString());
writer.WriteEndObject();
value.AlarmIdentification = new AlarmIdentificationProperty();
string terminalIDHex = reader.ReadVirtualArray(30).ToArray().ToHexString();
value.AlarmIdentification.TerminalId = reader.ReadString(30);
value.AlarmIdentification.Time = reader.ReadDateTime6();
value.AlarmIdentification.SN = reader.ReadByte();
value.AlarmIdentification.AttachCount = reader.ReadByte();
value.AlarmIdentification.Retain1 = reader.ReadByte();
value.AlarmIdentification.Retain2 = reader.ReadByte();
writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalId);
writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss"));
writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN);
writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount);
writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1);
writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2);
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x0200_0x65 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x0200_0x65 value = new JT808_0x0200_0x65();
value.AttachInfoId = reader.ReadByte();
value.AttachInfoLength = reader.ReadByte();
value.AlarmId = reader.ReadUInt32();
value.FlagState = reader.ReadByte();
value.AlarmOrEventType = reader.ReadByte();
value.AlarmLevel = reader.ReadByte();
value.Fatigue = reader.ReadByte();
value.Retain = reader.ReadArray(4).ToArray();
value.Speed = reader.ReadByte();
value.Altitude = reader.ReadUInt16();
value.Latitude = (int)reader.ReadUInt32();
value.Longitude = (int)reader.ReadUInt32();
value.AlarmTime = reader.ReadDateTime6();
value.VehicleState = reader.ReadUInt16();
value.AlarmIdentification = new AlarmIdentificationProperty
{
TerminalId = reader.ReadString(30),
Time = reader.ReadDateTime6(),
SN = reader.ReadByte(),
AttachCount = reader.ReadByte(),
Retain1 = reader.ReadByte(),
Retain2 = reader.ReadByte()
};
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x65 value, IJT808Config config)
{
writer.WriteByte(value.AttachInfoId);
writer.WriteByte(value.AttachInfoLength);
writer.WriteUInt32(value.AlarmId);
writer.WriteByte(value.FlagState);
writer.WriteByte(value.AlarmOrEventType);
writer.WriteByte(value.AlarmLevel);
writer.WriteByte(value.Fatigue);
if (value.Retain.Length != 4)
{
throw new ArgumentOutOfRangeException($"{nameof(JT808_0x0200_0x65.Retain)} length==4");
}
writer.WriteArray(value.Retain);
writer.WriteByte(value.Speed);
writer.WriteUInt16(value.Altitude);
writer.WriteUInt32((uint)value.Latitude);
writer.WriteUInt32((uint)value.Longitude);
writer.WriteDateTime6(value.AlarmTime);
writer.WriteUInt16(value.VehicleState);
if (value.AlarmIdentification == null)
{
throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");
}
writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0'));
writer.WriteDateTime6(value.AlarmIdentification.Time);
writer.WriteByte(value.AlarmIdentification.SN);
writer.WriteByte(value.AlarmIdentification.AttachCount);
writer.WriteByte(value.AlarmIdentification.Retain1);
writer.WriteByte(value.AlarmIdentification.Retain2);
}
}
}

+ 316
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x66.cs Прегледај датотеку

@@ -0,0 +1,316 @@
using JT808.Protocol.Extensions.YueBiao.Metadata;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 胎压监测系统报警信息
/// </summary>
public class JT808_0x0200_0x66 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x66>, IJT808Analyze
{
/// <summary>
/// 胎压监测系统报警信息Id
/// </summary>
public override byte AttachInfoId { get; set; } = JT808_YueBiao_Constants.JT808_0X0200_0x66;
/// <summary>
/// 胎压监测系统报警信息长度
/// </summary>
public override byte AttachInfoLength { get; set; }
/// <summary>
/// 报警ID
/// </summary>
public uint AlarmId { get; set; }
/// <summary>
/// 标志状态
/// </summary>
public byte FlagState { get; set; }
/// <summary>
/// 车速
/// </summary>
public byte Speed { get; set; }
/// <summary>
/// 高程
/// </summary>
public ushort Altitude { get; set; }
/// <summary>
/// 纬度
/// </summary>
public int Latitude { get; set; }
/// <summary>
/// 经度
/// </summary>
public int Longitude { get; set; }
/// <summary>
/// 日期时间
/// YYMMDDhhmmss
/// BCD[6]
/// </summary>
public DateTime AlarmTime { get; set; }
/// <summary>
/// 车辆状态
/// </summary>
public ushort VehicleState { get; set; }
/// <summary>
/// 报警标识号
/// </summary>
public AlarmIdentificationProperty AlarmIdentification { get; set; }
/// <summary>
/// 报警/事件列表总数
/// </summary>
public byte AlarmOrEventCount { get; set; }
/// <summary>
/// 报警/事件信息列表
/// </summary>
public List<AlarmOrEventProperty> AlarmOrEvents { get; set; }
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x0200_0x66 value = new JT808_0x0200_0x66();
value.AttachInfoId = reader.ReadByte();
writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId);
value.AttachInfoLength = reader.ReadByte();
writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength);
value.AlarmId = reader.ReadUInt32();
writer.WriteNumber($"[{value.AlarmId.ReadNumber()}]报警ID", value.AlarmId);
value.FlagState = reader.ReadByte();
string flagStateString = "未知";
switch (value.FlagState)
{
case 0:
flagStateString = "不可用";
break;
case 1:
flagStateString = "开始标志";
break;
case 2:
flagStateString = "结束标志";
break;
}
writer.WriteNumber($"[{value.FlagState.ReadNumber()}]标志状态-{flagStateString}", value.FlagState);
value.Speed = reader.ReadByte();
writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed);
value.Altitude = reader.ReadUInt16();
writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude);
value.Latitude = (int)reader.ReadUInt32();
writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude);
value.Longitude = (int)reader.ReadUInt32();
writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude);
value.AlarmTime = reader.ReadDateTime6();
writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss"));
value.VehicleState = reader.ReadUInt16();
writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState);
var vehicleStateBits = Convert.ToString(value.VehicleState, 2).PadLeft(16, '0');
writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]");
writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12] == '0' ? "关闭" : "打开");
writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动");
writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡");
writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString());
writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString());
writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString());
writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString());
writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位");
writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString());
writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString());
writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString());
writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString());
writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString());
writer.WriteEndObject();
value.AlarmIdentification = new AlarmIdentificationProperty();
string terminalIDHex = reader.ReadVirtualArray(30).ToArray().ToHexString();
value.AlarmIdentification.TerminalId = reader.ReadString(30);
value.AlarmIdentification.Time = reader.ReadDateTime6();
value.AlarmIdentification.SN = reader.ReadByte();
value.AlarmIdentification.AttachCount = reader.ReadByte();
value.AlarmIdentification.Retain1 = reader.ReadByte();
value.AlarmIdentification.Retain2 = reader.ReadByte();
writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalId);
writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss"));
writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN);
writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount);
writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1);
writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2);
value.AlarmOrEventCount = reader.ReadByte();
writer.WriteNumber($"[{value.AlarmOrEventCount.ReadNumber()}]报警_事件列表总数", value.AlarmOrEventCount);
if (value.AlarmOrEventCount > 0)
{
writer.WriteStartArray("报警_事件列表");
for (int i = 0; i < value.AlarmOrEventCount; i++)
{
writer.WriteStartObject();
AlarmOrEventProperty item = new AlarmOrEventProperty();
item.TirePressureAlarmPosition = reader.ReadByte();
writer.WriteNumber($"[{item.TirePressureAlarmPosition.ReadNumber()}]胎压报警位置", item.TirePressureAlarmPosition);
item.AlarmOrEventType = reader.ReadUInt16();
string alarmOrEventTypeString = "";
switch (item.AlarmOrEventType)
{
case 0x01:
alarmOrEventTypeString = "前向碰撞报警";
break;
case 0x02:
alarmOrEventTypeString = "车道偏离报警";
break;
case 0x03:
alarmOrEventTypeString = "车距过近报警";
break;
case 0x04:
alarmOrEventTypeString = "行人碰撞报警";
break;
case 0x05:
alarmOrEventTypeString = "频繁变道报警";
break;
case 0x06:
alarmOrEventTypeString = "道路标识超限报警";
break;
case 0x07:
alarmOrEventTypeString = "障碍物报警";
break;
case 0x08:
case 0x09:
case 0x0A:
case 0x0B:
case 0x0C:
case 0x0D:
case 0x0E:
case 0x0F:
alarmOrEventTypeString = "用户自定义";
break;
case 0x10:
alarmOrEventTypeString = "道路标志识别事件";
break;
case 0x11:
alarmOrEventTypeString = "主动抓拍事件";
break;
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1A:
case 0x1B:
case 0x1C:
case 0x1D:
case 0x1E:
case 0x1F:
alarmOrEventTypeString = "用户自定义";
break;
}
writer.WriteNumber($"[{item.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", item.AlarmOrEventType);
item.TirePressure = reader.ReadUInt16();
writer.WriteNumber($"[{item.TirePressure.ReadNumber()}]胎压Kpa", item.TirePressure);
item.TireTemperature = reader.ReadUInt16();
writer.WriteNumber($"[{item.TireTemperature.ReadNumber()}]胎温℃", item.TireTemperature);
item.BatteryLevel = reader.ReadUInt16();
writer.WriteNumber($"[{item.BatteryLevel.ReadNumber()}]电池电量%", item.BatteryLevel);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x0200_0x66 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x0200_0x66 value = new JT808_0x0200_0x66();
value.AttachInfoId = reader.ReadByte();
value.AttachInfoLength = reader.ReadByte();
value.AlarmId = reader.ReadUInt32();
value.FlagState = reader.ReadByte();
value.Speed = reader.ReadByte();
value.Altitude = reader.ReadUInt16();
value.Latitude = (int)reader.ReadUInt32();
value.Longitude = (int)reader.ReadUInt32();
value.AlarmTime = reader.ReadDateTime6();
value.VehicleState = reader.ReadUInt16();
value.AlarmIdentification = new AlarmIdentificationProperty
{
TerminalId = reader.ReadString(30),
Time = reader.ReadDateTime6(),
SN = reader.ReadByte(),
AttachCount = reader.ReadByte(),
Retain1 = reader.ReadByte(),
Retain2 = reader.ReadByte()
};
value.AlarmOrEventCount = reader.ReadByte();
if (value.AlarmOrEventCount > 0)
{
value.AlarmOrEvents = new List<AlarmOrEventProperty>();
for (int i = 0; i < value.AlarmOrEventCount; i++)
{
AlarmOrEventProperty alarmOrEventProperty = new AlarmOrEventProperty();
alarmOrEventProperty.TirePressureAlarmPosition = reader.ReadByte();
alarmOrEventProperty.AlarmOrEventType = reader.ReadUInt16();
alarmOrEventProperty.TirePressure = reader.ReadUInt16();
alarmOrEventProperty.TireTemperature = reader.ReadUInt16();
alarmOrEventProperty.BatteryLevel = reader.ReadUInt16();
value.AlarmOrEvents.Add(alarmOrEventProperty);
}
}
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x66 value, IJT808Config config)
{
writer.WriteByte(value.AttachInfoId);
writer.Skip(1, out int AttachInfoLengthPosition);
writer.WriteUInt32(value.AlarmId);
writer.WriteByte(value.FlagState);
writer.WriteByte(value.Speed);
writer.WriteUInt16(value.Altitude);
writer.WriteUInt32((uint)value.Latitude);
writer.WriteUInt32((uint)value.Longitude);
writer.WriteDateTime6(value.AlarmTime);
writer.WriteUInt16(value.VehicleState);
if (value.AlarmIdentification == null)
{
throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");
}
writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0'));
writer.WriteDateTime6(value.AlarmIdentification.Time);
writer.WriteByte(value.AlarmIdentification.SN);
writer.WriteByte(value.AlarmIdentification.AttachCount);
writer.WriteByte(value.AlarmIdentification.Retain1);
writer.WriteByte(value.AlarmIdentification.Retain2);
if (value.AlarmOrEvents.Count > 0)
{
writer.WriteByte((byte)value.AlarmOrEvents.Count);
foreach (var item in value.AlarmOrEvents)
{
writer.WriteByte(item.TirePressureAlarmPosition);
writer.WriteUInt16(item.AlarmOrEventType);
writer.WriteUInt16(item.TirePressure);
writer.WriteUInt16(item.TireTemperature);
writer.WriteUInt16(item.BatteryLevel);
}
}
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - AttachInfoLengthPosition - 1), AttachInfoLengthPosition);
}
}
}

+ 283
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0200_0x67.cs Прегледај датотеку

@@ -0,0 +1,283 @@
using JT808.Protocol.Extensions.YueBiao.Metadata;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 盲区监测系统报警信息
/// </summary>
public class JT808_0x0200_0x67 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter<JT808_0x0200_0x67>, IJT808Analyze
{
/// <summary>
/// 盲区监测系统报警信息Id
/// </summary>
public override byte AttachInfoId { get; set; } = JT808_YueBiao_Constants.JT808_0X0200_0x67;
/// <summary>
/// 盲区监测系统报警信息长度
/// </summary>
public override byte AttachInfoLength { get; set; } = 26;
/// <summary>
/// 报警ID
/// </summary>
public uint AlarmId { get; set; }
/// <summary>
/// 标志状态
/// </summary>
public byte FlagState { get; set; }
/// <summary>
/// 报警/事件类型
/// </summary>
public byte AlarmOrEventType{ get; set; }
/// <summary>
/// 报警/事件类型
/// </summary>
public byte AlarmLevel { get; set; }
/// <summary>
/// 车速
/// </summary>
public byte Speed { get; set; }
/// <summary>
/// 高程
/// </summary>
public ushort Altitude { get; set; }
/// <summary>
/// 纬度
/// </summary>
public int Latitude { get; set; }
/// <summary>
/// 经度
/// </summary>
public int Longitude { get; set; }
/// <summary>
/// 日期时间
/// YYMMDDhhmmss
/// BCD[6]
/// </summary>
public DateTime AlarmTime { get; set; }
/// <summary>
/// 车辆状态
/// </summary>
public ushort VehicleState { get; set; }
/// <summary>
/// 报警标识号
/// </summary>
public AlarmIdentificationProperty AlarmIdentification { get; set; }
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x0200_0x67 value = new JT808_0x0200_0x67();
value.AttachInfoId = reader.ReadByte();
writer.WriteNumber($"[{value.AttachInfoId.ReadNumber()}]附加信息Id", value.AttachInfoId);
value.AttachInfoLength = reader.ReadByte();
writer.WriteNumber($"[{value.AttachInfoLength.ReadNumber()}]附加信息长度", value.AttachInfoLength);
value.AlarmId = reader.ReadUInt32();
writer.WriteNumber($"[{value.AlarmId.ReadNumber()}]报警ID", value.AlarmId);
value.FlagState = reader.ReadByte();
string flagStateString = "未知";
switch (value.FlagState)
{
case 0:
flagStateString = "不可用";
break;
case 1:
flagStateString = "开始标志";
break;
case 2:
flagStateString = "结束标志";
break;
}
writer.WriteNumber($"[{value.FlagState.ReadNumber()}]标志状态-{flagStateString}", value.FlagState);
value.AlarmOrEventType = reader.ReadByte();
string alarmOrEventTypeString = "";
switch (value.AlarmOrEventType)
{
case 0x01:
alarmOrEventTypeString = "前向碰撞报警";
break;
case 0x02:
alarmOrEventTypeString = "车道偏离报警";
break;
case 0x03:
alarmOrEventTypeString = "车距过近报警";
break;
case 0x04:
alarmOrEventTypeString = "行人碰撞报警";
break;
case 0x05:
alarmOrEventTypeString = "频繁变道报警";
break;
case 0x06:
alarmOrEventTypeString = "道路标识超限报警";
break;
case 0x07:
alarmOrEventTypeString = "障碍物报警";
break;
case 0x08:
case 0x09:
case 0x0A:
case 0x0B:
case 0x0C:
case 0x0D:
case 0x0E:
case 0x0F:
alarmOrEventTypeString = "用户自定义";
break;
case 0x10:
alarmOrEventTypeString = "道路标志识别事件";
break;
case 0x11:
alarmOrEventTypeString = "主动抓拍事件";
break;
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1A:
case 0x1B:
case 0x1C:
case 0x1D:
case 0x1E:
case 0x1F:
alarmOrEventTypeString = "用户自定义";
break;
}
writer.WriteNumber($"[{value.AlarmOrEventType.ReadNumber()}]报警_事件类型-{alarmOrEventTypeString}", value.AlarmOrEventType);
value.AlarmLevel = reader.ReadByte();
string alarmLevelString = "未知";
switch (value.AlarmLevel)
{
case 0x01:
alarmLevelString = "一级报警";
break;
case 0x02:
alarmLevelString = "二级报警";
break;
}
writer.WriteNumber($"[{value.AlarmLevel.ReadNumber()}]报警级别-{alarmLevelString}", value.AlarmLevel);
value.Speed = reader.ReadByte();
writer.WriteNumber($"[{value.Speed.ReadNumber()}]车速", value.Speed);
value.Altitude = reader.ReadUInt16();
writer.WriteNumber($"[{value.Altitude.ReadNumber()}]高程", value.Altitude);
value.Latitude = (int)reader.ReadUInt32();
writer.WriteNumber($"[{value.Latitude.ReadNumber()}]纬度", value.Latitude);
value.Longitude = (int)reader.ReadUInt32();
writer.WriteNumber($"[{value.Longitude.ReadNumber()}]经度", value.Longitude);
value.AlarmTime = reader.ReadDateTime6();
writer.WriteString($"[{value.AlarmTime.ToString("yyMMddHHmmss")}]日期时间", value.AlarmTime.ToString("yyyy-MM-dd HH:mm:ss"));
value.VehicleState = reader.ReadUInt16();
writer.WriteNumber($"[{value.VehicleState.ReadNumber()}]车辆状态", value.VehicleState);
var vehicleStateBits=Convert.ToString(value.VehicleState, 2).PadLeft(16, '0');
writer.WriteStartObject($"车辆状态对象[{vehicleStateBits}]");
writer.WriteString($"[{vehicleStateBits[15]}]Bit0ACC状态", vehicleStateBits[15]=='0'?"关闭":"打开");
writer.WriteString($"[{vehicleStateBits[14]}]Bit1左转向状态", vehicleStateBits[14]=='0'?"关闭":"打开");
writer.WriteString($"[{vehicleStateBits[13]}]Bit2右转向状态", vehicleStateBits[13]=='0'?"关闭":"打开");
writer.WriteString($"[{vehicleStateBits[12]}]Bit3雨刮器状态", vehicleStateBits[12]=='0'?"关闭":"打开");
writer.WriteString($"[{vehicleStateBits[11]}]Bit4制动状态", vehicleStateBits[11] == '0' ? "未制动" : "制动");
writer.WriteString($"[{vehicleStateBits[10]}]Bit5插卡状态", vehicleStateBits[10] == '0' ? "未插卡" : "已插卡");
writer.WriteString($"[{vehicleStateBits[9]}]Bit6自定义", vehicleStateBits[9].ToString());
writer.WriteString($"[{vehicleStateBits[8]}]Bit7自定义", vehicleStateBits[8].ToString());
writer.WriteString($"[{vehicleStateBits[7]}]Bit8自定义", vehicleStateBits[7].ToString());
writer.WriteString($"[{vehicleStateBits[6]}]Bit9自定义", vehicleStateBits[6].ToString());
writer.WriteString($"[{vehicleStateBits[5]}]Bit10定位状态", vehicleStateBits[5] == '0' ? "未定位" : "已定位");
writer.WriteString($"[{vehicleStateBits[4]}]Bit11自定义", vehicleStateBits[4].ToString());
writer.WriteString($"[{vehicleStateBits[3]}]Bit12自定义", vehicleStateBits[3].ToString());
writer.WriteString($"[{vehicleStateBits[2]}]Bit13自定义", vehicleStateBits[2].ToString());
writer.WriteString($"[{vehicleStateBits[1]}]Bit14自定义", vehicleStateBits[1].ToString());
writer.WriteString($"[{vehicleStateBits[0]}]Bit15自定义", vehicleStateBits[0].ToString());
writer.WriteEndObject();
value.AlarmIdentification = new AlarmIdentificationProperty();
string terminalIDHex = reader.ReadVirtualArray(30).ToArray().ToHexString();
value.AlarmIdentification.TerminalId = reader.ReadString(30);
value.AlarmIdentification.Time = reader.ReadDateTime6();
value.AlarmIdentification.SN = reader.ReadByte();
value.AlarmIdentification.AttachCount = reader.ReadByte();
value.AlarmIdentification.Retain1 = reader.ReadByte();
value.AlarmIdentification.Retain2 = reader.ReadByte();
writer.WriteString($"[{terminalIDHex}]终端ID", value.AlarmIdentification.TerminalId);
writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss"));
writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN);
writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount);
writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1);
writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2);
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x0200_0x67 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x0200_0x67 value = new JT808_0x0200_0x67();
value.AttachInfoId = reader.ReadByte();
value.AttachInfoLength = reader.ReadByte();
value.AlarmId = reader.ReadUInt32();
value.FlagState = reader.ReadByte();
value.AlarmOrEventType = reader.ReadByte();
value.AlarmLevel = reader.ReadByte();
value.Speed = reader.ReadByte();
value.Altitude = reader.ReadUInt16();
value.Latitude = (int)reader.ReadUInt32();
value.Longitude = (int)reader.ReadUInt32();
value.AlarmTime = reader.ReadDateTime6();
value.VehicleState = reader.ReadUInt16();
value.AlarmIdentification = new AlarmIdentificationProperty
{
TerminalId = reader.ReadString(30),
Time = reader.ReadDateTime6(),
SN = reader.ReadByte(),
AttachCount = reader.ReadByte(),
Retain1 = reader.ReadByte(),
Retain2 = reader.ReadByte()
};
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x67 value, IJT808Config config)
{
writer.WriteByte(value.AttachInfoId);
writer.WriteByte(value.AttachInfoLength);
writer.WriteUInt32(value.AlarmId);
writer.WriteByte(value.FlagState);
writer.WriteByte(value.AlarmOrEventType);
writer.WriteByte(value.AlarmLevel);
writer.WriteByte(value.Speed);
writer.WriteUInt16(value.Altitude);
writer.WriteUInt32((uint)value.Latitude);
writer.WriteUInt32((uint)value.Longitude);
writer.WriteDateTime6(value.AlarmTime);
writer.WriteUInt16(value.VehicleState);
if (value.AlarmIdentification == null)
{
throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");
}
writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0'));
writer.WriteDateTime6(value.AlarmIdentification.Time);
writer.WriteByte(value.AlarmIdentification.SN);
writer.WriteByte(value.AlarmIdentification.AttachCount);
writer.WriteByte(value.AlarmIdentification.Retain1);
writer.WriteByte(value.AlarmIdentification.Retain2);
}
}
}

+ 122
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF7.cs Прегледај датотеку

@@ -0,0 +1,122 @@
using JT808.Protocol.Extensions.YueBiao.Enums;
using JT808.Protocol.Extensions.YueBiao.Metadata;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 透传数据
/// </summary>
public class JT808_0x0900_0xF7 : JT808_0x0900_BodyBase, IJT808MessagePackFormatter<JT808_0x0900_0xF7>, IJT808Analyze
{
/// <summary>
/// 透传类型
/// </summary>
public override byte PassthroughType { get; set; } = JT808_YueBiao_Constants.JT808_0X0900_0xF7;
/// <summary>
/// 消息列表总数
/// </summary>
public byte USBMessageCount { get; set; }
/// <summary>
/// 消息列表数据
/// </summary>
public List<JT808_0x0900_0xF7_USB> USBMessages { get; set; }
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x0900_0xF7 value = new JT808_0x0900_0xF7();
value.USBMessageCount = reader.ReadByte();
writer.WriteNumber($"[{value.USBMessageCount.ReadNumber()}]消息列表总数", value.USBMessageCount);
if (value.USBMessageCount > 0)
{
writer.WriteStartArray("消息列表");
for (int i = 0; i < value.USBMessageCount; i++)
{
writer.WriteStartObject();
JT808_0x0900_0xF7_USB item = new JT808_0x0900_0xF7_USB();
item.USBID = reader.ReadByte();
writer.WriteNumber($"[{item.USBID.ReadNumber()}]外设ID", item.USBID);
item.MessageLength = reader.ReadByte();
writer.WriteNumber($"[{item.MessageLength.ReadNumber()}]消息长度", item.MessageLength);
item.WorkingCondition = reader.ReadByte();
var workingCondition = (WorkingConditionType)item.WorkingCondition;
writer.WriteNumber($"[{item.WorkingCondition.ReadNumber()}]工作状态-{workingCondition.ToString()}", item.WorkingCondition);
item.AlarmStatus = reader.ReadUInt32();
writer.WriteNumber($"[{item.AlarmStatus.ReadNumber()}]报警状态", item.AlarmStatus);
var alarmStatusBits = Convert.ToString(item.AlarmStatus, 2).PadLeft(32, '0').AsSpan();
writer.WriteStartObject($"报警状态对象[{alarmStatusBits.ToString()}]");
writer.WriteString($"[bit12~bit31]预留", alarmStatusBits.Slice(12).ToString());
writer.WriteString($"]bit11]定位模块异常", alarmStatusBits[11].ToString());
writer.WriteString($"[bit10]通讯模块异常", alarmStatusBits[10].ToString());
writer.WriteString($"[bit6~bit9]预留", alarmStatusBits.Slice(6,4).ToString());
writer.WriteString($"[bit5]电池异常", alarmStatusBits[5].ToString());
writer.WriteString($"[bit4]扬声器异常", alarmStatusBits[4].ToString());
writer.WriteString($"[bit3]红外补光异常", alarmStatusBits[3].ToString());
writer.WriteString($"[bit2]辅存储器异常", alarmStatusBits[2].ToString());
writer.WriteString($"[bit1]主存储器异常", alarmStatusBits[1].ToString());
writer.WriteString($"[bit0]摄像头异常", alarmStatusBits[0].ToString());
writer.WriteEndObject();
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x0900_0xF7 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x0900_0xF7 value = new JT808_0x0900_0xF7();
value.USBMessageCount = reader.ReadByte();
if (value.USBMessageCount > 0)
{
value.USBMessages = new List<JT808_0x0900_0xF7_USB>();
for (int i = 0; i < value.USBMessageCount; i++)
{
JT808_0x0900_0xF7_USB item = new JT808_0x0900_0xF7_USB();
item.USBID = reader.ReadByte();
item.MessageLength = reader.ReadByte();
item.WorkingCondition = reader.ReadByte();
item.AlarmStatus = reader.ReadUInt32();
value.USBMessages.Add(item);
}
}
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0900_0xF7 value, IJT808Config config)
{
if (value.USBMessages != null && value.USBMessages.Count > 0)
{
writer.WriteByte((byte)value.USBMessages.Count);
foreach (var item in value.USBMessages)
{
writer.WriteByte(item.USBID);
writer.WriteByte(5);
writer.WriteByte(item.WorkingCondition);
writer.WriteUInt32(item.AlarmStatus);
}
}
}
}
}

+ 175
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x0900_0xF8.cs Прегледај датотеку

@@ -0,0 +1,175 @@
using JT808.Protocol.Extensions.YueBiao.Metadata;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 透传数据
/// </summary>
public class JT808_0x0900_0xF8 : JT808_0x0900_BodyBase, IJT808MessagePackFormatter<JT808_0x0900_0xF8>, IJT808Analyze
{
/// <summary>
/// 透传类型
/// </summary>
public override byte PassthroughType { get; set; } = JT808_YueBiao_Constants.JT808_0X0900_0xF8;
/// <summary>
/// 消息列表总数
/// </summary>
public byte USBMessageCount { get; set; }
/// <summary>
///
/// </summary>
public List<JT808_0x0900_0xF8_USB> USBMessages { get; set; }
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x0900_0xF8 value = new JT808_0x0900_0xF8();
value.USBMessageCount = reader.ReadByte();
writer.WriteNumber($"[{value.USBMessageCount.ReadNumber()}]消息列表总数", value.USBMessageCount);
if (value.USBMessageCount > 0)
{
writer.WriteStartArray("消息列表");
for (int i = 0; i < value.USBMessageCount; i++)
{
writer.WriteStartObject();
JT808_0x0900_0xF8_USB item = new JT808_0x0900_0xF8_USB();
item.USBID = reader.ReadByte();
writer.WriteNumber($"[{item.USBID.ReadNumber()}]外设ID", item.USBID);
item.MessageLength = reader.ReadByte();
writer.WriteNumber($"[{item.MessageLength.ReadNumber()}]消息长度", item.MessageLength);
item.CompantNameLength = reader.ReadByte();
writer.WriteNumber($"[{item.CompantNameLength.ReadNumber()}]公司名称长度", item.CompantNameLength);

string compantNameHex = reader.ReadVirtualArray(item.CompantNameLength).ToArray().ToHexString();
item.CompantName = reader.ReadString(item.CompantNameLength);
writer.WriteString($"[{compantNameHex}]公司名称", item.CompantName);

item.ProductModelLength = reader.ReadByte();
writer.WriteNumber($"[{item.ProductModelLength.ReadNumber()}]产品型号长度", item.ProductModelLength);

string productModelHex = reader.ReadVirtualArray(item.ProductModelLength).ToArray().ToHexString();
item.ProductModel = reader.ReadString(item.ProductModelLength);
writer.WriteString($"[{productModelHex}]产品型号", item.ProductModel);

item.HardwareVersionNumberLength = reader.ReadByte();
writer.WriteNumber($"[{item.HardwareVersionNumberLength.ReadNumber()}]硬件版本号长度", item.HardwareVersionNumberLength);
string hardwareVersionNumberHex = reader.ReadVirtualArray(item.HardwareVersionNumberLength).ToArray().ToHexString();
item.HardwareVersionNumber = reader.ReadString(item.HardwareVersionNumberLength);
writer.WriteString($"[{hardwareVersionNumberHex}]硬件版本号", item.HardwareVersionNumber);

item.SoftwareVersionNumberLength = reader.ReadByte();
writer.WriteNumber($"[{item.SoftwareVersionNumberLength.ReadNumber()}]软件版本号长度", item.SoftwareVersionNumberLength);
string softwareVersionNumberHex = reader.ReadVirtualArray(item.SoftwareVersionNumberLength).ToArray().ToHexString();
item.SoftwareVersionNumber = reader.ReadString(item.SoftwareVersionNumberLength);
writer.WriteString($"[{softwareVersionNumberHex}]软件版本号", item.SoftwareVersionNumber);

item.DevicesIDLength = reader.ReadByte();
writer.WriteNumber($"[{item.DevicesIDLength.ReadNumber()}]设备ID长度", item.DevicesIDLength);
string devicesIDHex = reader.ReadVirtualArray(item.DevicesIDLength).ToArray().ToHexString();
item.DevicesID = reader.ReadString(item.DevicesIDLength);
writer.WriteString($"[{devicesIDHex}]设备ID", item.DevicesID);

item.CustomerCodeLength = reader.ReadByte();
writer.WriteNumber($"[{item.CustomerCodeLength.ReadNumber()}]客户代码长度", item.CustomerCodeLength);
string customerCodeHex = reader.ReadVirtualArray(item.CustomerCodeLength).ToArray().ToHexString();
item.CustomerCode = reader.ReadString(item.CustomerCodeLength);
writer.WriteString($"[{customerCodeHex}]客户代码", item.CustomerCode);

writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x0900_0xF8 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x0900_0xF8 value = new JT808_0x0900_0xF8();
value.USBMessageCount = reader.ReadByte();
if (value.USBMessageCount > 0)
{
value.USBMessages = new List<JT808_0x0900_0xF8_USB>();
for (int i = 0; i < value.USBMessageCount; i++)
{
JT808_0x0900_0xF8_USB item = new JT808_0x0900_0xF8_USB();
item.USBID = reader.ReadByte();
item.MessageLength = reader.ReadByte();
item.CompantNameLength = reader.ReadByte();
item.CompantName = reader.ReadString(item.CompantNameLength);
item.ProductModelLength = reader.ReadByte();
item.ProductModel = reader.ReadString(item.ProductModelLength);
item.HardwareVersionNumberLength = reader.ReadByte();
item.HardwareVersionNumber = reader.ReadString(item.HardwareVersionNumberLength);
item.SoftwareVersionNumberLength = reader.ReadByte();
item.SoftwareVersionNumber = reader.ReadString(item.SoftwareVersionNumberLength);
item.DevicesIDLength = reader.ReadByte();
item.DevicesID = reader.ReadString(item.DevicesIDLength);
item.CustomerCodeLength = reader.ReadByte();
item.CustomerCode = reader.ReadString(item.CustomerCodeLength);
value.USBMessages.Add(item);
}
}
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0900_0xF8 value, IJT808Config config)
{
if (value.USBMessages != null && value.USBMessages.Count > 0)
{
writer.WriteByte((byte)value.USBMessages.Count);
foreach (var item in value.USBMessages)
{
writer.WriteByte(item.USBID);
writer.Skip(1,out int messageLengthPosition);

writer.Skip(1, out int CompantNameLengthPosition);
writer.WriteString(item.CompantName);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - CompantNameLengthPosition - 1), CompantNameLengthPosition);

writer.Skip(1, out int ProductModelLengthPosition);
writer.WriteString(item.ProductModel);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - ProductModelLengthPosition - 1), ProductModelLengthPosition);

writer.Skip(1, out int HardwareVersionNumberLengthPosition);
writer.WriteString(item.HardwareVersionNumber);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - HardwareVersionNumberLengthPosition - 1), HardwareVersionNumberLengthPosition);

writer.Skip(1, out int SoftwareVersionNumberLengthPosition);
writer.WriteString(item.SoftwareVersionNumber);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - SoftwareVersionNumberLengthPosition - 1), SoftwareVersionNumberLengthPosition);

writer.Skip(1, out int DevicesIDLengthPosition);
writer.WriteString(item.DevicesID);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - DevicesIDLengthPosition - 1), DevicesIDLengthPosition);

writer.Skip(1, out int CustomerCodeLengthPosition);
writer.WriteString(item.CustomerCode);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - CustomerCodeLengthPosition - 1), CustomerCodeLengthPosition);

writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - messageLengthPosition - 1), messageLengthPosition);
}
}
}
}
}

+ 179
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1210.cs Прегледај датотеку

@@ -0,0 +1,179 @@
using JT808.Protocol.Extensions.YueBiao.Metadata;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 报警附件信息消息
/// </summary>
public class JT808_0x1210: JT808Bodies, IJT808MessagePackFormatter<JT808_0x1210>, IJT808Analyze,IJT808_2019_Version
{
/// <summary>
/// 终端 ID
/// 30 个字节,由大写字母和数字组成,此终端ID 由制造商自行定义,位数不足时,后补“0x00”
/// </summary>
public string TerminalId { get; set; }
/// <summary>
/// 报警标识号
/// </summary>
public AlarmIdentificationProperty AlarmIdentification { get; set; }
/// <summary>
/// 平台给报警分配的唯一编号
/// 32
/// </summary>
public string AlarmId { get; set; }
/// <summary>
/// 信息类型
/// 0x00:正常报警文件信息
/// 0x01:补传报警文件信息
/// </summary>
public byte InfoType { get; set; }
/// <summary>
/// 附件数量
/// </summary>
public byte AttachCount { get; set; }
/// <summary>
/// 附件信息列表
/// </summary>
public List<AttachProperty> AttachInfos { get; set; }
/// <summary>
/// 报警附件信息消息Id
/// </summary>
public override ushort MsgId => 0x1210;
/// <summary>
/// 报警附件信息消息
/// </summary>
public override string Description => "报警附件信息消息";
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x1210 value = new JT808_0x1210();
string makerIdHex=reader.ReadVirtualArray(30).ToArray().ToHexString();
value.TerminalId = reader.ReadString(30);
writer.WriteString($"[{makerIdHex}]终端ID", value.TerminalId);
value.AlarmIdentification = new AlarmIdentificationProperty();
string terminalIdHex = reader.ReadVirtualArray(30).ToArray().ToHexString();
value.AlarmIdentification.TerminalId = reader.ReadString(30);
value.AlarmIdentification.Time = reader.ReadDateTime6();
value.AlarmIdentification.SN = reader.ReadByte();
value.AlarmIdentification.AttachCount = reader.ReadByte();
value.AlarmIdentification.Retain1 = reader.ReadByte();
value.AlarmIdentification.Retain2 = reader.ReadByte();
writer.WriteString($"[{terminalIdHex}]终端ID", value.AlarmIdentification.TerminalId);
writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss"));
writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN);
writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount);
writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1);
writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2);
string alarmIdHex = reader.ReadVirtualArray(32).ToArray().ToHexString();
value.AlarmId = reader.ReadString(32);
writer.WriteString($"[{alarmIdHex}]平台给报警分配的唯一编号", value.AlarmId);
value.InfoType = reader.ReadByte();
writer.WriteNumber($"[{value.InfoType.ReadNumber()}]信息类型", value.InfoType);
value.AttachCount = reader.ReadByte();
writer.WriteNumber($"[{value.AttachCount.ReadNumber()}]附件数量", value.AttachCount);
if (value.AttachCount > 0)
{
writer.WriteStartArray("附件信息列表");
for (int i = 0; i < value.AttachCount; i++)
{
writer.WriteStartObject();
AttachProperty attachProperty = new AttachProperty();
attachProperty.FileNameLength = reader.ReadByte();
writer.WriteNumber($"[{attachProperty.FileNameLength.ReadNumber()}]文件名称长度", attachProperty.FileNameLength);
string fileNameHex = reader.ReadVirtualArray(attachProperty.FileNameLength).ToArray().ToHexString();
attachProperty.FileName = reader.ReadString(attachProperty.FileNameLength);
writer.WriteString($"[{fileNameHex}]文件名称", attachProperty.FileName);
attachProperty.FileSize = reader.ReadUInt32();
writer.WriteNumber($"[{ attachProperty.FileSize.ReadNumber()}]文件大小", attachProperty.FileSize);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x1210 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x1210 value = new JT808_0x1210();
value.TerminalId = reader.ReadString(30);
value.AlarmIdentification = new AlarmIdentificationProperty
{
TerminalId = reader.ReadString(30),
Time = reader.ReadDateTime6(),
SN = reader.ReadByte(),
AttachCount = reader.ReadByte(),
Retain1 = reader.ReadByte(),
Retain2 = reader.ReadByte()
};
value.AlarmId = reader.ReadString(32);
value.InfoType = reader.ReadByte();
value.AttachCount = reader.ReadByte();
if (value.AttachCount > 0)
{
value.AttachInfos = new List<AttachProperty>();
for (int i = 0; i < value.AttachCount; i++)
{
AttachProperty attachProperty = new AttachProperty();
attachProperty.FileNameLength = reader.ReadByte();
attachProperty.FileName = reader.ReadString(attachProperty.FileNameLength);
attachProperty.FileSize = reader.ReadUInt32();
value.AttachInfos.Add(attachProperty);
}
}
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x1210 value, IJT808Config config)
{
writer.WriteString(value.TerminalId.PadRight(30, '\0'));
if (value.AlarmIdentification == null)
{
throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");
}
writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0'));
writer.WriteDateTime6(value.AlarmIdentification.Time);
writer.WriteByte(value.AlarmIdentification.SN);
writer.WriteByte(value.AlarmIdentification.AttachCount);
writer.WriteByte(value.AlarmIdentification.Retain1);
writer.WriteByte(value.AlarmIdentification.Retain2);
writer.WriteString(value.AlarmId);
writer.WriteByte(value.InfoType);
if (value.AttachInfos != null && value.AttachInfos.Count > 0)
{
writer.WriteByte((byte)value.AttachInfos.Count);
foreach (var item in value.AttachInfos)
{
writer.Skip(1, out int FileNameLengthPosition);
writer.WriteString(item.FileName);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - FileNameLengthPosition - 1), FileNameLengthPosition);
writer.WriteUInt32(item.FileSize);
}
}
else
{
writer.WriteByte(0);
}
}
}
}

+ 87
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1211.cs Прегледај датотеку

@@ -0,0 +1,87 @@
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 文件信息上传
/// </summary>
public class JT808_0x1211 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x1211>, IJT808Analyze
{
/// <summary>
/// 文件信息上传
/// </summary>
public override string Description => "文件信息上传";
/// <summary>
/// 文件名称长度
/// </summary>
public byte FileNameLength { get; set; }
/// <summary>
/// 文件名称
/// 形如:文件类型_通道号_报警类型_序号_报警编号.后缀名
/// </summary>
public string FileName { get; set; }
/// <summary>
/// 文件类型
/// </summary>
public byte FileType { get; set; }
/// <summary>
/// 文件大小
/// </summary>
public uint FileSize { get; set; }
/// <summary>
/// 文件信息上传Id
/// </summary>
public override ushort MsgId => 0x1211;
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x1211 value = new JT808_0x1211();
value.FileNameLength = reader.ReadByte();
writer.WriteNumber($"[{value.FileNameLength.ReadNumber()}]文件名称长度", value.FileNameLength);
string fileNameHex = reader.ReadVirtualArray(value.FileNameLength).ToArray().ToHexString();
value.FileName = reader.ReadString(value.FileNameLength);
writer.WriteString($"[{fileNameHex}]文件名称", value.FileName);
value.FileType = reader.ReadByte();
writer.WriteNumber($"[{value.FileType.ReadNumber()}]文件类型", value.FileType);
value.FileSize = reader.ReadUInt32();
writer.WriteNumber($"[{value.FileSize.ReadNumber()}]文件大小", value.FileSize);
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x1211 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x1211 value = new JT808_0x1211();
value.FileNameLength = reader.ReadByte();
value.FileName = reader.ReadString(value.FileNameLength);
value.FileType = reader.ReadByte();
value.FileSize = reader.ReadUInt32();
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x1211 value, IJT808Config config)
{
writer.Skip(1, out int FileNameLengthPosition);
writer.WriteString(value.FileName);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - FileNameLengthPosition - 1), FileNameLengthPosition);
writer.WriteByte(value.FileType);
writer.WriteUInt32(value.FileSize);
}
}
}

+ 87
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x1212.cs Прегледај датотеку

@@ -0,0 +1,87 @@
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 文件上传完成消息
/// </summary>
public class JT808_0x1212 : JT808Bodies, IJT808MessagePackFormatter<JT808_0x1212>, IJT808Analyze
{
/// <summary>
/// 文件上传完成消息
/// </summary>
public override string Description => "文件上传完成消息";
/// <summary>
/// 文件名称长度
/// </summary>
public byte FileNameLength { get; set; }
/// <summary>
/// 文件名称
/// 形如:文件类型_通道号_报警类型_序号_报警编号.后缀名
/// </summary>
public string FileName { get; set; }
/// <summary>
/// 文件类型
/// </summary>
public byte FileType { get; set; }
/// <summary>
/// 文件大小
/// </summary>
public uint FileSize { get; set; }
/// <summary>
/// 文件上传完成消息
/// </summary>
public override ushort MsgId => 0x1212;
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x1212 value = new JT808_0x1212();
value.FileNameLength = reader.ReadByte();
writer.WriteNumber($"[{value.FileNameLength.ReadNumber()}]文件名称长度", value.FileNameLength);
string fileNameHex = reader.ReadVirtualArray(value.FileNameLength).ToArray().ToHexString();
value.FileName = reader.ReadString(value.FileNameLength);
writer.WriteString($"[{fileNameHex}]文件名称", value.FileName);
value.FileType = reader.ReadByte();
writer.WriteNumber($"[{value.FileType.ReadNumber()}]文件类型", value.FileType);
value.FileSize = reader.ReadUInt32();
writer.WriteNumber($"[{value.FileSize.ReadNumber()}]文件大小", value.FileSize);
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x1212 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x1212 value = new JT808_0x1212();
value.FileNameLength = reader.ReadByte();
value.FileName = reader.ReadString(value.FileNameLength);
value.FileType = reader.ReadByte();
value.FileSize = reader.ReadUInt32();
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x1212 value, IJT808Config config)
{
writer.Skip(1, out int FileNameLengthPosition);
writer.WriteString(value.FileName);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - FileNameLengthPosition - 1), FileNameLengthPosition);
writer.WriteByte(value.FileType);
writer.WriteUInt32(value.FileSize);
}
}
}

+ 456
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF364.cs Прегледај датотеку

@@ -0,0 +1,456 @@
using JT808.Protocol.Extensions.YueBiao.Enums;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 高级驾驶辅助系统参数
/// </summary>
public class JT808_0x8103_0xF364 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter<JT808_0x8103_0xF364>, IJT808Analyze
{
/// <summary>
/// 高级驾驶辅助系统参数
/// </summary>
public override uint ParamId { get; set; } = JT808_YueBiao_Constants.JT808_0X8103_0xF364;
/// <summary>
/// 高级驾驶辅助系统参数长度
/// </summary>
public override byte ParamLength { get; set; }
/// <summary>
/// 报警判断速度阈值
/// </summary>
public byte AlarmJudgeSpeedThreshold { get; set; }
/// <summary>
/// 报警提示音量
/// </summary>
public byte WarningVolume { get; set; }
/// <summary>
/// 主动拍照策略
/// <see cref="JT808.Protocol.Extensions.YueBiao.Enums.ActivePhotographyStrategyType"/>
/// </summary>
public byte ActivePhotographyStrategy { get; set; }
/// <summary>
/// 主动定时拍照时间间隔
/// </summary>
public ushort ActivelyTimePhotoInterval { get; set; }
/// <summary>
/// 主动定距拍照距离间隔
/// </summary>
public ushort ActiveDistancePhotographyDistanceInterval { get; set; }
/// <summary>
/// 单次主动拍照张数
/// </summary>
public byte SingleInitiativePhotos { get; set; }
/// <summary>
/// 单次主动拍照时间间隔
/// </summary>
public byte SingleInitiativePhotosInterval { get; set; }
/// <summary>
/// 拍照分辨率
/// <see cref="JT808.Protocol.Extensions.YueBiao.Enums.PhotoResolutionType"/>
/// </summary>
public byte PhotoResolution { get; set; }
/// <summary>
/// 视频录制分辨率
/// </summary>
public byte VideoRecordingResolution { get; set; }
/// <summary>
/// 报警使能
/// </summary>
public uint AlarmEnable { get; set; }
/// <summary>
/// 事件使能
/// </summary>
public uint EventEnable { get; set; }
/// <summary>
/// 预留字段
/// </summary>
public byte Placeholder1 { get; set; }
/// <summary>
/// 障碍物报警距离阈值
/// </summary>
public byte DistanceThresholdObstacleAlarm { get; set; }
/// <summary>
/// 障碍物报警分级速度阈值
/// </summary>
public byte HierarchicalSpeedThresholdObstacleAlarm { get; set; }
/// <summary>
/// 障碍物报警前后视频录制时间
/// </summary>
public byte VideoRecordingTimeBeforeAndAfterObstacleAlarm { get; set; }
/// <summary>
/// 障碍物报警拍照张数
/// </summary>
public byte BarrierAlarmPhotographs { get; set; }
/// <summary>
/// 障碍物报警拍照间隔
/// </summary>
public byte ObstacleAlarmInterval { get; set; }
/// <summary>
/// 频繁变道报警判断时间段
/// </summary>
public byte FrequentChannelChangeAlarmJudgmentTimePeriod { get; set; }

/// <summary>
/// 频繁变道报警判断次数
/// </summary>
public byte FrequentAlarmJudgmentNumberChannelChange { get; set; }
/// <summary>
/// 频繁变道报警分级速度阈值
/// </summary>
public byte HierarchicalSpeedThresholdFrequentChannelChangeAlarm { get; set; }
/// <summary>
/// 频繁变道报警前后视频录制时间
/// </summary>
public byte VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm { get; set; }
/// <summary>
/// 频繁变道报警拍照张数
/// </summary>
public byte FrequentChannelChangeAlarmPhotos { get; set; }
/// <summary>
/// 频繁变道报警拍照间隔
/// </summary>
public byte FrequentLaneChangeAlarmInterval { get; set; }
/// <summary>
/// 车道偏离报警分级速度阈值
/// </summary>
public byte GradedSpeedThresholdLaneDeviationAlarm { get; set; }
/// <summary>
/// 车道偏离报警前后视频录制时间
/// </summary>
public byte VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm { get; set; }
/// <summary>
/// 车道偏离报警拍照张数
/// </summary>
public byte LaneDepartureAlarmPhoto { get; set; }
/// <summary>
/// 车道偏离报警拍照间隔
/// </summary>
public byte LaneDepartureAlarmPhotoInterval { get; set; }
/// <summary>
/// 前向碰撞报警时间阈值
/// </summary>
public byte ForwardCollisionWarningTimeThreshold { get; set; }
/// <summary>
/// 前向碰撞报警分级速度阈值
/// </summary>
public byte HierarchicalSpeedThresholdForwardCollisionWarning { get; set; }
/// <summary>
/// 前向碰撞报警前后视频录制时间
/// </summary>
public byte VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm { get; set; }
/// <summary>
/// 前向碰撞报警拍照张数
/// </summary>
public byte ForwardCollisionAlarmPhotographs { get; set; }
/// <summary>
/// 前向碰撞报警拍照间隔
/// </summary>
public byte ForwardCollisionAlarmInterval { get; set; }
/// <summary>
/// 行人碰撞报警时间阈值
/// </summary>
public byte PedestrianCollisionAlarmTimeThreshold { get; set; }
/// <summary>
/// 行人碰撞报警使能速度阈值
/// </summary>
public byte PedestrianCollisionAlarmEnablingSpeedThreshold { get; set; }
/// <summary>
/// 行人碰撞报警前后视频录制时间
/// </summary>
public byte VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm { get; set; }
/// <summary>
/// 行人碰撞报警拍照张数
/// </summary>
public byte PedestrianCollisionAlarmPhotos { get; set; }
/// <summary>
/// 行人碰撞报警拍照间隔
/// </summary>
public byte PedestrianCollisionAlarmInterval { get; set; }
/// <summary>
/// 车距监控报警距离阈值
/// </summary>
public byte VehicleDistanceMonitoringAlarmDistanceThreshold { get; set; }
/// <summary>
/// 车距监控报警分级速度阈值
/// </summary>
public byte VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold { get; set; }
/// <summary>
/// 车距过近报警前后视频录制时间
/// </summary>
public byte VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity { get; set; }
/// <summary>
/// 车距过近报警拍照张数
/// </summary>
public byte AlarmPhotoVehicleCloseDistance { get; set; }
/// <summary>
/// 车距过近报警拍照间隔
/// </summary>
public byte AlarmPhotoVehicleCloseDistanceInterval { get; set; }
/// <summary>
/// 道路标志识别拍照张数
/// </summary>
public byte RoadSignRecognitionPhotographs { get; set; }
/// <summary>
/// 道路标志识别拍照间隔
/// </summary>
public byte RoadSignRecognitionPhotographsInterval { get; set; }
/// <summary>
/// 保留字段
/// </summary>
public byte[] Placeholder2 { get; set; } = new byte[4];
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x8103_0xF364 value = new JT808_0x8103_0xF364();
value.ParamId = reader.ReadUInt32();
value.ParamLength = reader.ReadByte();
writer.WriteNumber($"[{value.ParamId.ReadNumber()}]参数ID", value.ParamId);
writer.WriteNumber($"[{value.ParamLength.ReadNumber()}]参数长度", value.ParamLength);
value.AlarmJudgeSpeedThreshold = reader.ReadByte();
writer.WriteNumber($"[{value.AlarmJudgeSpeedThreshold.ReadNumber()}]报警判断速度阈值", value.AlarmJudgeSpeedThreshold);
value.WarningVolume = reader.ReadByte();
writer.WriteNumber($"[{value.WarningVolume.ReadNumber()}]报警提示音量", value.WarningVolume);
value.ActivePhotographyStrategy = reader.ReadByte();
var activePhotographyStrategy = (ActivePhotographyStrategyType)ActivePhotographyStrategy;
writer.WriteNumber($"[{value.ActivePhotographyStrategy.ReadNumber()}]主动拍照策略-{activePhotographyStrategy.ToString()}", value.ActivePhotographyStrategy);
value.ActivelyTimePhotoInterval = reader.ReadUInt16();
writer.WriteNumber($"[{value.ActivelyTimePhotoInterval.ReadNumber()}]主动定时拍照时间间隔", value.ActivelyTimePhotoInterval);
value.ActiveDistancePhotographyDistanceInterval = reader.ReadUInt16();
writer.WriteNumber($"[{value.ActiveDistancePhotographyDistanceInterval.ReadNumber()}]主动定距拍照距离间隔", value.ActiveDistancePhotographyDistanceInterval);
value.SingleInitiativePhotos = reader.ReadByte();
writer.WriteNumber($"[{value.SingleInitiativePhotos.ReadNumber()}]单次主动拍照张数", value.SingleInitiativePhotos);
value.SingleInitiativePhotosInterval = reader.ReadByte();
writer.WriteNumber($"[{value.SingleInitiativePhotosInterval.ReadNumber()}]单次主动拍照时间间隔", value.SingleInitiativePhotosInterval);
value.PhotoResolution = reader.ReadByte();
var photoResolutionType = (PhotoResolutionType)value.PhotoResolution;
writer.WriteNumber($"[{value.PhotoResolution.ReadNumber()}]拍照分辨率-{photoResolutionType.ToString()}", value.PhotoResolution);
value.VideoRecordingResolution = reader.ReadByte();
var videoRecordingResolution = (VideoRecordingResolutionType)value.VideoRecordingResolution;
writer.WriteNumber($"[{value.VideoRecordingResolution.ReadNumber()}]视频录制分辨率-{videoRecordingResolution.ToString()}", value.VideoRecordingResolution);
value.AlarmEnable = reader.ReadUInt32();
writer.WriteNumber($"[{value.AlarmEnable.ReadNumber()}]报警使能", value.AlarmEnable);
var alarmEnableBits = Convert.ToString(value.AlarmEnable, 2).PadLeft(32, '0').AsSpan();
writer.WriteStartObject("报警使能对象");
writer.WriteString("[bit30~bit31]预留", alarmEnableBits.Slice(30,2).ToString());
writer.WriteString("[bit17~bit29]用户自定义", alarmEnableBits.Slice(17, 13).ToString());
writer.WriteString("[bit16]道路标识超限报警", alarmEnableBits[16]=='0'?"关闭":"打开");
writer.WriteString("[bit12~bit15]道路标识超限报警", alarmEnableBits.Slice(12, 4).ToString());
writer.WriteString("[bit11]车距过近二级报警", alarmEnableBits[11] == '0' ? "关闭" : "打开");
writer.WriteString("[bit10]车距过近一级报警", alarmEnableBits[10] == '0' ? "关闭" : "打开");
writer.WriteString("[bit9]行人碰撞二级报警", alarmEnableBits[9] == '0' ? "关闭" : "打开");
writer.WriteString("[bit8]行人碰撞一级报警", alarmEnableBits[8] == '0' ? "关闭" : "打开");
writer.WriteString("[bit7]前向碰撞二级报警", alarmEnableBits[7] == '0' ? "关闭" : "打开");
writer.WriteString("[bit6]前向碰撞一级报警", alarmEnableBits[6] == '0' ? "关闭" : "打开");
writer.WriteString("[bit5]车道偏离二级报警", alarmEnableBits[5] == '0' ? "关闭" : "打开");
writer.WriteString("[bit4]车道偏离一级报警", alarmEnableBits[4] == '0' ? "关闭" : "打开");
writer.WriteString("[bit3]频繁变道二级报警", alarmEnableBits[3] == '0' ? "关闭" : "打开");
writer.WriteString("[bit2]频繁变道一级报警", alarmEnableBits[2] == '0' ? "关闭" : "打开");
writer.WriteString("[bit1]障碍检测二级报警", alarmEnableBits[1] == '0' ? "关闭" : "打开");
writer.WriteString("[bit0]障碍检测一级报警", alarmEnableBits[0] == '0' ? "关闭" : "打开");
writer.WriteEndObject();
value.EventEnable = reader.ReadUInt32();
writer.WriteNumber($"[{value.EventEnable.ReadNumber()}]事件使能", value.EventEnable);
var eventEnableBits = Convert.ToString(value.EventEnable, 2).PadLeft(32, '0').AsSpan();
writer.WriteStartObject("事件使能对象");
writer.WriteString("[bit30~bit31]预留", eventEnableBits.Slice(30, 2).ToString());
writer.WriteString("[bit2~bit29]用户自定义", alarmEnableBits.Slice(2, 28).ToString());
writer.WriteString("[bit1]主动拍照", alarmEnableBits[1] == '0' ? "关闭" : "打开");
writer.WriteString("[bit0]道路标识识别", alarmEnableBits[0] == '0' ? "关闭" : "打开");
writer.WriteEndObject();
value.Placeholder1 = reader.ReadByte();
writer.WriteNumber($"[{value.Placeholder1.ReadNumber()}]预留字段", value.Placeholder1);
value.DistanceThresholdObstacleAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.DistanceThresholdObstacleAlarm.ReadNumber()}]障碍物报警距离阈值", value.DistanceThresholdObstacleAlarm);
value.HierarchicalSpeedThresholdObstacleAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.HierarchicalSpeedThresholdObstacleAlarm.ReadNumber()}]障碍物报警分级速度阈值", value.HierarchicalSpeedThresholdObstacleAlarm);
value.VideoRecordingTimeBeforeAndAfterObstacleAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterObstacleAlarm.ReadNumber()}]障碍物报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterObstacleAlarm);
value.BarrierAlarmPhotographs = reader.ReadByte();
writer.WriteNumber($"[{value.BarrierAlarmPhotographs.ReadNumber()}]障碍物报警拍照张数", value.BarrierAlarmPhotographs);
value.ObstacleAlarmInterval = reader.ReadByte();
writer.WriteNumber($"[{value.ObstacleAlarmInterval.ReadNumber()}]障碍物报警拍照间隔", value.ObstacleAlarmInterval);
value.FrequentChannelChangeAlarmJudgmentTimePeriod = reader.ReadByte();
writer.WriteNumber($"[{value.FrequentChannelChangeAlarmJudgmentTimePeriod.ReadNumber()}]频繁变道报警判断时间段", value.FrequentChannelChangeAlarmJudgmentTimePeriod);
value.FrequentAlarmJudgmentNumberChannelChange = reader.ReadByte();
writer.WriteNumber($"[{value.FrequentAlarmJudgmentNumberChannelChange.ReadNumber()}]频繁变道报警判断次数", value.FrequentAlarmJudgmentNumberChannelChange);
value.HierarchicalSpeedThresholdFrequentChannelChangeAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.HierarchicalSpeedThresholdFrequentChannelChangeAlarm.ReadNumber()}]频繁变道报警分级速度阈值", value.HierarchicalSpeedThresholdFrequentChannelChangeAlarm);
value.VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm.ReadNumber()}]频繁变道报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm);
value.FrequentChannelChangeAlarmPhotos = reader.ReadByte();
writer.WriteNumber($"[{value.FrequentChannelChangeAlarmPhotos.ReadNumber()}]频繁变道报警拍照张数", value.FrequentChannelChangeAlarmPhotos);
value.FrequentLaneChangeAlarmInterval = reader.ReadByte();
writer.WriteNumber($"[{value.FrequentLaneChangeAlarmInterval.ReadNumber()}]频繁变道报警拍照间隔", value.FrequentLaneChangeAlarmInterval);
value.GradedSpeedThresholdLaneDeviationAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.GradedSpeedThresholdLaneDeviationAlarm.ReadNumber()}]车道偏离报警分级速度阈值", value.GradedSpeedThresholdLaneDeviationAlarm);
value.VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm.ReadNumber()}]车道偏离报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm);
value.LaneDepartureAlarmPhoto = reader.ReadByte();
writer.WriteNumber($"[{value.LaneDepartureAlarmPhoto.ReadNumber()}]车道偏离报警拍照张数", value.LaneDepartureAlarmPhoto);
value.LaneDepartureAlarmPhotoInterval = reader.ReadByte();
writer.WriteNumber($"[{value.LaneDepartureAlarmPhotoInterval.ReadNumber()}]车道偏离报警拍照间隔", value.LaneDepartureAlarmPhotoInterval);
value.ForwardCollisionWarningTimeThreshold = reader.ReadByte();
writer.WriteNumber($"[{value.ForwardCollisionWarningTimeThreshold.ReadNumber()}]前向碰撞报警时间阈值", value.ForwardCollisionWarningTimeThreshold);
value.HierarchicalSpeedThresholdForwardCollisionWarning = reader.ReadByte();
writer.WriteNumber($"[{value.HierarchicalSpeedThresholdForwardCollisionWarning.ReadNumber()}]前向碰撞报警分级速度阈值", value.HierarchicalSpeedThresholdForwardCollisionWarning);
value.VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm.ReadNumber()}]前向碰撞报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm);
value.ForwardCollisionAlarmPhotographs = reader.ReadByte();
writer.WriteNumber($"[{value.ForwardCollisionAlarmPhotographs.ReadNumber()}]前向碰撞报警拍照张数", value.ForwardCollisionAlarmPhotographs);
value.ForwardCollisionAlarmInterval = reader.ReadByte();
writer.WriteNumber($"[{value.ForwardCollisionAlarmInterval.ReadNumber()}]前向碰撞报警拍照间隔", value.ForwardCollisionAlarmInterval);
value.PedestrianCollisionAlarmTimeThreshold = reader.ReadByte();
writer.WriteNumber($"[{value.PedestrianCollisionAlarmTimeThreshold.ReadNumber()}]行人碰撞报警时间阈值", value.PedestrianCollisionAlarmTimeThreshold);
value.PedestrianCollisionAlarmEnablingSpeedThreshold = reader.ReadByte();
writer.WriteNumber($"[{value.PedestrianCollisionAlarmEnablingSpeedThreshold.ReadNumber()}]行人碰撞报警使能速度阈值", value.PedestrianCollisionAlarmEnablingSpeedThreshold);
value.VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm.ReadNumber()}]行人碰撞报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm);
value.PedestrianCollisionAlarmPhotos = reader.ReadByte();
writer.WriteNumber($"[{value.PedestrianCollisionAlarmPhotos.ReadNumber()}]行人碰撞报警拍照张数", value.PedestrianCollisionAlarmPhotos);
value.PedestrianCollisionAlarmInterval = reader.ReadByte();
writer.WriteNumber($"[{value.PedestrianCollisionAlarmInterval.ReadNumber()}]行人碰撞报警拍照间隔", value.PedestrianCollisionAlarmInterval);
value.VehicleDistanceMonitoringAlarmDistanceThreshold = reader.ReadByte();
writer.WriteNumber($"[{value.VehicleDistanceMonitoringAlarmDistanceThreshold.ReadNumber()}]车距监控报警距离阈值", value.VehicleDistanceMonitoringAlarmDistanceThreshold);
value.VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold = reader.ReadByte();
writer.WriteNumber($"[{value.VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold.ReadNumber()}]车距监控报警分级速度阈值", value.VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold);
value.VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity = reader.ReadByte();
writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity.ReadNumber()}]车距过近报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity);
value.AlarmPhotoVehicleCloseDistance = reader.ReadByte();
writer.WriteNumber($"[{value.AlarmPhotoVehicleCloseDistance.ReadNumber()}]车距过近报警拍照张数", value.AlarmPhotoVehicleCloseDistance);
value.AlarmPhotoVehicleCloseDistanceInterval = reader.ReadByte();
writer.WriteNumber($"[{value.AlarmPhotoVehicleCloseDistanceInterval.ReadNumber()}]车距过近报警拍照间隔", value.AlarmPhotoVehicleCloseDistanceInterval);
value.RoadSignRecognitionPhotographs = reader.ReadByte();
writer.WriteNumber($"[{value.RoadSignRecognitionPhotographs.ReadNumber()}]道路标志识别拍照张数", value.RoadSignRecognitionPhotographs);
value.RoadSignRecognitionPhotographsInterval = reader.ReadByte();
writer.WriteNumber($"[{value.RoadSignRecognitionPhotographsInterval.ReadNumber()}]道路标志识别拍照间隔", value.RoadSignRecognitionPhotographsInterval);
value.Placeholder2 = reader.ReadArray(4).ToArray();
writer.WriteString("保留字段", value.Placeholder2.ToHexString());
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x8103_0xF364 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x8103_0xF364 value = new JT808_0x8103_0xF364();
value.ParamId = reader.ReadUInt32();
value.ParamLength = reader.ReadByte();
value.AlarmJudgeSpeedThreshold = reader.ReadByte();
value.WarningVolume = reader.ReadByte();
value.ActivePhotographyStrategy = reader.ReadByte();
value.ActivelyTimePhotoInterval = reader.ReadUInt16();
value.ActiveDistancePhotographyDistanceInterval = reader.ReadUInt16();
value.SingleInitiativePhotos = reader.ReadByte();
value.SingleInitiativePhotosInterval = reader.ReadByte();
value.PhotoResolution = reader.ReadByte();
value.VideoRecordingResolution = reader.ReadByte();
value.AlarmEnable = reader.ReadUInt32();
value.EventEnable = reader.ReadUInt32();
value.Placeholder1 = reader.ReadByte();
value.DistanceThresholdObstacleAlarm = reader.ReadByte();
value.HierarchicalSpeedThresholdObstacleAlarm = reader.ReadByte();
value.VideoRecordingTimeBeforeAndAfterObstacleAlarm = reader.ReadByte();
value.BarrierAlarmPhotographs = reader.ReadByte();
value.ObstacleAlarmInterval = reader.ReadByte();
value.FrequentChannelChangeAlarmJudgmentTimePeriod = reader.ReadByte();
value.FrequentAlarmJudgmentNumberChannelChange = reader.ReadByte();
value.HierarchicalSpeedThresholdFrequentChannelChangeAlarm = reader.ReadByte();
value.VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm = reader.ReadByte();
value.FrequentChannelChangeAlarmPhotos = reader.ReadByte();
value.FrequentLaneChangeAlarmInterval = reader.ReadByte();
value.GradedSpeedThresholdLaneDeviationAlarm = reader.ReadByte();
value.VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm = reader.ReadByte();
value.LaneDepartureAlarmPhoto = reader.ReadByte();
value.LaneDepartureAlarmPhotoInterval = reader.ReadByte();
value.ForwardCollisionWarningTimeThreshold = reader.ReadByte();
value.HierarchicalSpeedThresholdForwardCollisionWarning = reader.ReadByte();
value.VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm = reader.ReadByte();
value.ForwardCollisionAlarmPhotographs = reader.ReadByte();
value.ForwardCollisionAlarmInterval = reader.ReadByte();
value.PedestrianCollisionAlarmTimeThreshold = reader.ReadByte();
value.PedestrianCollisionAlarmEnablingSpeedThreshold = reader.ReadByte();
value.VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm = reader.ReadByte();
value.PedestrianCollisionAlarmPhotos = reader.ReadByte();
value.PedestrianCollisionAlarmInterval = reader.ReadByte();
value.VehicleDistanceMonitoringAlarmDistanceThreshold = reader.ReadByte();
value.VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold = reader.ReadByte();
value.VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity = reader.ReadByte();
value.AlarmPhotoVehicleCloseDistance = reader.ReadByte();
value.AlarmPhotoVehicleCloseDistanceInterval = reader.ReadByte();
value.RoadSignRecognitionPhotographs = reader.ReadByte();
value.RoadSignRecognitionPhotographsInterval = reader.ReadByte();
value.Placeholder2 = reader.ReadArray(4).ToArray();
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0xF364 value, IJT808Config config)
{
writer.WriteUInt32(value.ParamId);
writer.Skip(1, out int ParamLengthPosition);
writer.WriteByte(value.AlarmJudgeSpeedThreshold);
writer.WriteByte(value.WarningVolume);
writer.WriteByte(value.ActivePhotographyStrategy);
writer.WriteUInt16(value.ActivelyTimePhotoInterval);
writer.WriteUInt16(value.ActiveDistancePhotographyDistanceInterval);
writer.WriteByte(value.SingleInitiativePhotos);
writer.WriteByte(value.SingleInitiativePhotosInterval);
writer.WriteByte(value.PhotoResolution);
writer.WriteByte(value.VideoRecordingResolution);
writer.WriteUInt32(value.AlarmEnable);
writer.WriteUInt32(value.EventEnable);
writer.WriteByte(value.Placeholder1);
writer.WriteByte(value.DistanceThresholdObstacleAlarm);
writer.WriteByte(value.HierarchicalSpeedThresholdObstacleAlarm);
writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterObstacleAlarm);
writer.WriteByte(value.BarrierAlarmPhotographs);
writer.WriteByte(value.ObstacleAlarmInterval);
writer.WriteByte(value.FrequentChannelChangeAlarmJudgmentTimePeriod);
writer.WriteByte(value.FrequentAlarmJudgmentNumberChannelChange);
writer.WriteByte(value.HierarchicalSpeedThresholdFrequentChannelChangeAlarm);
writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterFrequentLaneChangeAlarm);
writer.WriteByte(value.FrequentChannelChangeAlarmPhotos);
writer.WriteByte(value.FrequentLaneChangeAlarmInterval);
writer.WriteByte(value.GradedSpeedThresholdLaneDeviationAlarm);
writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterLaneDepartureAlarm);
writer.WriteByte(value.LaneDepartureAlarmPhoto);
writer.WriteByte(value.LaneDepartureAlarmPhotoInterval);
writer.WriteByte(value.ForwardCollisionWarningTimeThreshold);
writer.WriteByte(value.HierarchicalSpeedThresholdForwardCollisionWarning);
writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterForwardCollisionAlarm);
writer.WriteByte(value.ForwardCollisionAlarmPhotographs);
writer.WriteByte(value.ForwardCollisionAlarmInterval);
writer.WriteByte(value.PedestrianCollisionAlarmTimeThreshold);
writer.WriteByte(value.PedestrianCollisionAlarmEnablingSpeedThreshold);
writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterPedestrianCollisionAlarm);
writer.WriteByte(value.PedestrianCollisionAlarmPhotos);
writer.WriteByte(value.PedestrianCollisionAlarmInterval);
writer.WriteByte(value.VehicleDistanceMonitoringAlarmDistanceThreshold);
writer.WriteByte(value.VehicleDistanceMonitoringAndAlarmClassificationSpeedThreshold);
writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterAlarmVehicleProximity);
writer.WriteByte(value.AlarmPhotoVehicleCloseDistance);
writer.WriteByte(value.AlarmPhotoVehicleCloseDistanceInterval);
writer.WriteByte(value.RoadSignRecognitionPhotographs);
writer.WriteByte(value.RoadSignRecognitionPhotographsInterval);
writer.WriteArray(value.Placeholder2);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - ParamLengthPosition - 1), ParamLengthPosition);
}
}
}

+ 365
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF365.cs Прегледај датотеку

@@ -0,0 +1,365 @@
using JT808.Protocol.Extensions.YueBiao.Enums;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 驾驶员状态监测系统参数
/// </summary>
public class JT808_0x8103_0xF365 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter<JT808_0x8103_0xF365>, IJT808Analyze
{
/// <summary>
/// 驾驶员状态监测系统参数
/// </summary>
public override uint ParamId { get; set; } = JT808_YueBiao_Constants.JT808_0X8103_0xF365;
/// <summary>
/// 驾驶员状态监测系统参数长度
/// </summary>
public override byte ParamLength { get; set; }
/// <summary>
/// 报警判断速度阈值
/// </summary>
public byte AlarmJudgeSpeedThreshold { get; set; }
/// <summary>
/// 报警提示音量
/// </summary>
public byte WarningVolume { get; set; }
/// <summary>
/// 主动拍照策略
/// </summary>
public byte ActivePhotographyStrategy { get; set; }
/// <summary>
/// 主动定时拍照时间间隔
/// </summary>
public ushort ActivelyTimePhotoInterval { get; set; }
/// <summary>
/// 主动定距拍照距离间隔
/// </summary>
public ushort ActiveDistancePhotographyDistanceInterval { get; set; }
/// <summary>
/// 单次主动拍照张数
/// </summary>
public byte SingleInitiativePhotos { get; set; }
/// <summary>
/// 单次主动拍照时间间隔
/// </summary>
public byte SingleInitiativePhotosInterval { get; set; }
/// <summary>
/// 拍照分辨率
/// </summary>
public byte PhotoResolution { get; set; }
/// <summary>
/// 视频录制分辨率
/// </summary>
public byte VideoRecordingResolution { get; set; }
/// <summary>
/// 报警使能
/// </summary>
public uint AlarmEnable { get; set; }
/// <summary>
/// 事件使能
/// </summary>
public uint EventEnable { get; set; }
/// <summary>
/// 吸烟报警判断时间间隔
/// </summary>
public ushort TimeIntervalSmokingAlarmJudgment { get; set; }
/// <summary>
/// 接打电话报警判断时间间隔
/// </summary>
public ushort CallAlarmDetermineTimeInterval{ get; set; }
/// <summary>
/// 预留字段
/// </summary>
public byte[] Reserve { get; set; } = new byte[3];
/// <summary>
/// 疲劳驾驶报警分级速度阈值
/// </summary>
public byte GradedSpeedThresholdFatigueDrivingAlarm { get; set; }
/// <summary>
/// 疲劳驾驶报警前后视频录制时间
/// </summary>
public byte VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm { get; set; }
/// <summary>
/// 疲劳驾驶报警拍照张数
/// </summary>
public byte FatigueDrivingAlarmPhotograph { get; set; }
/// <summary>
/// 疲劳驾驶报警拍照间隔时间
/// </summary>
public byte FatigueDrivingAlarmPhotographInterval { get; set; }
/// <summary>
/// 接打电话报警分级速度阈值
/// </summary>
public byte ClassifiedSpeedThresholdCallAlarm{ get; set; }
/// <summary>
/// 接打电话报警前后视频录制时间
/// </summary>
public byte VideoRecordingTimeBeforeAndAfterCallAlarm{ get; set; }
/// <summary>
/// 接打电话报警拍驾驶员面部特征照片张数
/// </summary>
public byte CallAlarmTakePicturesDriverFacialFeatures{ get; set; }
/// <summary>
/// 接打电话报警拍驾驶员面部特征照片间隔时间
/// </summary>
public byte CallAlarmTakePicturesDriverFacialFeaturesInterval { get; set; }
/// <summary>
/// 抽烟报警分级车速阈值
/// </summary>
public byte ClassifiedSpeedThresholdSmokingAlarm{ get; set; }
/// <summary>
/// 抽烟报警前后视频录制时间
/// </summary>
public byte VideoRecordingTimeBeforeAndAfterSmokingAlarm{ get; set; }
/// <summary>
/// 抽烟报警拍驾驶员面部特征照片张数
/// </summary>
public byte SmokingAlarmPhotographsDriverFaceCharacteristics { get; set; }
/// <summary>
/// 抽烟报警拍驾驶员面部特征照片间隔时间
/// </summary>
public byte SmokingAlarmPhotographsDriverFaceCharacteristicsInterval { get; set; }
/// <summary>
/// 分神驾驶报警分级车速阈值
/// </summary>
public byte ClassifiedSpeedThresholdDistractedDrivingAlarm { get; set; }
/// <summary>
/// 分神驾驶报警拍照张数
/// </summary>
public byte DistractedDrivingAlarmPhotography{ get; set; }
/// <summary>
/// 分神驾驶报警拍照间隔时间
/// </summary>
public byte DistractedDrivingAlarmPhotographyInterval { get; set; }
/// <summary>
/// 驾驶行为异常视频录制时间
/// </summary>
public byte VideoRecordingTimeAbnormalDrivingBehavior{ get; set; }
/// <summary>
/// 驾驶行为异常抓拍照片张数
/// </summary>
public byte PhotographsAbnormalDrivingBehavior{ get; set; }
/// <summary>
/// 驾驶行为异常拍照间隔
/// </summary>
public byte PictureIntervalAbnormalDrivingBehavior{ get; set; }
/// <summary>
/// 驾驶员身份识别触发
/// </summary>
public byte DriverIdentificationTrigger { get; set; }
/// <summary>
/// 保留字段
/// </summary>
public byte[] Retain { get; set; } = new byte[2];
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x8103_0xF365 value = new JT808_0x8103_0xF365();
value.ParamId = reader.ReadUInt32();
value.ParamLength = reader.ReadByte();
writer.WriteNumber($"[{value.ParamId.ReadNumber()}]参数ID", value.ParamId);
writer.WriteNumber($"[{value.ParamLength.ReadNumber()}]参数长度", value.ParamLength);
value.AlarmJudgeSpeedThreshold = reader.ReadByte();
writer.WriteNumber($"[{value.AlarmJudgeSpeedThreshold.ReadNumber()}]报警判断速度阈值", value.AlarmJudgeSpeedThreshold);
value.WarningVolume = reader.ReadByte();
writer.WriteNumber($"[{value.WarningVolume.ReadNumber()}]报警提示音量", value.WarningVolume);
value.ActivePhotographyStrategy = reader.ReadByte();
var activePhotographyStrategy = (ActivePhotographyStrategyType)ActivePhotographyStrategy;
writer.WriteNumber($"[{value.ActivePhotographyStrategy.ReadNumber()}]主动拍照策略-{activePhotographyStrategy.ToString()}", value.ActivePhotographyStrategy);
value.ActivelyTimePhotoInterval = reader.ReadUInt16();
writer.WriteNumber($"[{value.ActivelyTimePhotoInterval.ReadNumber()}]主动定时拍照时间间隔", value.ActivelyTimePhotoInterval);
value.ActiveDistancePhotographyDistanceInterval = reader.ReadUInt16();
writer.WriteNumber($"[{value.ActiveDistancePhotographyDistanceInterval.ReadNumber()}]主动定距拍照距离间隔", value.ActiveDistancePhotographyDistanceInterval);
value.SingleInitiativePhotos = reader.ReadByte();
writer.WriteNumber($"[{value.SingleInitiativePhotos.ReadNumber()}]单次主动拍照张数", value.SingleInitiativePhotos);
value.SingleInitiativePhotosInterval = reader.ReadByte();
writer.WriteNumber($"[{value.SingleInitiativePhotosInterval.ReadNumber()}]单次主动拍照时间间隔", value.SingleInitiativePhotosInterval);
value.PhotoResolution = reader.ReadByte();
var photoResolutionType = (PhotoResolutionType)value.PhotoResolution;
writer.WriteNumber($"[{value.PhotoResolution.ReadNumber()}]拍照分辨率-{photoResolutionType.ToString()}", value.PhotoResolution);
value.VideoRecordingResolution = reader.ReadByte();
var videoRecordingResolution = (VideoRecordingResolutionType)value.VideoRecordingResolution;
writer.WriteNumber($"[{value.VideoRecordingResolution.ReadNumber()}]视频录制分辨率-{videoRecordingResolution.ToString()}", value.VideoRecordingResolution);
value.AlarmEnable = reader.ReadUInt32();
writer.WriteNumber($"[{value.AlarmEnable.ReadNumber()}]报警使能", value.AlarmEnable);
var alarmEnableBits = Convert.ToString(value.AlarmEnable, 2).PadLeft(32, '0').AsSpan();
writer.WriteStartObject("报警使能对象");
writer.WriteString("[bit30~bit31]预留", alarmEnableBits.Slice(30, 2).ToString());
writer.WriteString("[bit17~bit29]用户自定义", alarmEnableBits.Slice(17, 13).ToString());
writer.WriteString("[bit16]道路标识超限报警", alarmEnableBits[16] == '0' ? "关闭" : "打开");
writer.WriteString("[bit12~bit15]道路标识超限报警", alarmEnableBits.Slice(12, 4).ToString());
writer.WriteString("[bit11]车距过近二级报警", alarmEnableBits[11] == '0' ? "关闭" : "打开");
writer.WriteString("[bit10]车距过近一级报警", alarmEnableBits[10] == '0' ? "关闭" : "打开");
writer.WriteString("[bit9]行人碰撞二级报警", alarmEnableBits[9] == '0' ? "关闭" : "打开");
writer.WriteString("[bit8]行人碰撞一级报警", alarmEnableBits[8] == '0' ? "关闭" : "打开");
writer.WriteString("[bit7]前向碰撞二级报警", alarmEnableBits[7] == '0' ? "关闭" : "打开");
writer.WriteString("[bit6]前向碰撞一级报警", alarmEnableBits[6] == '0' ? "关闭" : "打开");
writer.WriteString("[bit5]车道偏离二级报警", alarmEnableBits[5] == '0' ? "关闭" : "打开");
writer.WriteString("[bit4]车道偏离一级报警", alarmEnableBits[4] == '0' ? "关闭" : "打开");
writer.WriteString("[bit3]频繁变道二级报警", alarmEnableBits[3] == '0' ? "关闭" : "打开");
writer.WriteString("[bit2]频繁变道一级报警", alarmEnableBits[2] == '0' ? "关闭" : "打开");
writer.WriteString("[bit1]障碍检测二级报警", alarmEnableBits[1] == '0' ? "关闭" : "打开");
writer.WriteString("[bit0]障碍检测一级报警", alarmEnableBits[0] == '0' ? "关闭" : "打开");
writer.WriteEndObject();
value.EventEnable = reader.ReadUInt32();
writer.WriteNumber($"[{value.EventEnable.ReadNumber()}]事件使能", value.EventEnable);
var eventEnableBits = Convert.ToString(value.EventEnable, 2).PadLeft(32, '0').AsSpan();
writer.WriteStartObject("事件使能对象");
writer.WriteString("[bit30~bit31]预留", eventEnableBits.Slice(30, 2).ToString());
writer.WriteString("[bit2~bit29]用户自定义", alarmEnableBits.Slice(2, 28).ToString());
writer.WriteString("[bit1]主动拍照", alarmEnableBits[1] == '0' ? "关闭" : "打开");
writer.WriteString("[bit0]道路标识识别", alarmEnableBits[0] == '0' ? "关闭" : "打开");
writer.WriteEndObject();
value.TimeIntervalSmokingAlarmJudgment = reader.ReadUInt16();
writer.WriteNumber($"[{value.TimeIntervalSmokingAlarmJudgment.ReadNumber()}]吸烟报警判断时间间隔", value.TimeIntervalSmokingAlarmJudgment);
value.CallAlarmDetermineTimeInterval = reader.ReadUInt16();
writer.WriteNumber($"[{value.CallAlarmDetermineTimeInterval.ReadNumber()}]接打电话报警判断时间间隔", value.CallAlarmDetermineTimeInterval);
value.Reserve = reader.ReadArray(3).ToArray();
writer.WriteString("预留字段", value.Reserve.ToHexString());
value.GradedSpeedThresholdFatigueDrivingAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.GradedSpeedThresholdFatigueDrivingAlarm.ReadNumber()}]疲劳驾驶报警分级速度阈值", value.GradedSpeedThresholdFatigueDrivingAlarm);
value.VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm.ReadNumber()}]疲劳驾驶报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm);
value.FatigueDrivingAlarmPhotograph = reader.ReadByte();
writer.WriteNumber($"[{value.FatigueDrivingAlarmPhotograph.ReadNumber()}]疲劳驾驶报警拍照张数", value.FatigueDrivingAlarmPhotograph);
value.FatigueDrivingAlarmPhotographInterval = reader.ReadByte();
writer.WriteNumber($"[{value.FatigueDrivingAlarmPhotographInterval.ReadNumber()}]疲劳驾驶报警拍照间隔时间", value.FatigueDrivingAlarmPhotographInterval);
value.ClassifiedSpeedThresholdCallAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.ClassifiedSpeedThresholdCallAlarm.ReadNumber()}]接打电话报警分级速度阈值", value.ClassifiedSpeedThresholdCallAlarm);
value.VideoRecordingTimeBeforeAndAfterCallAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterCallAlarm.ReadNumber()}]接打电话报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterCallAlarm);
value.CallAlarmTakePicturesDriverFacialFeatures = reader.ReadByte();
writer.WriteNumber($"[{value.CallAlarmTakePicturesDriverFacialFeatures.ReadNumber()}]接打电话报警拍驾驶员面部特征照片张数", value.CallAlarmTakePicturesDriverFacialFeatures);
value.CallAlarmTakePicturesDriverFacialFeaturesInterval = reader.ReadByte();
writer.WriteNumber($"[{value.CallAlarmTakePicturesDriverFacialFeaturesInterval.ReadNumber()}]接打电话报警拍驾驶员面部特征照片间隔时间", value.CallAlarmTakePicturesDriverFacialFeaturesInterval);
value.ClassifiedSpeedThresholdSmokingAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.ClassifiedSpeedThresholdSmokingAlarm.ReadNumber()}]抽烟报警分级车速阈值", value.ClassifiedSpeedThresholdSmokingAlarm);
value.VideoRecordingTimeBeforeAndAfterSmokingAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.VideoRecordingTimeBeforeAndAfterSmokingAlarm.ReadNumber()}]抽烟报警前后视频录制时间", value.VideoRecordingTimeBeforeAndAfterSmokingAlarm);
value.SmokingAlarmPhotographsDriverFaceCharacteristics = reader.ReadByte();
writer.WriteNumber($"[{value.SmokingAlarmPhotographsDriverFaceCharacteristics.ReadNumber()}]抽烟报警拍驾驶员面部特征照片张数", value.SmokingAlarmPhotographsDriverFaceCharacteristics);
value.SmokingAlarmPhotographsDriverFaceCharacteristicsInterval = reader.ReadByte();
writer.WriteNumber($"[{value.SmokingAlarmPhotographsDriverFaceCharacteristicsInterval.ReadNumber()}]抽烟报警拍驾驶员面部特征照片间隔时间", value.SmokingAlarmPhotographsDriverFaceCharacteristicsInterval);
value.ClassifiedSpeedThresholdDistractedDrivingAlarm = reader.ReadByte();
writer.WriteNumber($"[{value.ClassifiedSpeedThresholdDistractedDrivingAlarm.ReadNumber()}]分神驾驶报警分级车速阈值", value.ClassifiedSpeedThresholdDistractedDrivingAlarm);
value.DistractedDrivingAlarmPhotography = reader.ReadByte();
writer.WriteNumber($"[{value.DistractedDrivingAlarmPhotography.ReadNumber()}]分神驾驶报警拍照张数", value.DistractedDrivingAlarmPhotography);
value.DistractedDrivingAlarmPhotographyInterval = reader.ReadByte();
writer.WriteNumber($"[{value.DistractedDrivingAlarmPhotographyInterval.ReadNumber()}]分神驾驶报警拍照间隔时间", value.DistractedDrivingAlarmPhotographyInterval);
value.VideoRecordingTimeAbnormalDrivingBehavior = reader.ReadByte();
writer.WriteNumber($"[{value.VideoRecordingTimeAbnormalDrivingBehavior.ReadNumber()}]驾驶行为异常视频录制时间", value.VideoRecordingTimeAbnormalDrivingBehavior);
value.PhotographsAbnormalDrivingBehavior = reader.ReadByte();
writer.WriteNumber($"[{value.PhotographsAbnormalDrivingBehavior.ReadNumber()}]驾驶行为异常抓拍照片张数", value.PhotographsAbnormalDrivingBehavior);
value.PictureIntervalAbnormalDrivingBehavior = reader.ReadByte();
writer.WriteNumber($"[{value.PictureIntervalAbnormalDrivingBehavior.ReadNumber()}]驾驶行为异常拍照间隔", value.PictureIntervalAbnormalDrivingBehavior);
value.DriverIdentificationTrigger = reader.ReadByte();
writer.WriteNumber($"[{value.DriverIdentificationTrigger.ReadNumber()}]驾驶员身份识别触发", value.DriverIdentificationTrigger);
value.Retain = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray();
writer.WriteString("保留字段", value.Retain.ToHexString());
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x8103_0xF365 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x8103_0xF365 value = new JT808_0x8103_0xF365();
value.ParamId = reader.ReadUInt32();
value.ParamLength = reader.ReadByte();
value.AlarmJudgeSpeedThreshold = reader.ReadByte();
value.WarningVolume = reader.ReadByte();
value.ActivePhotographyStrategy = reader.ReadByte();
value.ActivelyTimePhotoInterval = reader.ReadUInt16();
value.ActiveDistancePhotographyDistanceInterval = reader.ReadUInt16();
value.SingleInitiativePhotos = reader.ReadByte();
value.SingleInitiativePhotosInterval = reader.ReadByte();
value.PhotoResolution = reader.ReadByte();
value.VideoRecordingResolution = reader.ReadByte();
value.AlarmEnable = reader.ReadUInt32();
value.EventEnable = reader.ReadUInt32();
value.TimeIntervalSmokingAlarmJudgment = reader.ReadUInt16();
value.CallAlarmDetermineTimeInterval = reader.ReadUInt16();
value.Reserve = reader.ReadArray(3).ToArray();
value.GradedSpeedThresholdFatigueDrivingAlarm = reader.ReadByte();
value.VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm = reader.ReadByte();
value.FatigueDrivingAlarmPhotograph = reader.ReadByte();
value.FatigueDrivingAlarmPhotographInterval = reader.ReadByte();
value.ClassifiedSpeedThresholdCallAlarm = reader.ReadByte();
value.VideoRecordingTimeBeforeAndAfterCallAlarm = reader.ReadByte();
value.CallAlarmTakePicturesDriverFacialFeatures = reader.ReadByte();
value.CallAlarmTakePicturesDriverFacialFeaturesInterval = reader.ReadByte();
value.ClassifiedSpeedThresholdSmokingAlarm = reader.ReadByte();
value.VideoRecordingTimeBeforeAndAfterSmokingAlarm = reader.ReadByte();
value.SmokingAlarmPhotographsDriverFaceCharacteristics = reader.ReadByte();
value.SmokingAlarmPhotographsDriverFaceCharacteristicsInterval = reader.ReadByte();
value.ClassifiedSpeedThresholdDistractedDrivingAlarm = reader.ReadByte();
value.DistractedDrivingAlarmPhotography = reader.ReadByte();
value.DistractedDrivingAlarmPhotographyInterval = reader.ReadByte();
value.VideoRecordingTimeAbnormalDrivingBehavior = reader.ReadByte();
value.PhotographsAbnormalDrivingBehavior = reader.ReadByte();
value.PictureIntervalAbnormalDrivingBehavior = reader.ReadByte();
value.DriverIdentificationTrigger = reader.ReadByte();
value.Retain = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray();
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0xF365 value, IJT808Config config)
{
writer.WriteUInt32(value.ParamId);
writer.Skip(1, out int ParamLengthPosition);
writer.WriteByte(value.AlarmJudgeSpeedThreshold);
writer.WriteByte(value.WarningVolume);
writer.WriteByte(value.ActivePhotographyStrategy);
writer.WriteUInt16(value.ActivelyTimePhotoInterval);
writer.WriteUInt16(value.ActiveDistancePhotographyDistanceInterval);
writer.WriteByte(value.SingleInitiativePhotos);
writer.WriteByte(value.SingleInitiativePhotosInterval);
writer.WriteByte(value.PhotoResolution);
writer.WriteByte(value.VideoRecordingResolution);
writer.WriteUInt32(value.AlarmEnable);
writer.WriteUInt32(value.EventEnable);
writer.WriteUInt16(value.TimeIntervalSmokingAlarmJudgment);
writer.WriteUInt16(value.CallAlarmDetermineTimeInterval);
writer.WriteArray(value.Reserve);
writer.WriteByte(value.GradedSpeedThresholdFatigueDrivingAlarm);
writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterFatigueDrivingAlarm);
writer.WriteByte(value.FatigueDrivingAlarmPhotograph);
writer.WriteByte(value.FatigueDrivingAlarmPhotographInterval);
writer.WriteByte(value.ClassifiedSpeedThresholdCallAlarm);
writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterCallAlarm);
writer.WriteByte(value.CallAlarmTakePicturesDriverFacialFeatures);
writer.WriteByte(value.CallAlarmTakePicturesDriverFacialFeaturesInterval);
writer.WriteByte(value.ClassifiedSpeedThresholdSmokingAlarm);
writer.WriteByte(value.VideoRecordingTimeBeforeAndAfterSmokingAlarm);
writer.WriteByte(value.SmokingAlarmPhotographsDriverFaceCharacteristics);
writer.WriteByte(value.SmokingAlarmPhotographsDriverFaceCharacteristicsInterval);
writer.WriteByte(value.ClassifiedSpeedThresholdDistractedDrivingAlarm);
writer.WriteByte(value.DistractedDrivingAlarmPhotography);
writer.WriteByte(value.DistractedDrivingAlarmPhotographyInterval);
writer.WriteByte(value.VideoRecordingTimeAbnormalDrivingBehavior);
writer.WriteByte(value.PhotographsAbnormalDrivingBehavior);
writer.WriteByte(value.PictureIntervalAbnormalDrivingBehavior);
writer.WriteByte(value.DriverIdentificationTrigger);
writer.WriteArray(value.Retain);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - ParamLengthPosition - 1), ParamLengthPosition);
}
}
}

+ 151
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF366.cs Прегледај датотеку

@@ -0,0 +1,151 @@
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 胎压监测系统参数
/// </summary>
public class JT808_0x8103_0xF366 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter<JT808_0x8103_0xF366>, IJT808Analyze
{
/// <summary>
/// 胎压监测系统参数Id
/// </summary>
public override uint ParamId { get; set; } = JT808_YueBiao_Constants.JT808_0X8103_0xF366;
/// <summary>
/// 胎压监测系统参数长度
/// </summary>
public override byte ParamLength { get; set; } = 46;
/// <summary>
/// 轮胎规格型号 12位
/// </summary>
public string TyreSpecificationType { get; set; }
/// <summary>
/// 胎压单位
/// </summary>
public ushort TyrePressureUnit { get; set; }
/// <summary>
/// 正常胎压值
/// </summary>
public ushort NormalFetalPressure { get; set; }
/// <summary>
/// 胎压不平衡门限
/// </summary>
public ushort ThresholdUnbalancedTirePressure { get; set; }
/// <summary>
/// 慢漏气门限
/// </summary>
public ushort SlowLeakageThreshold { get; set; }
/// <summary>
/// 低压阈值
/// </summary>
public ushort LowVoltageThreshold { get; set; }
/// <summary>
/// 高压阈值
/// </summary>
public ushort HighVoltageThreshold { get; set; }
/// <summary>
/// 高温阈值
/// </summary>
public ushort HighTemperatureThreshold { get; set; }
/// <summary>
/// 电压阈值
/// </summary>
public ushort VoltageThreshold { get; set; }
/// <summary>
/// 定时上报时间间隔
/// </summary>
public ushort TimedReportingInterval { get; set; }
/// <summary>
/// 保留项
/// </summary>
public byte[] Retain { get; set; } = new byte[6];
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x8103_0xF366 value = new JT808_0x8103_0xF366();
value.ParamId = reader.ReadUInt32();
value.ParamLength = reader.ReadByte();
writer.WriteNumber($"[{value.ParamId.ReadNumber()}]参数ID", value.ParamId);
writer.WriteNumber($"[{value.ParamLength.ReadNumber()}]参数长度", value.ParamLength);
string tyreSpecificationTypeHex = reader.ReadVirtualArray(12).ToArray().ToHexString();
value.TyreSpecificationType = reader.ReadString(12);
writer.WriteString($"[{tyreSpecificationTypeHex}]轮胎规格型号", value.TyreSpecificationType);
value.TyrePressureUnit = reader.ReadUInt16();
writer.WriteNumber($"[{value.TyrePressureUnit.ReadNumber()}]胎压单位", value.TyrePressureUnit);
value.NormalFetalPressure = reader.ReadUInt16();
writer.WriteNumber($"[{value.NormalFetalPressure.ReadNumber()}]正常胎压值", value.NormalFetalPressure);
value.ThresholdUnbalancedTirePressure = reader.ReadUInt16();
writer.WriteNumber($"[{value.ThresholdUnbalancedTirePressure.ReadNumber()}]胎压不平衡门限", value.ThresholdUnbalancedTirePressure);
value.SlowLeakageThreshold = reader.ReadUInt16();
writer.WriteNumber($"[{value.SlowLeakageThreshold.ReadNumber()}]慢漏气门限", value.SlowLeakageThreshold);
value.LowVoltageThreshold = reader.ReadUInt16();
writer.WriteNumber($"[{value.LowVoltageThreshold.ReadNumber()}]低压阈值", value.LowVoltageThreshold);
value.HighVoltageThreshold = reader.ReadUInt16();
writer.WriteNumber($"[{value.HighVoltageThreshold.ReadNumber()}]高压阈值", value.HighVoltageThreshold);
value.HighTemperatureThreshold = reader.ReadUInt16();
writer.WriteNumber($"[{value.HighTemperatureThreshold.ReadNumber()}]高温阈值", value.HighTemperatureThreshold);
value.VoltageThreshold = reader.ReadUInt16();
writer.WriteNumber($"[{value.VoltageThreshold.ReadNumber()}]电压阈值", value.VoltageThreshold);
value.TimedReportingInterval = reader.ReadUInt16();
writer.WriteNumber($"[{value.TimedReportingInterval.ReadNumber()}]定时上报时间间隔", value.TimedReportingInterval);
value.Retain = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray();
writer.WriteString("保留项", value.Retain.ToHexString());
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x8103_0xF366 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x8103_0xF366 value = new JT808_0x8103_0xF366();
value.ParamId = reader.ReadUInt32();
value.ParamLength = reader.ReadByte();
value.TyreSpecificationType = reader.ReadString(12);
value.TyrePressureUnit = reader.ReadUInt16();
value.NormalFetalPressure = reader.ReadUInt16();
value.ThresholdUnbalancedTirePressure = reader.ReadUInt16();
value.SlowLeakageThreshold = reader.ReadUInt16();
value.LowVoltageThreshold = reader.ReadUInt16();
value.HighVoltageThreshold = reader.ReadUInt16();
value.HighTemperatureThreshold = reader.ReadUInt16();
value.VoltageThreshold = reader.ReadUInt16();
value.TimedReportingInterval = reader.ReadUInt16();
value.Retain = reader.ReadArray(reader.ReadCurrentRemainContentLength()).ToArray();
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0xF366 value, IJT808Config config)
{
writer.WriteUInt32(value.ParamId);
writer.Skip(1, out int ParamLengthPosition);
writer.WriteString(value.TyreSpecificationType);
writer.WriteUInt16(value.TyrePressureUnit);
writer.WriteUInt16(value.NormalFetalPressure);
writer.WriteUInt16(value.ThresholdUnbalancedTirePressure);
writer.WriteUInt16(value.SlowLeakageThreshold);
writer.WriteUInt16(value.LowVoltageThreshold);
writer.WriteUInt16(value.HighVoltageThreshold);
writer.WriteUInt16(value.HighTemperatureThreshold);
writer.WriteUInt16(value.VoltageThreshold);
writer.WriteUInt16(value.TimedReportingInterval);
writer.WriteArray(value.Retain);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - ParamLengthPosition - 1), ParamLengthPosition);
}
}
}

+ 77
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8103_0xF367.cs Прегледај датотеку

@@ -0,0 +1,77 @@
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 盲区监测系统参数
/// </summary>
public class JT808_0x8103_0xF367 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter<JT808_0x8103_0xF367>, IJT808Analyze
{
/// <summary>
/// 盲区监测系统参数Id
/// </summary>
public override uint ParamId { get; set; } = JT808_YueBiao_Constants.JT808_0X8103_0xF367;
/// <summary>
/// 盲区监测系统参数长度
/// </summary>
public override byte ParamLength { get; set; } = 2;
/// <summary>
/// 后方接近报警时间阈值
/// </summary>
public byte RearApproachAlarmTimeThreshold { get; set; }
/// <summary>
/// 侧后方接近报警时间阈值
/// </summary>
public byte LateralRearApproachAlarmTimeThreshold { get; set; }
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x8103_0xF367 value = new JT808_0x8103_0xF367();
value.ParamId = reader.ReadUInt32();
value.ParamLength = reader.ReadByte();
writer.WriteNumber($"[{ value.ParamId.ReadNumber()}]参数ID", value.ParamId);
writer.WriteNumber($"[{value.ParamLength.ReadNumber()}]参数长度", value.ParamLength);
value.RearApproachAlarmTimeThreshold = reader.ReadByte();
writer.WriteNumber($"[{value.RearApproachAlarmTimeThreshold.ReadNumber()}]后方接近报警时间阈值", value.RearApproachAlarmTimeThreshold);
value.LateralRearApproachAlarmTimeThreshold = reader.ReadByte();
writer.WriteNumber($"[{value.LateralRearApproachAlarmTimeThreshold.ReadNumber()}]侧后方接近报警时间阈值", value.LateralRearApproachAlarmTimeThreshold);
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x8103_0xF367 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x8103_0xF367 value = new JT808_0x8103_0xF367();
value.ParamId = reader.ReadUInt32();
value.ParamLength = reader.ReadByte();
value.RearApproachAlarmTimeThreshold = reader.ReadByte();
value.LateralRearApproachAlarmTimeThreshold = reader.ReadByte();
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0xF367 value, IJT808Config config)
{
writer.WriteUInt32(value.ParamId);
writer.WriteByte(2);
writer.WriteByte(value.RearApproachAlarmTimeThreshold);
writer.WriteByte(value.LateralRearApproachAlarmTimeThreshold);
}
}
}

+ 90
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF7.cs Прегледај датотеку

@@ -0,0 +1,90 @@
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System.Collections.Generic;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 状态查询
/// </summary>
public class JT808_0x8900_0xF7 : JT808_0x8900_BodyBase, IJT808MessagePackFormatter<JT808_0x8900_0xF7>, IJT808Analyze
{
/// <summary>
/// 查询基本信息类型
/// 外设状态信息:外设工作状态、设备报警信息
/// </summary>
public override byte PassthroughType { get; set; } = JT808_YueBiao_Constants.JT808_0X0900_0xF7;
/// <summary>
/// 外设ID列表总数
/// </summary>
public byte USBCount { get; set; }
/// <summary>
/// 外设ID
/// </summary>
public List<byte> MultipleUSB { get; set; }
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x8900_0xF7 value = new JT808_0x8900_0xF7();
value.USBCount = reader.ReadByte();
writer.WriteNumber($"[{value.USBCount.ReadNumber()}]外设ID列表总数", value.USBCount);
if (value.USBCount > 0)
{
writer.WriteStartArray("外设ID列表");
for (int i = 0; i < value.USBCount; i++)
{
writer.WriteStartObject();
byte usbId = reader.ReadByte();
writer.WriteNumber($"[{usbId.ReadNumber()}]外设ID", usbId);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x8900_0xF7 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x8900_0xF7 value = new JT808_0x8900_0xF7();
value.USBCount = reader.ReadByte();
if (value.USBCount > 0)
{
value.MultipleUSB = new List<byte>();
for (int i = 0; i < value.USBCount; i++)
{
value.MultipleUSB.Add(reader.ReadByte());
}
}
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8900_0xF7 value, IJT808Config config)
{
if (value.MultipleUSB != null && value.MultipleUSB.Count > 0)
{
writer.WriteByte((byte)value.MultipleUSB.Count);
foreach (var item in value.MultipleUSB)
{
writer.WriteByte(item);
}
}
}
}
}

+ 90
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x8900_0xF8.cs Прегледај датотеку

@@ -0,0 +1,90 @@
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessageBody;
using JT808.Protocol.MessagePack;
using System.Collections.Generic;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 信息查询
/// </summary>
public class JT808_0x8900_0xF8 : JT808_0x8900_BodyBase, IJT808MessagePackFormatter<JT808_0x8900_0xF8>, IJT808Analyze
{
/// <summary>
/// 查询基本信息透传类型
/// 外设传感器的基本信息:公司信息、 产品代码、 版本号、 外设 ID、 客户代码。对应的消息内容见表
/// </summary>
public override byte PassthroughType { get; set; } = JT808_YueBiao_Constants.JT808_0X0900_0xF8;
/// <summary>
/// 外设ID列表总数
/// </summary>
public byte USBCount { get; set; }
/// <summary>
/// 外设ID
/// </summary>
public List<byte> MultipleUSB { get; set; }
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x8900_0xF8 value = new JT808_0x8900_0xF8();
value.USBCount = reader.ReadByte();
writer.WriteNumber($"[{value.USBCount.ReadNumber()}]外设ID列表总数", value.USBCount);
if (value.USBCount > 0)
{
writer.WriteStartArray("外设ID列表");
for (int i = 0; i < value.USBCount; i++)
{
writer.WriteStartObject();
byte usbId = reader.ReadByte();
writer.WriteNumber($"[{usbId.ReadNumber()}]外设ID", usbId);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x8900_0xF8 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x8900_0xF8 value = new JT808_0x8900_0xF8();
value.USBCount = reader.ReadByte();
if (value.USBCount > 0)
{
value.MultipleUSB = new List<byte>();
for (int i = 0; i < value.USBCount; i++)
{
value.MultipleUSB.Add(reader.ReadByte());
}
}
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8900_0xF8 value, IJT808Config config)
{
if (value.MultipleUSB != null && value.MultipleUSB.Count > 0)
{
writer.WriteByte((byte)value.MultipleUSB.Count);
foreach (var item in value.MultipleUSB)
{
writer.WriteByte(item);
}
}
}
}
}

+ 143
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9208.cs Прегледај датотеку

@@ -0,0 +1,143 @@
using JT808.Protocol.Extensions.YueBiao.Metadata;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using System;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 报警附件上传指令
/// </summary>
public class JT808_0x9208: JT808Bodies, IJT808MessagePackFormatter<JT808_0x9208>, IJT808Analyze
{
/// <summary>
/// Description
/// </summary>
public override string Description => "报警附件上传指令";
/// <summary>
/// 服务IP地址长度
/// </summary>
public byte AttachmentServerIPLength { get; set; }
/// <summary>
/// 服务IP地址
/// </summary>
public string AttachmentServerIP { get; set; }
/// <summary>
/// TCP端口
/// </summary>
public ushort AttachmentServerIPTcpPort { get; set; }
/// <summary>
/// UDP端口
/// </summary>
public ushort AttachmentServerIPUdpPort { get; set; }
/// <summary>
/// 报警标识号
/// </summary>
public AlarmIdentificationProperty AlarmIdentification { get; set; }
/// <summary>
/// 平台给报警分配的唯一编号
/// 32
/// </summary>
public string AlarmId { get; set; }
/// <summary>
/// 预留
/// </summary>
public byte[] Retain { get; set; } = new byte[16];
/// <summary>
/// 报警附件上传指令Id
/// </summary>
public override ushort MsgId => 0x9208;
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x9208 value = new JT808_0x9208();
value.AttachmentServerIPLength = reader.ReadByte();
writer.WriteNumber($"[{value.AttachmentServerIPLength.ReadNumber()}]服务IP地址长度", value.AttachmentServerIPLength);
string attachmentServerIPHex = reader.ReadVirtualArray(value.AttachmentServerIPLength).ToArray().ToHexString();
value.AttachmentServerIP = reader.ReadString(value.AttachmentServerIPLength);
writer.WriteString($"[{AttachmentServerIP}]服务IP地址", value.AttachmentServerIP);
value.AttachmentServerIPTcpPort = reader.ReadUInt16();
writer.WriteNumber($"[{value.AttachmentServerIPTcpPort.ReadNumber()}]TCP端口", value.AttachmentServerIPTcpPort);
value.AttachmentServerIPUdpPort = reader.ReadUInt16();
writer.WriteNumber($"[{value.AttachmentServerIPUdpPort.ReadNumber()}]UDP端口", value.AttachmentServerIPUdpPort);
value.AlarmIdentification = new AlarmIdentificationProperty();
string terminalIdHex = reader.ReadVirtualArray(30).ToArray().ToHexString();
value.AlarmIdentification.TerminalId = reader.ReadString(30);
value.AlarmIdentification.Time = reader.ReadDateTime6();
value.AlarmIdentification.SN = reader.ReadByte();
value.AlarmIdentification.AttachCount = reader.ReadByte();
value.AlarmIdentification.Retain1 = reader.ReadByte();
value.AlarmIdentification.Retain2 = reader.ReadByte();
writer.WriteString($"[{terminalIdHex}]终端ID", value.AlarmIdentification.TerminalId);
writer.WriteString($"[{value.AlarmIdentification.Time.ToString("yyMMddHHmmss")}]日期时间", value.AlarmIdentification.Time.ToString("yyyy-MM-dd HH:mm:ss"));
writer.WriteNumber($"[{value.AlarmIdentification.SN.ReadNumber()}]序号", value.AlarmIdentification.SN);
writer.WriteNumber($"[{value.AlarmIdentification.AttachCount.ReadNumber()}]附件数量", value.AlarmIdentification.AttachCount);
writer.WriteNumber($"[{value.AlarmIdentification.Retain1.ReadNumber()}]预留1", value.AlarmIdentification.Retain1);
writer.WriteNumber($"[{value.AlarmIdentification.Retain2.ReadNumber()}]预留2", value.AlarmIdentification.Retain2);
string alarmIdHex = reader.ReadVirtualArray(32).ToArray().ToHexString();
value.AlarmId = reader.ReadString(32);
writer.WriteString($"[{alarmIdHex}]平台给报警分配的唯一编号", value.AlarmId);
string retainHex = reader.ReadVirtualArray(16).ToArray().ToHexString();
writer.WriteString($"预留", retainHex);
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x9208 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x9208 value = new JT808_0x9208();
value.AttachmentServerIPLength = reader.ReadByte();
value.AttachmentServerIP = reader.ReadString(value.AttachmentServerIPLength);
value.AttachmentServerIPTcpPort = reader.ReadUInt16();
value.AttachmentServerIPUdpPort = reader.ReadUInt16();
value.AlarmIdentification = new AlarmIdentificationProperty
{
TerminalId = reader.ReadString(30),
Time = reader.ReadDateTime6(),
SN = reader.ReadByte(),
AttachCount = reader.ReadByte(),
Retain1 = reader.ReadByte(),
Retain2 = reader.ReadByte()
};
value.AlarmId = reader.ReadString(32);
value.Retain = reader.ReadArray(16).ToArray();
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9208 value, IJT808Config config)
{
writer.Skip(1, out int AttachmentServerIPLengthPosition);
writer.WriteString(value.AttachmentServerIP);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - AttachmentServerIPLengthPosition - 1), AttachmentServerIPLengthPosition);
writer.WriteUInt16(value.AttachmentServerIPTcpPort);
writer.WriteUInt16(value.AttachmentServerIPUdpPort);
if (value.AlarmIdentification == null)
{
throw new NullReferenceException($"{nameof(AlarmIdentificationProperty)}不为空");
}
writer.WriteString(value.AlarmIdentification.TerminalId.PadRight(30, '\0'));
writer.WriteDateTime6(value.AlarmIdentification.Time);
writer.WriteByte(value.AlarmIdentification.SN);
writer.WriteByte(value.AlarmIdentification.AttachCount);
writer.WriteByte(value.AlarmIdentification.Retain1);
writer.WriteByte(value.AlarmIdentification.Retain2);
writer.WriteString(value.AlarmId);
writer.WriteArray(value.Retain);
}
}
}

+ 139
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/MessageBody/JT808_0x9212.cs Прегледај датотеку

@@ -0,0 +1,139 @@
using JT808.Protocol.Extensions.YueBiao.Metadata;
using JT808.Protocol.Formatters;
using JT808.Protocol.Interfaces;
using JT808.Protocol.MessagePack;
using System.Collections.Generic;
using System.Text.Json;

namespace JT808.Protocol.Extensions.YueBiao.MessageBody
{
/// <summary>
/// 文件上传完成消息应答
/// </summary>
public class JT808_0x9212: JT808Bodies, IJT808MessagePackFormatter<JT808_0x9212>, IJT808Analyze
{
/// <summary>
/// 文件上传完成消息应答
/// </summary>
public override string Description => "文件上传完成消息应答";
/// <summary>
/// 文件名称长度
/// </summary>
public byte FileNameLength { get; set; }
/// <summary>
/// 文件名称
/// </summary>
public string FileName { get; set; }
/// <summary>
/// 文件类型
/// </summary>
public byte FileType { get; set; }
/// <summary>
/// 上传结果
/// </summary>
public byte UploadResult { get; set; }
/// <summary>
/// 补传数据包数量
/// 需要补传的数据包数量,无补传时该值为0
/// </summary>
public byte DataPackageCount { get; set; }
/// <summary>
/// 补传数据包列表
/// </summary>
public List<DataPackageProperty> DataPackages { get; set; }
/// <summary>
/// 文件上传完成消息应答Id
/// </summary>
public override ushort MsgId => 0x9212;
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="writer"></param>
/// <param name="config"></param>
public void Analyze(ref JT808MessagePackReader reader, Utf8JsonWriter writer, IJT808Config config)
{
JT808_0x9212 value = new JT808_0x9212();
value.FileNameLength = reader.ReadByte();
writer.WriteNumber($"[{value.FileNameLength.ReadNumber()}]文件名称长度", value.FileNameLength);
string fileNameHex = reader.ReadVirtualArray(value.FileNameLength).ToArray().ToHexString();
value.FileName = reader.ReadString(value.FileNameLength);
writer.WriteString($"[{fileNameHex}]文件名称", value.FileName);
value.FileType = reader.ReadByte();
writer.WriteNumber($"[{value.FileType.ReadNumber()}]文件类型", value.FileType);
value.UploadResult = reader.ReadByte();
writer.WriteNumber($"[{value.UploadResult.ReadNumber()}]上传结果", value.UploadResult);
value.DataPackageCount = reader.ReadByte();
writer.WriteNumber($"[{value.DataPackageCount.ReadNumber()}]补传数据包数量", value.DataPackageCount);
if (value.DataPackageCount > 0)
{
writer.WriteStartArray("补传数据包列表");
for (int i = 0; i < value.DataPackageCount; i++)
{
writer.WriteStartObject();
DataPackageProperty dataPackageProperty = new DataPackageProperty();
dataPackageProperty.Offset = reader.ReadUInt32();
writer.WriteNumber($"[{dataPackageProperty.Offset.ReadNumber()}]数据偏移量", dataPackageProperty.Offset);
dataPackageProperty.Length = reader.ReadUInt32();
writer.WriteNumber($"[{dataPackageProperty.Length.ReadNumber()}]数据长度", dataPackageProperty.Length);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
/// <summary>
///
/// </summary>
/// <param name="reader"></param>
/// <param name="config"></param>
/// <returns></returns>
public JT808_0x9212 Deserialize(ref JT808MessagePackReader reader, IJT808Config config)
{
JT808_0x9212 value = new JT808_0x9212();
value.FileNameLength = reader.ReadByte();
value.FileName = reader.ReadString(value.FileNameLength);
value.FileType = reader.ReadByte();
value.UploadResult = reader.ReadByte();
value.DataPackageCount = reader.ReadByte();
if (value.DataPackageCount > 0)
{
value.DataPackages = new List<DataPackageProperty>();
for (int i = 0; i < value.DataPackageCount; i++)
{
DataPackageProperty dataPackageProperty = new DataPackageProperty();
dataPackageProperty.Offset = reader.ReadUInt32();
dataPackageProperty.Length = reader.ReadUInt32();
value.DataPackages.Add(dataPackageProperty);
}
}
return value;
}
/// <summary>
///
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="config"></param>
public void Serialize(ref JT808MessagePackWriter writer, JT808_0x9212 value, IJT808Config config)
{
writer.Skip(1, out int FileNameLengthPosition);
writer.WriteString(value.FileName);
writer.WriteByteReturn((byte)(writer.GetCurrentPosition() - FileNameLengthPosition - 1), FileNameLengthPosition);
writer.WriteByte(value.FileType);
writer.WriteByte(value.UploadResult);
if (value.DataPackages != null && value.DataPackages.Count > 0)
{
writer.WriteByte((byte)value.DataPackages.Count);
foreach (var item in value.DataPackages)
{
writer.WriteUInt32(item.Offset);
writer.WriteUInt32(item.Length);
}
}
else
{
writer.WriteByte(0);
}
}
}
}

+ 40
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmIdentificationProperty.cs Прегледај датотеку

@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Metadata
{
/// <summary>
/// 报警标识号
/// 报警附件信息消息数据格式
/// </summary>
public class AlarmIdentificationProperty
{
/// <summary>
/// 终端ID
/// 30
/// </summary>
public string TerminalId { get; set; }
/// <summary>
/// YY-MM-DD-hh-mm-ss
/// BCD[6]
/// </summary>
public DateTime Time { get; set; }
/// <summary>
/// 序号
/// </summary>
public byte SN { get; set; }
/// <summary>
/// 附件数量
/// </summary>
public byte AttachCount { get; set; }
/// <summary>
/// 预留1
/// </summary>
public byte Retain1 { get; set; }
/// <summary>
/// 预留2
/// </summary>
public byte Retain2 { get; set; }
}
}

+ 33
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AlarmOrEventProperty.cs Прегледај датотеку

@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Metadata
{
/// <summary>
/// 胎压监测系统报警/事件信息
/// </summary>
public class AlarmOrEventProperty
{
/// <summary>
/// 胎压报警位置
/// </summary>
public byte TirePressureAlarmPosition { get; set; }
/// <summary>
/// 报警/事件类型
/// </summary>
public ushort AlarmOrEventType { get; set; }
/// <summary>
/// 胎压
/// </summary>
public ushort TirePressure { get; set; }
/// <summary>
/// 胎温
/// </summary>
public ushort TireTemperature { get; set; }
/// <summary>
/// 电池电量
/// </summary>
public ushort BatteryLevel { get; set; }
}
}

+ 26
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/AttachProperty.cs Прегледај датотеку

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Metadata
{
/// <summary>
/// 附件信息
/// </summary>
public class AttachProperty
{
/// <summary>
/// 文件名称长度
/// </summary>
public byte FileNameLength { get; set; }
/// <summary>
/// 文件名称
/// 形如:文件类型_通道号_报警类型_序号_报警编号.后缀名
/// </summary>
public string FileName{ get; set; }
/// <summary>
/// 文件大小
/// </summary>
public uint FileSize { get; set; }
}
}

+ 21
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/DataPackageProperty.cs Прегледај датотеку

@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Metadata
{
/// <summary>
/// 补传数据包信息
/// </summary>
public class DataPackageProperty
{
/// <summary>
/// 数据偏移量
/// </summary>
public uint Offset { get; set; }
/// <summary>
/// 数据长度
/// </summary>
public uint Length { get; set; }
}
}

+ 31
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF7_USB.cs Прегледај датотеку

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Metadata
{
/// <summary>
///
/// </summary>
public class JT808_0x0900_0xF7_USB
{
/// <summary>
/// 外设ID
/// <see cref="JT808.Protocol.Extensions.YueBiao.Enums.USBIDType"/>
/// </summary>
public byte USBID { get; set; }
/// <summary>
/// 消息长度
/// </summary>
public byte MessageLength { get; set; }
/// <summary>
/// 工作状态
/// <see cref="JT808.Protocol.Extensions.YueBiao.Enums.WorkingConditionType"/>
/// </summary>
public byte WorkingCondition { get; set; }
/// <summary>
/// 报警状态
/// </summary>
public uint AlarmStatus { get; set; }
}
}

+ 72
- 0
src/JT808.Protocol.Extensions/JT808.Protocol.Extensions.YueBiao/Metadata/JT808_0x0900_0xF8_USB.cs Прегледај датотеку

@@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Protocol.Extensions.YueBiao.Metadata
{
/// <summary>
///
/// </summary>
public class JT808_0x0900_0xF8_USB
{
/// <summary>
/// 外设ID
/// <see cref="JT808.Protocol.Extensions.YueBiao.Enums.USBIDType"/>
/// </summary>
public byte USBID { get; set; }
/// <summary>
/// 消息长度
/// </summary>
public byte MessageLength { get; set; }
/// <summary>
/// 公司名称长度
/// </summary>
public byte CompantNameLength { get; set; }
/// <summary>
/// 公司名称
/// </summary>
public string CompantName { get; set; }
/// <summary>
/// 产品型号长度
/// </summary>
public byte ProductModelLength { get; set; }
/// <summary>
/// 产品型号
/// </summary>
public string ProductModel { get; set; }
/// <summary>
/// 硬件版本号长度
/// </summary>
public byte HardwareVersionNumberLength { get; set; }
/// <summary>
/// 硬件版本号
/// ASCII
/// </summary>
public string HardwareVersionNumber { get; set; }
/// <summary>
/// 软件版本号长度
/// </summary>
public byte SoftwareVersionNumberLength { get; set; }
/// <summary>
/// 软件版本号
/// ASCII
/// </summary>
public string SoftwareVersionNumber { get; set; }
/// <summary>
/// 设备ID长度
/// </summary>
public byte DevicesIDLength { get; set; }
/// <summary>
/// 设备ID
/// </summary>
public string DevicesID { get; set; }
/// <summary>
/// 客户代码长度
/// </summary>
public byte CustomerCodeLength { get; set; }
/// <summary>
/// 客户代码
/// </summary>
public string CustomerCode { get; set; }
}
}

+ 7
- 0
src/JT808.Protocol/JT808.Protocol.xml Прегледај датотеку

@@ -9726,6 +9726,13 @@
附加信息长度
</summary>
</member>
<member name="P:JT808.Protocol.MessageBody.JT808_0x0200_BodyBase.AttachInfoLengthExtend">
<summary>
附加信息长度扩展
4个字节
注意:只适用于已知的协议才行
</summary>
</member>
<member name="T:JT808.Protocol.MessageBody.JT808_0x0200_CustomBodyBase">
<summary>
自定义位置附加信息


+ 6
- 0
src/JT808.Protocol/MessageBody/JT808_0x0200_BodyBase.cs Прегледај датотеку

@@ -17,5 +17,11 @@ namespace JT808.Protocol.MessageBody
/// 附加信息长度
/// </summary>
public abstract byte AttachInfoLength { get; set; }
/// <summary>
/// 附加信息长度扩展
/// 4个字节
/// 注意:只适用于已知的协议才行
/// </summary>
public virtual uint AttachInfoLengthExtend { get; set; }
}
}

Loading…
Откажи
Сачувај