protected override void OnReceive(StreamBlock block) { // agregarmos al buffer. STrace.Debug(GetType().FullName, deviceId, String.Format("FileServer: bloque de datos={0}", block.TotalBytes)); Array.Copy(block.Data, 0, active_buffer, buffer_position, block.TotalBytes); buffer_position += block.TotalBytes; if (!headers_readed) { if (buffer_position >= 71) { // leer la cabecera... podemos // Short IdDispositivo // Byte Destino (0x00 = File, 0x01 = Queue) // Integer Tamaño del Archivo (setea $FileSize) // Bytes[64] Nombre de Archivo o Base64MessageQueue segun corresponda (Rellenado con 0) // Bytes[$FileSize] Datos del archivo. var pos = 0; deviceId = UrbetrackCodec.DecodeShort(active_buffer, ref pos); op = UrbetrackCodec.DecodeByte(active_buffer, ref pos); chunk_size = UrbetrackCodec.DecodeInteger(active_buffer, ref pos); label = UrbetrackCodec.DecodeBytesAsString(active_buffer, ref pos, 64); headers_readed = true; strm = new MemoryStream(); STrace.Debug(GetType().FullName, deviceId, String.Format("Iniciando Recepcion: queue={0} size={1}", label, chunk_size)); } else { return; // aun no leimos suficiente. } } while (buffer_position > payload_start) { STrace.Debug(GetType().FullName, deviceId, String.Format("Recibiendo bloque: size={0}", buffer_position - payload_start)); var data_block = new byte[buffer_position - payload_start]; Array.Copy(active_buffer, payload_start, data_block, 0, buffer_position - payload_start); strm.Write(data_block, 0, buffer_position - payload_start); buffer_position = payload_start = 0; if (strm.Length != chunk_size) { continue; } bool local_result; try { local_result = MessageReceived(deviceId, op, label, strm, true); } catch (Exception e) { STrace.Exception(GetType().FullName, e); local_result = false; } Send(Encoding.ASCII.GetBytes(local_result ? "A" : "N"), 1, deviceId, "MemoryStream"); STrace.Debug(GetType().FullName, deviceId, String.Format("Respondo {0} y cierro.", local_result ? "A" : "N")); Disconnect(); } }
public RemoteShell(byte[] buffer, int pos) { PDU this_pdu = this; Entrante = true; UrbetrackCodec.DecodeHeaders(buffer, ref this_pdu, ref pos); Order = UrbetrackCodec.DecodeInteger(buffer, ref pos); CommandLine = UrbetrackCodec.DecodeString(buffer, ref pos); }
public SystemReport(byte[] buffer, int pos) { PDU this_pdu = this; Entrante = true; UrbetrackCodec.DecodeHeaders(buffer, ref this_pdu, ref pos); SystemResets = UrbetrackCodec.DecodeInteger(buffer, ref pos); WatchDogResets = UrbetrackCodec.DecodeInteger(buffer, ref pos); GPS_FixedSeconds = UrbetrackCodec.DecodeInteger(buffer, ref pos); GPS_BlindSeconds = UrbetrackCodec.DecodeInteger(buffer, ref pos); GPS_Resets = UrbetrackCodec.DecodeInteger(buffer, ref pos); NETWORK_UDP_ReceivedBytes = UrbetrackCodec.DecodeInteger(buffer, ref pos); NETWORK_UDP_SentBytes = UrbetrackCodec.DecodeInteger(buffer, ref pos); NETWORK_UDP_ReceivedDgrams = UrbetrackCodec.DecodeInteger(buffer, ref pos); NETWORK_UDP_SentDgrams = UrbetrackCodec.DecodeInteger(buffer, ref pos); NETWORK_Resets = UrbetrackCodec.DecodeInteger(buffer, ref pos); MODEM_Resets = UrbetrackCodec.DecodeInteger(buffer, ref pos); }
public Evento(byte[] buffer, int pos) { PDU this_pdu = this; Entrante = true; UrbetrackCodec.DecodeHeaders(buffer, ref this_pdu, ref pos); var d = Devices.I().FindById(this_pdu.IdDispositivo); Posicion = UrbetrackCodec.DecodeGPSPointEx(buffer, ref pos, d); CodigoEvento = UrbetrackCodec.DecodeShort(buffer, ref pos); Datos = UrbetrackCodec.DecodeInteger(buffer, ref pos); Payload = null; switch (CL) { case 0xFF: PayloadSize = 0; Extra = 0; RiderRevision = -1; if (d.Type == DeviceTypes.Types.URBETRACK_v1_0 || d.Type == DeviceTypes.Types.URBETRACK_v0_8 || d.Type == DeviceTypes.Types.URBETRACK_v0_8n) { RiderIdentifier = Encoding.ASCII.GetString(UrbetrackCodec.DecodeBytes(buffer, ref pos, 10)); if (String.IsNullOrEmpty(RiderIdentifier)) { RiderIdentifier = "0000000000"; } } else { RiderIdentifier = "0000000000"; } break; case 0xFE: RiderIdentifier = Encoding.ASCII.GetString(UrbetrackCodec.DecodeBytes(buffer, ref pos, 10)); RiderRevision = UrbetrackCodec.DecodeInteger(buffer, ref pos); Extra = UrbetrackCodec.DecodeInteger(buffer, ref pos); PayloadSize = UrbetrackCodec.DecodeInteger(buffer, ref pos); if (PayloadSize > 0) { Payload = UrbetrackCodec.DecodeBytes(buffer, ref pos, PayloadSize); } break; } }
internal void PDURecibida(XBeeAPIPort uart, XBeePDU pdu) { STrace.Debug(typeof(XBeeRadioLinkProtocol).FullName, String.Format("XBEE-PDU: code={0:X}", pdu.Data[0])); switch (pdu.Data[0]) { case (byte)FrameType.STATUS_REPORT: { var pos = 1; var node = XBeeAPIPort.FindNode(pdu.Address); if (node == null) { var addr = String.Format("{0:X}", pdu.Address); var nd = Devices.I().FindByXbeeAddr(addr); if (nd == null) { return; } var nn = new XBeeNode { Address = pdu.Address, Id = String.Format("D:{0}", nd.Imei) }; nn.Trace("NODO DETECTADO EN CALIENTE:"); node = nn; } XBeeAPIPort.UpdateNode(node); var d = Devices.I().FindByImei(node.IMEI()); if (d == null) { STrace.Debug(typeof(XBeeRadioLinkProtocol).FullName, String.Format("XBEERLP: device imei={0} no encontrado.", node.IMEI())); return; } d.XBeeSession.Report.RadioLinkState = (XBeeReport.DeviceXbeeMachineStates)UrbetrackCodec.DecodeByte(pdu.Data, ref pos); d.XBeeSession.Report.CommCoreState = (XBeeReport.DeviceSessionMachineStates)UrbetrackCodec.DecodeByte(pdu.Data, ref pos); d.XBeeSession.Report.NetworkConnections = UrbetrackCodec.DecodeByte(pdu.Data, ref pos); d.XBeeSession.Report.QueryState = (XBeeReport.QueryStates)UrbetrackCodec.DecodeByte(pdu.Data, ref pos); d.XBeeSession.Report.QueryStartSample = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.QueryEndSample = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.CursorSample = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.OldestSample = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.OldestTrackingSample = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.Processed = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.Empty = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.Tracking = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.Detailed = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.Sent = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.SessionSent = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.XBeeSession.Report.Pendings = UrbetrackCodec.DecodeInteger(pdu.Data, ref pos); d.Destino.XBee = new XBeeAddress { Addr = pdu.Address }; STrace.Debug(typeof(XBeeRadioLinkProtocol).FullName, String.Format("XBEERLP: device imei={0} actualizando. {1}/{2}/{3}", node.IMEI(), d.XBeeSession.Report.RadioLinkState, d.XBeeSession.Report.NetworkConnections, d.XBeeSession.Report.QueryState)); TransporteXBEE.DoReceiveReport(d); return; } case (byte)FrameType.USER_PART: { var data_size = pdu.Data.GetLength(0) - 1; var instance_buffer = new byte[data_size]; Array.Copy(pdu.Data, 1, instance_buffer, 0, data_size); var node = XBeeAPIPort.FindNode(pdu.Address); if (node == null) { STrace.Debug(typeof(XBeeRadioLinkProtocol).FullName, String.Format("XBEERLP IGNORANDO NODO {0}", pdu.Address)); return; } XBeeAPIPort.UpdateNode(node); var instance_addr = new XBeeAddress { Addr = pdu.Address }; TransporteXBEE.Receive(instance_buffer, data_size, instance_addr); return; } case (byte)FrameType.DISABLE_LINK_RESPONSE: { var node = XBeeAPIPort.FindNode(pdu.Address); if (node == null) { return; } XBeeAPIPort.UpdateNode(node); var d = Devices.I().FindByImei(node.IMEI()); d.XBeeSession.GoesInactive(); TransporteXBEE.DoReceiveReport(d); RemoveTransaction(d); break; } case (byte)FrameType.ENABLE_LINK_RESPONSE: { var node = XBeeAPIPort.FindNode(pdu.Address); if (node == null) { return; } XBeeAPIPort.UpdateNode(node); var d = Devices.I().FindByImei(node.IMEI()); if (!FoundTransaction(d)) { break; } d.XBeeSession.GoesActive(); TransporteXBEE.DoReceiveReport(d); RemoveTransaction(d); break; } default: STrace.Debug(typeof(XBeeRadioLinkProtocol).FullName, "@@@"); break; } return; }
public LoginRequest(byte[] buffer, int pos) { PDU this_pdu = this; Entrante = true; UrbetrackCodec.DecodeHeaders(buffer, ref this_pdu, ref pos); IMEI = UrbetrackCodec.DecodeString(buffer, ref pos); Password = UrbetrackCodec.DecodeString(buffer, ref pos); Firmware = UrbetrackCodec.DecodeString(buffer, ref pos); ConfigRevision = UrbetrackCodec.DecodeShort(buffer, ref pos); var d = Fleet.Devices.I().FindById(IdDispositivo); switch (CL) { case 0x00: DetectedDeviceType = DeviceTypes.Types.SISTELCOM_v1; break; case 0x01: PendingMessages = UrbetrackCodec.DecodeShort(buffer, ref pos); DetectedDeviceType = DeviceTypes.Types.SISTELCOM_v2; break; case 0x02: DetectedDeviceType = DeviceTypes.Types.URB_v0_5; break; case 0x04: DetectedDeviceType = DeviceTypes.Types.URBMOBILE_v0_1; break; case 0x06: DetectedDeviceType = DeviceTypes.Types.URB_v0_7; QTreeRevision = UrbetrackCodec.DecodeInteger(buffer, ref pos); XbeeHardware = UrbetrackCodec.DecodeString(buffer, ref pos); XbeeFirmware = UrbetrackCodec.DecodeString(buffer, ref pos); break; case 0x10: DetectedDeviceType = DeviceTypes.Types.URBETRACK_v0_8n; QTreeRevision = UrbetrackCodec.DecodeInteger(buffer, ref pos); XbeeHardware = UrbetrackCodec.DecodeString(buffer, ref pos); XbeeFirmware = UrbetrackCodec.DecodeString(buffer, ref pos); SecureId = UrbetrackCodec.DecodeString(buffer, ref pos); break; case 0x11: case 0x12: case 0x13: case 0x14: DetectedDeviceType = CL <= 0x12 ? DeviceTypes.Types.URBETRACK_v0_8 : DeviceTypes.Types.URBETRACK_v1_0; QTreeRevision = UrbetrackCodec.DecodeInteger(buffer, ref pos); if (CL > 0x12) { MessagesRevision = UrbetrackCodec.DecodeInteger(buffer, ref pos); } XbeeHardware = UrbetrackCodec.DecodeString(buffer, ref pos); XbeeFirmware = UrbetrackCodec.DecodeString(buffer, ref pos); SecureId = UrbetrackCodec.DecodeString(buffer, ref pos); if (CL == 0x11 || CL == 0x13) { GPSPoint = UrbetrackCodec.DecodeGPSPointEx(buffer, ref pos, d); RiderIdentifier = Encoding.ASCII.GetString(UrbetrackCodec.DecodeBytes(buffer, ref pos, 10)); } break; default: DetectedDeviceType = DeviceTypes.Types.UNKNOW_DEVICE; break; } }