Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }