diff --git a/EddystoneScanner/EddystoneRFC/Models/Beacon.swift b/EddystoneScanner/EddystoneRFC/Models/Beacon.swift index 82c0e90..80ca7ad 100644 --- a/EddystoneScanner/EddystoneRFC/Models/Beacon.swift +++ b/EddystoneScanner/EddystoneRFC/Models/Beacon.swift @@ -103,6 +103,7 @@ import CoreBluetooth frameData: Data?, rssi: Int, name: String?, + namespaceFilter: String?, filterType: RSSIFilterType) { guard let frameData = frameData, frameData.count > 1 else { return nil @@ -127,6 +128,15 @@ import CoreBluetooth } beaconID = BeaconID(beaconType: .eddystone, beaconID: Array(frameBytes[2..<18])) + if let filter = namespaceFilter { + if let namespace = beaconID.namespace?.hexString { + if filter != namespace { + return nil + } + } else { + return nil + } + } } else { guard frameBytes.count >= 10 else { debugPrint("Frame Data for EID Frame unexpectedly truncated.") diff --git a/EddystoneScanner/EddystoneRFC/Models/BeaconID.swift b/EddystoneScanner/EddystoneRFC/Models/BeaconID.swift index 0748bdb..cee913f 100644 --- a/EddystoneScanner/EddystoneRFC/Models/BeaconID.swift +++ b/EddystoneScanner/EddystoneRFC/Models/BeaconID.swift @@ -38,7 +38,7 @@ public enum BeaconType { /// 10 byte raw namespace data /// @objc public var namespace: Array? { - guard beaconID.count >= 10 else { + guard beaconType == .eddystone else { return nil } return Array(beaconID[..<10]) @@ -48,12 +48,22 @@ public enum BeaconType { /// 6 byte raw namespace data /// @objc public var instance: Array? { - guard beaconID.count >= 16 else { + guard beaconType == .eddystone else { return nil } return Array(beaconID[10..<16]) } + /// + /// 8 byte raw Ephemeral Identifier + /// + @objc public var ephemeralIdentifier: Array? { + guard beaconType == .eddystoneEID else { + return nil + } + return Array(beaconID[..<8]) + } + /// /// Base64 encoded string of the byte beacon ID data /// diff --git a/EddystoneScanner/Scanner.swift b/EddystoneScanner/Scanner.swift index 724b005..740acd1 100644 --- a/EddystoneScanner/Scanner.swift +++ b/EddystoneScanner/Scanner.swift @@ -153,16 +153,6 @@ extension Scanner: CBCentralManagerDelegate { return } - if let filter = namespaceFilter { - if let namespace = beacon.beaconID.namespace?.hexString { - if filter != namespace { - return - } - } else { - return - } - } - beacon.updateBeacon(telemetryData: telemetryData, eddystoneURL: nil, rssi: RSSI.intValue) self.nearbyBeacons.update(with: beacon) @@ -177,20 +167,10 @@ extension Scanner: CBCentralManagerDelegate { guard let index = nearbyBeacons.index(where: {$0.identifier == peripheral.identifier}) else { // Newly discovered beacon. Create a new beacon object let beaconServiceData = serviceData[Eddystone.ServiceUUID] as? Data - guard let beacon = Beacon(identifier: peripheral.identifier, frameData: beaconServiceData, rssi: RSSI.intValue, name: peripheral.name, filterType: rssiFilterType) else { + guard let beacon = Beacon(identifier: peripheral.identifier, frameData: beaconServiceData, rssi: RSSI.intValue, name: peripheral.name, namespaceFilter: namespaceFilter, filterType: rssiFilterType) else { return } - if let filter = namespaceFilter { - if let namespace = beacon.beaconID.namespace?.hexString { - if filter != namespace { - return - } - } else { - return - } - } - self.nearbyBeacons.insert(beacon) self.delegate?.didFindBeacon(scanner: self, beacon: beacon) return @@ -222,16 +202,6 @@ extension Scanner: CBCentralManagerDelegate { return } - if let filter = namespaceFilter { - if let namespace = beacon.beaconID.namespace?.hexString { - if filter != namespace { - return - } - } else { - return - } - } - beacon.updateBeacon(telemetryData: nil, eddystoneURL: eddystoneURL, rssi: RSSI.intValue) self.nearbyBeacons.update(with: beacon) diff --git a/SampleApp/BeaconTableViewCell.swift b/SampleApp/BeaconTableViewCell.swift index a5f9793..d97fc32 100644 --- a/SampleApp/BeaconTableViewCell.swift +++ b/SampleApp/BeaconTableViewCell.swift @@ -64,9 +64,15 @@ class BeaconTableViewCell: UITableViewCell { self.batteryView.backgroundColor = batteryColor(forGreenAmount: batteryAmount) guard let instance = beacon.beaconID.instance, let namespace = beacon.beaconID.namespace else { + guard let ephemeralIdentifier = beacon.beaconID.ephemeralIdentifier else { + self.beaconMac.text = "Instance | Namespace | Ephemeral Identifier not found" + self.beaconNamespace.text = "Instance | Namespace | Ephemeral Identifier not found" + self.beaconInstance.text = "Instance | Namespace | Ephemeral Identifier not found" + return + } self.beaconMac.text = beacon.beaconID.description - self.beaconNamespace.text = "Namespace: Not found, maybe a EID frame" - self.beaconInstance.text = "Instance: Not found, maybe a EID frame" + self.beaconNamespace.text = "Ephemeral Identifier: \(ephemeralIdentifier)" + self.beaconInstance.text = "Instance: Should be decoded" return }