using System.Text; namespace langguanApi.Common.Gps { /// /// gps 协议解析器 /// public class ProtocolParser { /// /// 解析消息头 /// /// /// /// 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; } /// /// 解析位置信息 /// /// /// 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 }; } /// /// 解析终端注册消息 /// /// /// /// 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; } /// /// 解析位置上报消息 /// /// /// /// 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; } } }