如何解析MacOS上的iBeacon(Swift)

时间:2018-04-02 19:34:55

标签: swift macos parsing ibeacon beacon

我在项目中使用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值)

UPDATE :我在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中无效。

2 个答案:

答案 0 :(得分: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
}

另请参阅“接近信标规范。发布R1”

答案 1 :(得分:0)

0215可以在这里找到:

let beaconTypeCode: NSRange = NSMakeRange(2, 2)