/** * Parses the given node discovery API data to create and return a remote * XBee Device. * * @param data Byte array with the data to parse. * @param localDevice The local device that received the remote XBee data. * * @return Discovered XBee device. */ private async Task <RemoteXBeeDevice> ParseDiscoveryAPIData(byte[] data, XBeeDevice localDevice) { if (data == null) { return(null); } RemoteXBeeDevice device = null; XBee16BitAddress addr16 = null; XBee64BitAddress addr64 = null; String id = null; // TODO role of the device: coordinator, router, end device or unknown. //XBeeDeviceType role = XBeeDeviceType.UNKNOWN; int signalStrength = 0; byte[] profileID = null; byte[] manufacturerID = null; using (var inputStream = new MemoryStream(data)) { // Read 16 bit address. addr16 = new XBee16BitAddress(await ByteUtils.ReadBytes(2, inputStream)); // Read 64 bit address. addr64 = new XBee64BitAddress(await ByteUtils.ReadBytes(8, inputStream)); switch (localDevice.XBeeProtocol) { case XBeeProtocol.ZIGBEE: case XBeeProtocol.DIGI_MESH: case XBeeProtocol.ZNET: case XBeeProtocol.DIGI_POINT: case XBeeProtocol.XLR: // TODO [XLR_DM] The next version of the XLR will add DigiMesh support. // For the moment only point-to-multipoint is supported in this kind of devices. case XBeeProtocol.XLR_DM: // Read node identifier. id = ByteUtils.ReadString(inputStream); // Read parent address. XBee16BitAddress parentAddress = new XBee16BitAddress(await ByteUtils.ReadBytes(2, inputStream)); // TODO Read device type. //role = XBeeDeviceType.get(inputStream.read()); // Consume status byte, it is not used yet. await ByteUtils.ReadBytes(1, inputStream); // Read profile ID. profileID = await ByteUtils.ReadBytes(2, inputStream); // Read manufacturer ID. manufacturerID = await ByteUtils.ReadBytes(2, inputStream); logger.DebugFormat("{0}Discovered {1} device: 16-bit[{2}], 64-bit[{3}], id[{4}], parent[{5}], profile[{6}], manufacturer[{7}].", xbeeDevice.ToString(), localDevice.XBeeProtocol.GetDescription(), addr16, addr64, id, parentAddress, HexUtils.ByteArrayToHexString(profileID), HexUtils.ByteArrayToHexString(manufacturerID)); break; case XBeeProtocol.RAW_802_15_4: // Read strength signal byte. signalStrength = inputStream.ReadByte(); // Read node identifier. id = ByteUtils.ReadString(inputStream); logger.DebugFormat("{0}Discovered {1} device: 16-bit[{2}], 64-bit[{3}], id[{4}], rssi[{5}].", xbeeDevice.ToString(), localDevice.XBeeProtocol.GetDescription(), addr16, addr64, id, signalStrength); break; case XBeeProtocol.UNKNOWN: default: logger.DebugFormat("{0}Discovered {1} device: 16-bit[{2}], 64-bit[{3}].", xbeeDevice.ToString(), localDevice.XBeeProtocol.GetDescription(), addr16, addr64); break; } // Create device and fill with parameters. switch (localDevice.XBeeProtocol) { case XBeeProtocol.ZIGBEE: device = new RemoteZigBeeDevice(localDevice, addr64, addr16, id /*, role*/); // TODO profileID and manufacturerID break; case XBeeProtocol.DIGI_MESH: device = new RemoteDigiMeshDevice(localDevice, addr64, id /*, role*/); // TODO profileID and manufacturerID break; case XBeeProtocol.DIGI_POINT: device = new RemoteDigiPointDevice(localDevice, addr64, id /*, role*/); // TODO profileID and manufacturerID break; case XBeeProtocol.RAW_802_15_4: device = new RemoteRaw802Device(localDevice, addr64, addr16, id /*, role*/); // TODO signalStrength break; default: device = new RemoteXBeeDevice(localDevice, addr64, addr16, id /*, role*/); break; } } return(device); }
/** * Parses the given node discovery API data to create and return a remote * XBee Device. * * @param data Byte array with the data to parse. * @param localDevice The local device that received the remote XBee data. * * @return Discovered XBee device. */ private async Task<RemoteXBeeDevice> ParseDiscoveryAPIData(byte[] data, XBeeDevice localDevice) { if (data == null) return null; RemoteXBeeDevice device = null; XBee16BitAddress addr16 = null; XBee64BitAddress addr64 = null; String id = null; // TODO role of the device: coordinator, router, end device or unknown. //XBeeDeviceType role = XBeeDeviceType.UNKNOWN; int signalStrength = 0; byte[] profileID = null; byte[] manufacturerID = null; using (var inputStream = new MemoryStream(data)) { // Read 16 bit address. addr16 = new XBee16BitAddress(await ByteUtils.ReadBytes(2, inputStream)); // Read 64 bit address. addr64 = new XBee64BitAddress(await ByteUtils.ReadBytes(8, inputStream)); switch (localDevice.XBeeProtocol) { case XBeeProtocol.ZIGBEE: case XBeeProtocol.DIGI_MESH: case XBeeProtocol.ZNET: case XBeeProtocol.DIGI_POINT: case XBeeProtocol.XLR: // TODO [XLR_DM] The next version of the XLR will add DigiMesh support. // For the moment only point-to-multipoint is supported in this kind of devices. case XBeeProtocol.XLR_DM: // Read node identifier. id = ByteUtils.ReadString(inputStream); // Read parent address. XBee16BitAddress parentAddress = new XBee16BitAddress(await ByteUtils.ReadBytes(2, inputStream)); // TODO Read device type. //role = XBeeDeviceType.get(inputStream.read()); // Consume status byte, it is not used yet. await ByteUtils.ReadBytes(1, inputStream); // Read profile ID. profileID = await ByteUtils.ReadBytes(2, inputStream); // Read manufacturer ID. manufacturerID = await ByteUtils.ReadBytes(2, inputStream); logger.DebugFormat("{0}Discovered {1} device: 16-bit[{2}], 64-bit[{3}], id[{4}], parent[{5}], profile[{6}], manufacturer[{7}].", xbeeDevice.ToString(), localDevice.XBeeProtocol.GetDescription(), addr16, addr64, id, parentAddress, HexUtils.ByteArrayToHexString(profileID), HexUtils.ByteArrayToHexString(manufacturerID)); break; case XBeeProtocol.RAW_802_15_4: // Read strength signal byte. signalStrength = inputStream.ReadByte(); // Read node identifier. id = ByteUtils.ReadString(inputStream); logger.DebugFormat("{0}Discovered {1} device: 16-bit[{2}], 64-bit[{3}], id[{4}], rssi[{5}].", xbeeDevice.ToString(), localDevice.XBeeProtocol.GetDescription(), addr16, addr64, id, signalStrength); break; case XBeeProtocol.UNKNOWN: default: logger.DebugFormat("{0}Discovered {1} device: 16-bit[{2}], 64-bit[{3}].", xbeeDevice.ToString(), localDevice.XBeeProtocol.GetDescription(), addr16, addr64); break; } // Create device and fill with parameters. switch (localDevice.XBeeProtocol) { case XBeeProtocol.ZIGBEE: device = new RemoteZigBeeDevice(localDevice, addr64, addr16, id/*, role*/); // TODO profileID and manufacturerID break; case XBeeProtocol.DIGI_MESH: device = new RemoteDigiMeshDevice(localDevice, addr64, id/*, role*/); // TODO profileID and manufacturerID break; case XBeeProtocol.DIGI_POINT: device = new RemoteDigiPointDevice(localDevice, addr64, id/*, role*/); // TODO profileID and manufacturerID break; case XBeeProtocol.RAW_802_15_4: device = new RemoteRaw802Device(localDevice, addr64, addr16, id/*, role*/); // TODO signalStrength break; default: device = new RemoteXBeeDevice(localDevice, addr64, addr16, id/*, role*/); break; } } return device; }