public override IMessage Decode(IFrame frame) { var buffer = AsString(frame); if (buffer == null) { return(null); } IMessage salida; var msgId = ParserUtils.GetMsgIdTaip(buffer); var data = buffer.Split(';')[0].Split(','); var tipoReporte = Reporte.GetTipoReporte(data); switch (tipoReporte) { case Reporte.Nada: return(null); case Reporte.EventoCq: { if (ParserUtils.IsInvalidDeviceId(Id)) { return(null); } byte entradas; int codEv; var gpsPoint = ParseCq(buffer, out entradas, out codEv, false); //TODO chequear que sea en kilometros o knots salida = GetSalida(gpsPoint, "00000000", codEv, this, msgId); break; } default: //es un ack o un mensaje no reconocido, no se responde, solo paso la info arriba salida = new UserMessage(Id, msgId); //CheckFota(msgId); break; } if ((msgId != ParserUtils.MsgIdNotSet) && (!salida.IsPending())) { salida.AddStringToSend(BuildAck(buffer)); } return(salida); }
public IMessage Decode(IFrame frame, GPSPoint.SourceProviders provider) { IMessage salida = null; var tipoReporte = Reporte.SinNodo; var msgId = ParserUtils.MsgIdNotSet; var dc = new VirlocDeviceCommand(frame.Payload, this); if (dc.isValid()) // && _askedIMEI != null) { tipoReporte = GetTipoReporte(dc); } if (dc.hasMessasgeId()) { msgId = dc.MessageId ?? 0; } switch (tipoReporte) { case Reporte.Nada: return(null); case Reporte.EventoGL: case Reporte.EventoGP: salida = GetSalida(dc, provider); break; case Reporte.SinNodo: if (!GetTipoReporte(dc).StartsWith(Reporte.IMEIReq)) { var askIMEIcmd = new VirlocDeviceCommand(Mensajes.AskIMEI, this, null); askIMEIcmd.IdNum = new VirlocDeviceCommand(frame.Payload, this).IdNum; var askIMEIcmdStr = askIMEIcmd.ToString(true); salida = new UserMessage(Id, dc.MessageId ?? 0); salida.AddStringToSend(askIMEIcmdStr); } else { salida = new ConfigRequest(Id, dc.MessageId ?? 0); var imei = ExtractIMEI(dc); if (imei != null) { _askedIMEI = imei; } } break; } if (!Reporte.SinNodo.Equals(tipoReporte)) { // Replying with ACK if needed if (dc.hasIdNum() && dc.hasMessasgeId() && !salida.IsPending()) { if (salida == null) { salida = new UserMessage(Id, msgId); } var ackStr = dc.BuildAck().ToString(true); salida.AddStringToSend(ackStr); } CheckLastSentAndDequeueIt(dc); if (LastSent == null) //&& !(new String[] {Reporte.IdReq}.Any(r=> tipoReporte == r))) { SendPendingFota(ref salida); } } return(salida); }
public override IMessage Decode(IFrame frame) { var s = Encoding.ASCII.GetString(frame.Payload, 0, frame.Payload.Length); var buffer = GetEntrada(s); if (buffer == null) { return(null); } IMessage salida; var msgId = ParserUtils.GetMsgIdTaip(buffer); var data = buffer.Split(';')[0].Split(','); var tipoReporte = GetTipoReporte(data); switch (tipoReporte) { case Reporte.Nada: return(null); case Reporte.EventoFg: if (ParserUtils.IsInvalidDeviceId(Id)) { goto case Reporte.SinNodo; } var bytes = new byte[33]; Array.Copy(frame.Payload, 4, bytes, 0, 33); salida = GetSalida(bytes, this, msgId); break; case Reporte.EventoGp: if (ParserUtils.IsInvalidDeviceId(Id)) { goto case Reporte.SinNodo; } salida = GetSalida(buffer, this, msgId, null); break; case Reporte.SinNodo: msgId = ParserUtils.MsgIdNotSet; //para no enviar ack sino un query salida = new UserMessage(Id, 0).AddStringToSend(">QIME<"); break; case Reporte.IdReq: msgId = ParserUtils.MsgIdNotSet; //para no enviar ack sino un query salida = Mensaje.FactorySetId(msgId, Id, ParserUtils.GetDeviceIdTaip(buffer)); break; default: //es un ack o un mensaje no reconocido, no se responde, solo paso la info arriba salida = new UserMessage(Id, msgId); //CheckFota(msgId); break; } if ((msgId != ParserUtils.MsgIdNotSet) && (!salida.IsPending())) { salida.AddStringToSend(BuildAck(buffer)); } return(salida); }