private static String GetEntrada(string tmp) { try { var ini = tmp.IndexOf('>'); var len = (tmp.IndexOf('<', ini) - ini) + 1; var msg = tmp.Substring(ini, len); if (!msg.Contains(";*")) { return(msg); } var chkini = msg.IndexOf(";*", StringComparison.Ordinal) + 2; var chkOrig = Convert.ToInt32(msg.Substring(chkini, 2), 16); var chkCalc = GetCheckSum(msg); if (chkCalc != chkOrig) { STrace.Debug(typeof(Parser).FullName, ParserUtils.GetDeviceIdTaip(msg), String.Format("Mensaje con error de checksum: {0}", msg)); return(null); } return(msg); } catch (Exception e) { STrace.Exception(typeof(Parser).FullName, e, tmp); return(null); } }
public override INode Factory(IFrame frame, int formerId) { var buffer = GetEntrada(frame.Payload); if (String.IsNullOrEmpty(buffer)) { return(null); } var x = buffer.StartsWith(Reporte.HandShake) ? DataProvider.FindByIMEI(buffer.Split(',')[2], this) : DataProvider.Get(ParserUtils.GetDeviceIdTaip(buffer), this); Console.WriteLine("Factory X: " + x.GetDeviceId()); return(x); }
public override INode Factory(IFrame frame, int formerId) { var buffer = Encoding.ASCII.GetString(frame.Payload, 0, frame.Payload.Length); if (String.IsNullOrEmpty(buffer)) { return(null); } var dev = ParserUtils.GetDeviceIdTaip(buffer); if (ParserUtils.IsInvalidDeviceId(dev)) { return(buffer.StartsWith(Reporte.IdReq) ? DataProvider.FindByIMEI(buffer.Substring(5, 15), this) : null); } return(DataProvider.Get(dev, this)); }
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); }