Skip to content

cowbjt/iBeaconDetectorDemo

Repository files navigation

TL;DR

A iBeacon Detector

ibeacon senario

Intro

iBeacon

  • A protocol developed by Apple
  • A Bluetooth low energy (BLE) device as Beacon
  • Beacon broadcasts information

iDevices of iBeacon supported

  • iPhone4S or later
  • 3rd generation iPad or later
  • iPad Mini or later
  • 5th generation iPod touch or later

BLE Advertising Packet

Preamble
1Byte
Address
4Bytes
Protocol Data Unit
<=39Bytes
CRC
3Bytes
Header
2Bytes
Payload
0 ~ 37Bytes

Payload

Field Size
UUID 16 bytes
Major 2 bytes
Minor 2 bytes

Example

Store Location San Francisco Paris London
UUID D9B9EC1F-3925-43D0-80A9-1E39D4CEA95C
Major 1 2 3
Minor Clothing 10 10 10
Housewares 20 20 20
Automotive 30 30 30

Programing

Privacy Permission Settings

  • NSLocationAlwaysUsageDescription

Check Feature And Request Authorization

func checkAvailable() -> Bool {
    if !CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
        return false
    }
    if CLLocationManager.authorizationStatus() != CLAuthorizationStatus.authorizedAlways {
        locationManager.requestAlwaysAuthorization()
    }

    return true
}

Start Monitor

guard let beaconUuid = UUID(uuidString: defaultUuid) else {
    throw AppError(msg: "Invalid UUID")
}

let r = CLBeaconRegion(proximityUUID: beaconUuid, identifier: beaconId)
r.notifyOnExit = true
r.notifyOnEntry = true
r.notifyEntryStateOnDisplay = true

locationManager.startMonitoring(for: r)

Range Beacons

if !CLLocationManager.isRangingAvailable() {
    return
}
locationManager.startRangingBeacons(in: region)

CLLocationManagerDelegate

locationManager.delegate = self

func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
    if beacons.count == 0 {
        return
    }

    // parse the nearest one
    parseBeacon(beacons[0], in: region)
}

Beacon Information

class CLBeacon : NSObject, NSCopying, NSSecureCoding {
    var proximityUUID: UUID { get }
    var major: NSNumber { get }
    var minor: NSNumber { get }
    var proximity: CLProximity { get }
    var accuracy: CLLocationAccuracy { get }
    var rssi: Int { get }
}

Reference

  1. Determining the Proximity to an iBeacon
  2. Turning an iOS Device into an iBeacon

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages