111 lines
4.0 KiB
C#
111 lines
4.0 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|