private static LeAdvertisingEvent[] ParseAdvertisingReport(Queue <byte> data) { int numberOfEvents = data.Dequeue(); var events = new LeAdvertisingEvent[numberOfEvents]; for (int i = 0; i < numberOfEvents; i++) { events[i] = LeAdvertisingEvent.Parse(data); } return(events); }
private static LeAdvertisingEvent[] ParseAdvertisingReport(Queue<byte> data) { int numberOfEvents = data.Dequeue(); var events = new LeAdvertisingEvent[numberOfEvents]; for (int i = 0; i < numberOfEvents; i++) events[i] = LeAdvertisingEvent.Parse(data); return events; }
/// <summary> /// Parse low energy advertising event to a beacon instance. /// </summary> /// <param name="e">The event.</param> /// <returns>The beacon or null in case of failure.</returns> internal static Beacon Parse(LeAdvertisingEvent e) { if (e.EventType == LeAdvertisingEventType.ScanRsp) return null; var payload = new Queue<byte>(e.Payload); while (payload.Count > 0) { var adLength = payload.Dequeue(); if (payload.Count < adLength) break; var adType = payload.Dequeue(); if (adType == 0xFF || adLength >= 26) { var companyId = (ushort)((payload.Dequeue() << 8) + payload.Dequeue()); var b0advInd = payload.Dequeue(); var b1advInd = payload.Dequeue(); var uuid = payload.Dequeue(16); var major = (ushort)((payload.Dequeue() << 8) + payload.Dequeue()); var minor = (ushort)((payload.Dequeue() << 8) + payload.Dequeue()); var txPower = (sbyte)payload.Dequeue(); return new Beacon { Uuid = uuid.ToLittleEndianFormattedUuidString(), Address = e.Address, Major = major, Minor = minor, Rssi = e.Rssi, CalibratedTxPower = txPower, CompanyId = companyId }; } else { if (adLength > 0) payload.Dequeue(adLength - 1); } } return null; }
/// <summary> /// Parse low energy advertising event to a beacon instance. /// </summary> /// <param name="e">The event.</param> /// <returns>The beacon or null in case of failure.</returns> internal static Beacon Parse(LeAdvertisingEvent e) { if (e.EventType == LeAdvertisingEventType.ScanRsp) return null; if (e.Payload.Length < 9) return null; var payload = new Queue<byte>(e.Payload); var ad1Length = payload.Dequeue(); var ad1Type = payload.Dequeue(); var flags = payload.Dequeue(); var ad2Length = payload.Dequeue(); var ad2Type = payload.Dequeue(); var companyId = (ushort)((payload.Dequeue() << 8) + payload.Dequeue()); var b0advInd = payload.Dequeue(); var b1advInd = payload.Dequeue(); if (ad1Length != 2 || ad1Type != 0x01 || ad2Length < 26 || ad2Type != 0xFF) return null; var uuid = payload.Dequeue(16); var major = (ushort)((payload.Dequeue() << 8) + payload.Dequeue()); var minor = (ushort)((payload.Dequeue() << 8) + payload.Dequeue()); var txPower = (sbyte)payload.Dequeue(); return new Beacon { Uuid = uuid.ToLittleEndianFormattedUuidString(), Address = e.Address, Major = major, Minor = minor, Rssi = e.Rssi, CalibratedTxPower = txPower, CompanyId = companyId }; }