如何在 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"
我在我的项目中使用 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"