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

时间:2014-01-16 13:35:09

标签: ios ibeacon

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

(更新2014/1/17)

我相信@davidgyoung回答是对的。 Estimote beacon的proximityUUID是“B9407F30-F5F8-466E-AFF9-25556B57FE6D”,但在BLExplr app上显示我的Estimote beacon的UUID是另一个ID。

enter image description here enter image description here

3 个答案:

答案 0 :(得分:23)

不幸的是,你不能在iOS上这样做。当你说BLExplr和LightBlue可以做到这一点时,你会将蓝牙服务UUID与iBeacon Proximity UUID混淆。这是两件截然不同的事情。

蓝牙服务UUID对iOS可见,但与iBeacon的标识符无关,对于使用iBeacons毫无用处。每次看到蓝牙设备时,iOS都会生成服务UUID,并且只在蓝牙设备处于范围内的持续时间内保持相同。如果您带走蓝牙设备并稍后将其恢复,它将具有不同的服务UUID。

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

抱歉,我知道这不是你想听到的答案! (我也很抱歉!)对于它的价值,你可以在Android,OSX Mavericks和Linux上做到这一点。

详见here

答案 1 :(得分:8)

davidgyoung 部分错误是无法获取iBeacon信息。您实际上 可以 在OS X上获得邻近UUID,但不是iOS

CBPeripheral' advertisingData中,应该有一个名为kCBAdvDataManufacturerData的密钥;它是表示iBeacon广告信息的NSData此密钥仅适用于OS X

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

NSRanges(对不起Mac语法)
邻近UUID:NSMakeRange(4, 16)
专业:NSMakeRange(20,2)
轻微:NSMakeRange(22,2)

为确保您正确执行此操作,您可以将值记录为十六进制(使用格式字符串%x),并确保它们与description匹配NSData他们来自哪里。

答案 2 :(得分:0)

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