我希望以编程方式查看广告包的所有proximityUUID。有些文章说在iOS上是不可能的,但Android是可能的。但我无法相信它,因为我发现梦幻般的应用程序“BLExplr”具有该功能。我需要在我的应用程序中实现该功能。有谁知道怎么做或好例子?任何帮助将不胜感激。
(更新2014/1/17)
我相信@davidgyoung回答是对的。 Estimote beacon的proximityUUID是“B9407F30-F5F8-466E-AFF9-25556B57FE6D”,但在BLExplr app上显示我的Estimote beacon的UUID是另一个ID。
答案 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