lg_backend/langguanApi/Common/Gps/ProtocolParser.cs

111 lines
4.0 KiB
C#
Raw Normal View History

2024-08-04 14:18:34 +00:00
using System.Text;
namespace langguanApi.Common.Gps
{
/// <summary>
/// gps 协议解析器
/// </summary>
public class ProtocolParser
{
/// <summary>
/// 解析消息头
/// </summary>
/// <param name="data"></param>
/// <param name="offset"></param>
/// <returns></returns>
public static MessageHeader ParseHeader(byte[] data, ref int offset)
{
var header = new MessageHeader
{
MessageId = BitConverter.ToUInt16(data, offset),
MessageBodyProperty = BitConverter.ToUInt16(data, offset + 2),
TerminalId = Encoding.ASCII.GetString(data, offset + 4, 6),
MessageSerialNumber = BitConverter.ToUInt16(data, offset + 10)
};
offset += 12;
return header;
}
public struct Position
{
public double Latitude;
public double Longitude;
public double Altitude;
}
/// <summary>
/// 解析位置信息
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static Position ParsePosition(byte[] data)
{
// 根据协议中的位置信息的偏移量和长度进行解析
int positionOffset = 21; // 位置信息在数据中的偏移量
int latitudeOffset = positionOffset + 0;
int longitudeOffset = positionOffset + 8;
int altitudeOffset = positionOffset + 16;
double latitude = BitConverter.ToDouble(data, latitudeOffset);
double longitude = BitConverter.ToDouble(data, longitudeOffset);
double altitude = BitConverter.ToDouble(data, altitudeOffset);
return new Position
{
Latitude = latitude,
Longitude = longitude,
Altitude = altitude
};
}
/// <summary>
/// 解析终端注册消息
/// </summary>
/// <param name="data"></param>
/// <param name="offset"></param>
/// <returns></returns>
public static TerminalRegisterMessage ParseTerminalRegisterMessage(byte[] data, ref int offset)
{
var message = new TerminalRegisterMessage
{
ProvinceId = BitConverter.ToUInt16(data, offset),
CityId = BitConverter.ToUInt16(data, offset + 2),
ManufacturerId = data.Skip(offset + 4).Take(5).ToArray(),
TerminalType = data.Skip(offset + 9).Take(8).ToArray(),
TerminalId = data.Skip(offset + 17).Take(7).ToArray(),
LicensePlateColor = data[offset + 24],
LicensePlate = Encoding.ASCII.GetString(data, offset + 25, data.Length - offset - 25)
};
offset += 25 + message.LicensePlate.Length;
return message;
}
/// <summary>
/// 解析位置上报消息
/// </summary>
/// <param name="data"></param>
/// <param name="offset"></param>
/// <returns></returns>
public static LocationReportMessage ParseLocationReportMessage(byte[] data, ref int offset)
{
var message = new LocationReportMessage
{
AlarmFlag = BitConverter.ToUInt32(data, offset),
Status = BitConverter.ToUInt32(data, offset + 4),
Latitude = BitConverter.ToUInt32(data, offset + 8),
Longitude = BitConverter.ToUInt32(data, offset + 12),
Altitude = BitConverter.ToUInt16(data, offset + 16),
Speed = BitConverter.ToUInt16(data, offset + 18),
Direction = BitConverter.ToUInt16(data, offset + 20),
Time = DateTime.ParseExact(
Encoding.ASCII.GetString(data, offset + 22, 6),
"yyMMddHHmmss",
null
)
};
offset += 28;
return message;
}
}
}