iOS iBeacon:如何以编程方式获取所有proximityUUID?

我想以编程方式查看广告数据包的所有proximityUUID。 一些文章说,这是不可能在iOS上,但Android是可能的。 但我不能相信它,因为我发现这个梦幻般的应用程序“BLExplr”具有这个function。 我需要在我的应用程序中实现该function。 有谁知道如何做到这一点或好例子? 任何帮助将不胜感激。

(更新2014/1/17)

我相信@davidgyoung答案是正确的。 Estimote信标的proximityUUID是“B9407F30-F5F8-466E-AFF9-25556B57FE6D”,但在BLExplr应用程序上显示了我的Estimote信标的UUID是另一个ID。

在这里输入图像说明在这里输入图像说明

不幸的是,你不能在iOS上这个。 当你说BLExplr和LightBlue可以做到这一点,你是蓝牙服务UUID与iBeacon Proximity UUID混淆。 这是两个完全不同的东西。

蓝牙服务的UUID对于iOS来说是可见的,但是与iBeacon的标识符无关,而且与iBeacons一起工作也是无用的。 服务UUID由iOS在每次看到蓝牙设备时生成,并且仅在蓝牙设备处于范围内的持续时间内保持不变。 如果您将蓝牙设备拿走并稍后将其拿回,则它将具有不同的服务UUID。

一个iBeacon的标识符(ProximityUUID,Major,Minor)被embedded到蓝牙广告的主体中。 iOS设备上的问题是,Apple的CoreBluetooth API禁止访问原始广告主体,因此没有第三方应用程序能够读取这些标识符。 Apple只允许使用特殊的iBeacon CoreLocation API访问这些标识符,但是这些API要求您事先了解Proximity UUID。

对不起,我知道这不是你想听的答案! (对此我也感到抱歉!)对于它的价值,您可以在Android,OSX Mavericks和Linux上进行此操作。

在这里看到细节。

davidgyoung部分是不能获得iBeacon信息的错误。 你实际上可以在OS X上获得接近UUID, 但不是iOS

CBPeripheraladvertisingData ,应该有一个叫做kCBAdvDataManufacturerData的键; 这是代表iBeacon广告信息的NSData此密钥仅在OS X上可用

检查第二个字节是否等于0x02 ,前两个字节等于0x004c (十进制76 ),第四个字节(十进制)+4等于数据长度(应该是25)。

NSRanges(抱歉Mac语法)
接近UUID: NSMakeRange(4, 16)
主修: NSMakeRange(20,2)
轻微: NSMakeRange(22,2)

为了确保你做的是正确的,你可以将值logging为hex(使用格式string%x ),并确保它们匹配来自哪里的NSDatadescription

 NSRange uuidRange = NSMakeRange(4, 16); NSRange majorRange = NSMakeRange(20, 2); NSRange minorRange = NSMakeRange(22, 2); NSRange powerRange = NSMakeRange(24, 1); Byte uuidBytes[16]; [data getBytes:&uuidBytes range:uuidRange]; NSUUID *uuid = [[NSUUID alloc] initWithUUIDBytes:uuidBytes]; int16_t majorBytes; [data getBytes:&majorBytes range:majorRange]; int16_t majorBytesBig = (majorBytes >> 8) | (majorBytes << 8); int16_t minorBytes; [data getBytes:&minorBytes range:minorRange]; int16_t minorBytesBig = (minorBytes >> 8) | (minorBytes << 8); int8_t powerByte; [data getBytes:&powerByte range:powerRange]; return @{ @"uuid" : uuid, @"major" : @(majorBytesBig), @"minor" : @(minorBytesBig), @"power" : @(powerByte) }; 

但是uuid是DeviceUUID,而不是ProximityUUID