如何在 MacOS 上解析 iBeacon (Swift)

How to parse the iBeacon on MacOS (Swift)

我在我的项目中使用 iBeacons,我需要从广告数据中提取主要、次要、UUID、txPower 和信标类型值。

我从 CBCentralManagerDelegate 获取广告数据:

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)

然后我得到 major、minor、uuid 和 txPower 值:

var uuidBytes: [UInt8] = [0]
var majorBytes: UInt16 = 0
var minorBytes: UInt16 = 0
var txPower: UInt16 = 0

let uuidRange: NSRange = NSMakeRange(4, 16)
let majorRange: NSRange = NSMakeRange(20, 2)
let minorRange: NSRange = NSMakeRange(22, 2)
let powerRange: NSRange = NSMakeRange(24, 1)

data.getBytes(&uuidBytes, range: uuidRange)
let proximityUUID: NSUUID = NSUUID(uuidBytes: &uuidBytes)

data.getBytes(&majorBytes, range: majorRange)
let majorBytesBig: uint16 = (majorBytes >> 8) | (majorBytes << 8)

data.getBytes(&minorBytes, range: minorRange)
let minorBytesBig: UInt16 = (minorBytes >> 8) | (minorBytes << 8);

data.getBytes(&txPower, range: powerRange)

但是我怎样才能得到信标类型? (iBeacon 规范中的 0x02 和 0x15 值)

更新:我在 Obj-C 中找到了用于确定信标类型的下一个函数

- (BOOL)advDataIsBeacon:(NSData *)data
{
    Byte expectingBytes [4] = { 0x4c, 0x00, 0x02, 0x15 };
    NSData *expectingData = [NSData dataWithBytes:expectingBytes length:sizeof(expectingBytes)];

    if (data.length > expectingData.length)
    {
        if ([[data subdataWithRange:NSMakeRange(0, expectingData.length)] isEqual:expectingData])
        {
            return YES;
        }
    }

    return NO;
}

但它在 Swift 中不起作用。

可在此处找到 0215:

let beaconTypeCode: NSRange = NSMakeRange(2, 2)

这个函数可以帮助判断广告数据是否是iBeacon。

private func isBeacon(_ data: NSData) -> Bool {
    var beaconType: UInt16 = 0
    let beaconTypeRange = NSMakeRange(2, 1)
    data.getBytes(&beaconType, range: beaconTypeRange)

    if (beaconType != 0x02) {
        return false
    }

    var beaconTypeLength: UInt16 = 0
    let beaconTypeLengthRange = NSMakeRange(3, 1)
    data.getBytes(&beaconTypeLength, range: beaconTypeLengthRange)

    if (beaconTypeLength != 0x15) {
        return false
    }

    return true
}

另外,参见 "Proximity Beacon Specification. Release R1"