public override IMessage Decode(IFrame frame) { if (ParserUtils.IsInvalidDeviceId(Id)) { return(null); } //if ((Frame.Payload[0] != '$') || (Frame.Payload[1] != '$')) return null; //if ((Frame.Payload[Frame.Payload.Length - 2] != '\r') || (Frame.Payload[Frame.Payload.Length - 1] != '\n')) return null; if (!CheckChecksum(frame.Payload, frame.Payload.Length)) { STrace.Debug(GetType().FullName, Id, String.Format("paquete descartado por checksum: {0}", frame.PayloadAsString)); return(null); } //var Length = GetLength(Frame.Payload, 2); //Debug.Assert(Frame.Payload.Length == Length); //"When GPS have not positioning, GPS time will show as system time." //return MessageIdentifier.GpsSignalOff.FactoryEvent(MessageIdentifier.GenericMessage, Id, msgId, pos, dt, chofer, null); //var dataLength = Frame.Payload.Length - 30; //String chofer = null; var type = BitConverter_BigEndian.ToInt16(frame.Payload, 24); var packettype = (PacketType)type; switch (packettype) { case PacketType.Login: return(ParseLogin(frame)); case PacketType.RollCallResponse: return(ParseRollCallResponse(frame)); case PacketType.Logout: return(ParseLogout(frame)); case PacketType.FixedUpload: return(ParseFixedUpload(frame)); case PacketType.VehicleSupportedDataStreamType: return(ParseVehicleSupportedDataStreamType(frame)); case PacketType.UploadFreezeFrameDataStream: return(ParseUploadFreezeFrameDataStream(frame)); case PacketType.UploadDataStreamInfo: return(ParseUploadDataStreamInfo(frame)); case PacketType.UploadStoreMalfunctionInfo: return(ParseUploadMalfunctionInfo(frame, packettype)); case PacketType.UploadPendingMalfunctionInfo: return(ParseUploadMalfunctionInfo(frame, packettype)); case PacketType.UploadAlarm: return(ParseUploadAlarm(frame, packettype)); case PacketType.UploadAlarmElimination: return(ParseUploadAlarm(frame, packettype)); case PacketType.TripStart: return(ParseTripStart(frame)); case PacketType.TripEnd: return(ParseTripEnd(frame)); default: STrace.Debug(GetType().FullName, Id, String.Format("RX 0x{0:X4}:{1}{2}", type, Environment.NewLine, GetData(frame))); return(new UserMessage(Id, 0)); } }
public override INode Factory(IFrame frame, int formerId) { var serial = BitConverter_BigEndian.ToInt16(frame.Payload, 1).ToString("D"); var res = DataProvider.FindByIMEI(serial, this); if (res == null) { STrace.Debug(GetType().FullName, String.Format("dispositivo no dado de alta, serial={0}", serial)); } return(res); }
public static GPSPoint Parse(byte[] data) { //var time = Utils.FromUnixTimeStamp(BitConverter.ToUInt32(data, 0)); var time = FromFulmarTime(data, 0); var lat = Convert.ToSingle(BitConverter_BigEndian.ToInt32(data, 4)) / 100000; var lon = Convert.ToSingle(BitConverter_BigEndian.ToInt32(data, 8)) / 100000; //var edad = data[12]; var vel = Convert.ToSingle(data[13]); //var velPico = data[14]; var dir = Convert.ToSingle(data[15]) * 2; //puaj, viene dividida por 2 para q entre en un byte return(GPSPoint.Factory(time, lat, lon, vel, dir, 0, 0)); }
private byte[] FactoryPacket(PacketType type, byte[] data, byte[] sourcePacket) { //A Header, 2 bytes, defined as @@, ASCII code //B Length, 2 bytes, indicates the data length from Header to Tail ([Header, Tail)), statistical length range is A,B,C,D,E,F,G //C Device ID (OBDII product ID), 20 bytes, ASCII bytes. If length < 20 bytes, filled up with '\0'. //D Type, 2 bytes, high byte represents to main identifier and low byte represent to sub identifier. //E Data, random length. //F Checksum, 2 bytes, calculate from Header to Data excluding Checksum and Tail. Checksum algorithm is CRC Checksum Algorithm (see appendix), calculating range is A,B,C,D,E //G Tail, 2 bytes, defined as "\r\n". var len = (Int16)(2 + 2 + 20 + 2 + data.Length + 2 + 2); var res = new byte[len]; Encoding.ASCII.GetBytes("@@").CopyTo(res, 0); BitConverter.GetBytes(len).CopyTo(res, 2); Array.Copy(sourcePacket, 4, res, 4, 20); //Device ID BitConverter_BigEndian.GetBytes((Int16)type).CopyTo(res, 24); Array.Copy(data, 0, res, 26, data.Length); BitConverter.GetBytes(GetChecksum(res, len - 4)).CopyTo(res, len - 4); Encoding.ASCII.GetBytes("\r\n").CopyTo(res, len - 2); return(res); }
public override IMessage Decode(IFrame frame) { var chR = BitConverter_BigEndian.ToInt32(frame.Payload, frame.Payload.Length - 4); var chC = GetChecksum(frame.Payload); if (chC != chR) { STrace.Debug(GetType().FullName, Id, String.Format("Paquete descartado por checksum: checksum {0:X8}:{1:X8} {2}", chC, chR, StringUtils.MakeString(frame.Payload))); return(null); } var tipo = (PacketType)frame.Payload[0]; //var packetLenght = BitConverter_BigEndian.ToInt16(Frame.Payload, 3); var msgId = BitConverter_BigEndian.ToUInt32(frame.Payload, 5); var dt1 = (frame.Payload[11] == 0 || frame.Payload[10] == 0 || frame.Payload[9] == 0) ? DateTime.UtcNow : new DateTime(((DateTime.UtcNow.Year / 100) * 100) + frame.Payload[11], frame.Payload[10], frame.Payload[9], frame.Payload[12], frame.Payload[13], frame.Payload[14]); IMessage res; switch (tipo) { case PacketType.ReportPosition: { var data = Encoding.ASCII.GetString(frame.Payload, 15, frame.Payload.Length - 19).Split(','); var dt2 = DateTimeUtils.SafeParseFormat(data[10] + data[2].Split('.')[0], "ddMMyyHHmmss"); var lat = GPSPoint.ResampleAxis(data[4]) * ((data[5] == "N") ? 1 : -1); var lon = GPSPoint.ResampleAxis(data[6]) * ((data[7] == "E") ? 1 : -1); var vel = Speed.KnotToKm(Convert.ToSingle(data[8], CultureInfo.InvariantCulture)); var dir = Convert.ToSingle(data[9], CultureInfo.InvariantCulture); var pos = GPSPoint.Factory(dt2, lat, lon, vel, dir, 0, 0); res = pos.ToPosition(Id, msgId); var interval = BitConverter_BigEndian.GetBytes((Int16)1); //este numero multiplicado * 10'' es el intervalo de reporte var resdata = new [] { (byte)DateTime.UtcNow.Day, (byte)DateTime.UtcNow.Month, (byte)DateTime.UtcNow.Year, (byte)DateTime.UtcNow.Hour, (byte)DateTime.UtcNow.Minute, (byte)DateTime.UtcNow.Second, interval[0], interval[1] }; res.Response = FactoryResponse(PacketType.AckPosition, frame.Payload, resdata); STrace.Debug(GetType().FullName, Id, String.Format("dt {0} {1}", dt1, pos)); break; } case PacketType.ReportModbusData: { var source = frame.Payload[15]; var count = (frame.Payload.Length - Nondatalen) / Recordlen; //cantidad de bytes de los datos / 4 bytes por cada dato var sb = new StringBuilder(); for (var i = 0; i < count; i++) { var key = GetShort(frame, i, 16); var value = GetShort(frame, i, 18) * 1.0; if (key == 40108) { value /= 10; //para "Fuel Rate" el valor viene expresado en decilitros y es conveniente visualizarlo en "Litros" } if ((value != 0x8000) && (value != 0x80000000)) { sb.AppendFormat(CultureInfo.InvariantCulture, "Modbus_{0}_{1}:{2},", source, key, value); } } res = MessageIdentifier.AnalogicInputs.FactoryEvent(MessageIdentifier.TelemetricData, Id, msgId, null, dt1, null, null); ((Event)res).SensorsDataString = sb.ToString(); res.Response = FactoryResponse(PacketType.AckModbusData, frame.Payload, null); STrace.Debug(GetType().FullName, Id, String.Format("ModbusData {0} dt {1} payload {2}", sb, dt1, StringUtils.MakeString(frame.Payload))); break; } case PacketType.ReplyModbusList: //pendiente Fota.Dequeue(PacketType.Command_ModbusList) STrace.Debug(GetType().FullName, Id, String.Format("ModbusList (dt {0}) {1}", dt1, StringUtils.MakeString(frame.Payload))); res = new UserMessage(Id, msgId); break; case PacketType.RequestBiosNewPage: { STrace.Debug(GetType().FullName, Id, String.Format("BiosNewPage (dt {0}) {1}", dt1, StringUtils.MakeString(frame.Payload))); //pendiente fota de bios //var requestedpagelen = BitConverter_BigEndian.ToUInt16(Frame.Payload, 15); //var requestedpagenumber = BitConverter_BigEndian.ToUInt16(Frame.Payload, 17); //var resdata = new byte[50]; //Array.Copy(biosdata, 0, resdata, 0, 50); res = new UserMessage(Id, msgId); //res.Response = FactoryResponse(PacketType.BiosNewPage, Frame.Payload, resdata); break; } case PacketType.ReportEngineData: { var enginenum = frame.Payload[15]; var engineStateNum = frame.Payload[16]; var engineState = (EngineStates)engineStateNum; MessageIdentifier evcode; var isevent = new List <EngineStates> { EngineStates.Start, EngineStates.Stop }.Contains(engineState); if (_enginesStates.ContainsKey(enginenum) && (!isevent) && ((_enginesStates[enginenum]) == engineState)) { evcode = MessageIdentifier.AnalogicInputs; } else { if (!_enginesStates.ContainsKey(enginenum)) { _enginesStates.Add(enginenum, engineState); } switch (engineState) { case EngineStates.Start: evcode = MessageIdentifier.EngineOn; break; case EngineStates.Stop: evcode = MessageIdentifier.EngineOff; break; //case EngineStates.DataInfo: //case EngineStates.Unknown: default: evcode = MessageIdentifier.TelemetricData; break; } } var sb = new StringBuilder(); var engHours = BitConverter_BigEndian.ToUInt32(frame.Payload, 17); var fuelUsed = BitConverter_BigEndian.ToUInt32(frame.Payload, 21); var kVAhours = BitConverter_BigEndian.ToUInt32(frame.Payload, 25); var kVAhoursParcial = BitConverter_BigEndian.ToUInt32(frame.Payload, 29); var segundosRunParcial = BitConverter_BigEndian.ToUInt32(frame.Payload, 33); sb.AppendFormat(CultureInfo.InvariantCulture, "Modbus_{0}_EngineState:{1},", enginenum, engineState); if ((engHours != 0x8000) && (engHours != 0x80000000)) { sb.AppendFormat(CultureInfo.InvariantCulture, "Modbus_{0}_43587:{1},", enginenum, engHours); } if ((fuelUsed != 0x8000) && (fuelUsed != 0x80000000)) { sb.AppendFormat(CultureInfo.InvariantCulture, "Modbus_{0}_40126:{1},", enginenum, fuelUsed); } if ((kVAhours != 0x8000) && (kVAhours != 0x80000000)) { sb.AppendFormat(CultureInfo.InvariantCulture, "Modbus_{0}_43595:{1},", enginenum, kVAhours); } if ((kVAhoursParcial != 0x8000) && (kVAhoursParcial != 0x80000000)) { sb.AppendFormat(CultureInfo.InvariantCulture, "Modbus_{0}_40337:{1},", enginenum, kVAhoursParcial); } if ((segundosRunParcial != 0x8000) && (segundosRunParcial != 0x80000000)) { sb.AppendFormat(CultureInfo.InvariantCulture, "Modbus_{0}_SegundosRunParcial:{1},", enginenum, segundosRunParcial); } var res_ = evcode.FactoryEvent(MessageIdentifier.TelemetricData, Id, msgId, null, dt1, null, null); res_.SensorsDataString = sb.ToString(); STrace.Debug(GetType().FullName, Id, String.Format("EngineData: {0} Payload: {1}", res_.SensorsDataString, StringUtils.MakeString(frame.Payload))); res_.Response = FactoryResponse(PacketType.AckEngineData, frame.Payload, null); res = res_; break; } default: STrace.Debug(GetType().FullName, Id, String.Format("paquete no reconocido: {0}", StringUtils.MakeString(frame.Payload))); return(null); } //Debug.Assert(res != null); res.Tiempo = dt1; return(res); }
private static ushort GetShort(IFrame frame, int i, int offset) { return(BitConverter_BigEndian.ToUInt16(frame.Payload, offset + Recordlen * i)); }
public override IMessage Decode(IFrame frame) { try { var type = frame.Payload[0]; var time = GetTiempo(BitConverter_BigEndian.ToInt32(frame.Payload, 1)); switch (type) { case 1: //posicion var lat = (float)(BitConverter_BigEndian.ToUInt24(frame.Payload, 5) / 100000.0); var lon = (float)(BitConverter_BigEndian.ToUInt24(frame.Payload, 8) / 100000.0); var signs = frame.Payload[11]; if (BitHelper.IsBitSet(signs, 2)) { lat *= -1; } if (BitHelper.IsBitSet(signs, 1)) { lon *= -1; } STrace.Debug(GetType().FullName, String.Format("posicion: {0}:{1}:{2} === {3}", time, lat, lon, frame.Payload)); return(GPSPoint.Factory(time, lat, lon).ToPosition(Id, 0)); case 2: //login return(GetLogEvent(frame.Payload, Id, time, 3)); //quote dispatcher code: "case 3: return MessageCode.RfidEmployeeLogin.GetMessageCode();" case 3: //logout return(GetLogEvent(frame.Payload, Id, time, 4)); //quote dispatcher code: "case 4: return MessageCode.RfidEmployeeLogout.GetMessageCode();" case 6: //teclado: SMS, LOGIN_RFID, LOGOUT_RFID, LOGIN_LEGAJO, LOGOUT_LEGAJO var strs = Encoding.ASCII.GetString(frame.Payload, 5, frame.Payload.Length - 5).Split(" ".ToCharArray(), 2); var tipo = strs[0]; var texto = strs[1].Trim(); switch (tipo) { case MensajeTeclado.Sms: return(new TextEvent(Id, 0, time) { Text = texto, }); case MensajeTeclado.LoginRfid: { var rfid = decodeRFID(texto, 'm'); return(MessageIdentifierX.FactoryRfid(Id, 0, null, time, rfid, 3)); } case MensajeTeclado.LoginLegajo: { var msg = MessageIdentifierX.FactoryRfid(Id, 0, null, time, null, 3); msg.SensorsDataString = texto; //legajo return(msg); } case MensajeTeclado.LogoutRfid: { var rfid = decodeRFID(texto, 'm'); return(MessageIdentifierX.FactoryRfid(Id, 0, null, time, rfid, 4)); } case MensajeTeclado.LogoutLegajo: { var msg = MessageIdentifierX.FactoryRfid(Id, 0, null, time, null, 4); msg.SensorsDataString = texto; //legajo return(msg); } default: return(null); } default: return(null); } } catch (Exception e) { STrace.Exception(GetType().FullName, e, Id, String.Format("Parser Orbcomm message: {0}", frame.Payload)); return(null); } }