CLOSE Beacon Swift code snippets for iOS devices
Discovering non-activated CLOSE Beacons
Import required frameworks.
import UIKit
import CoreBluetooth
import Foundation
Define a UIViewController class implementing the CBCentralManagerDelegate and CBPeripheralDelegate protocols.
class InactiveVC: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate ... {
var manager : CBCentralManager!
override func viewDidLoad() {
super.viewDidLoad()
manager = CBCentralManager(delegate: self, queue: nil)
...
}
...
}
Handle updates of the CBCentralManager state. Start scanning for CloseBeacon peripherals if/when the CBCentralManager state indicates “PoweredOn”.
func centralManagerDidUpdateState(central: CBCentralManager) {
switch central.state {
case .Unknown:
print("BT state is unknown")
break;
case .Resetting:
print("BT is resetting")
break;
case .Unsupported:
print("BT is unsupported")
break;
case .Unauthorized:
print("BT is unauthorized in this app")
break
case .PoweredOff:
print("BT is powered off")
break;
case .PoweredOn:
print("BT is powered on")
manager.scanForPeripheralsWithServices(nil,
options: [CBCentralManagerScanOptionAllowDuplicatesKey : true])
break;
}
}
Handle discovered CLOSE Beacons.
func centralManager(central: CBCentralManager,
didDiscoverPeripheral peripheral: CBPeripheral,
advertisementData: [String : AnyObject],
RSSI: NSNumber) {
if peripheral.name != nil {
if peripheral.name == "closebeacon.com" {
for t in advertisementData {
if t.0 == "kCBAdvDataManufacturerData" {
let msd = NSData(data: t.1 as! NSData)
let m = UnsafePointer<UInt8>((msd.bytes))
let serNo = String(format: "%03d-%03d-%03d-%03d-%03d-%03d",
arguments: [m[6],m[5],m[4],m[3],m[2],m[1]])
print("Serial No: \(serNo)")
}
}
}
}
}
Discovering activated CLOSE Beacons
In order to find CLOSE Beacons that has been activated as iBeacon, you need to know at least the proximity UUID that was used when the CloseBeacon was activated.
First import the required frameworks.
import UIKit
import CoreLocation
Define a UIViewController implementing the CLLocationManagerDelegate protocol.
class ActiveVC: UIViewController, CLLocationManagerDelegate ... {
var knownUuids : [NSUUID] = []
let manager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
manager.delegate = self
if (CLLocationManager.authorizationStatus() != CLAuthorizationStatus.AuthorizedWhenInUse) {
manager.requestWhenInUseAuthorization()
}
...
}
...
}
Start ranging for CLOSE Beacons using known proximity UUIDs.
private func startRanging() {
for uuid in knownUuids {
print("Start ranging for uuid: \(uuid.UUIDString), fake id: \(uuid.hashValue)")
let r = CLBeaconRegion(proximityUUID: uuid, identifier: "\(uuid.hashValue)")
manager.startRangingBeaconsInRegion(r)
}
}
Handle found beacons.
func locationManager(manager: CLLocationManager,
didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
for b in beacons {
let uuidString = b.proximityUUID.UUIDString
print("Proxy UUID: \(uuidString)")
print("Major: \(b.major), Minor: \(b.minor), RSSI: \(b.rssi) dBm")
...
}
}