我在项目中使用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中无效。
答案 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)