(更新于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的标识符无关,对于处理iBeacon毫无用处。服务UUID由iOS每次看到蓝牙设备时生成,并且仅在蓝牙设备在范围内的时间内保持不变。如果你把蓝牙设备拿走并稍后再带回来,它将有一个不同的服务UUID。
iBeacon的标识符(ProximityUUID、Major、Minor)嵌入在蓝牙广告的主体中。在iOS设备上的问题是,苹果的CoreBluetooth API不允许访问原始广告主体,因此没有第三方应用程序能够读取这些标识符。苹果只允许使用特殊的iBeacon CoreLocation API访问这些标识符,但这些API要求你事先知道Proximity UUID。
很抱歉,我知道这不是你想听到的答案!(我也很抱歉!)值得一提的是,你可以在Android、MacOS、Linux和Windows上实现这一点。
请查看此处的详细信息。
davidgyoung 部分错误,不能获取iBeacon信息。实际上,在OS X上你可以获得接近UUID,但是在iOS上不行。
在CBPeripheral
的advertisingData
中,应该有一个名为kCBAdvDataManufacturerData
的键;它是代表iBeacon广告信息的NSData
。 这个键只在OS X上可用。
检查第二个字节是否等于0x02
,前两个字节是否等于0x004c
(十进制下为76),第四个字节(十进制下)+ 4等于数据长度(应该为25)。
NSRanges(抱歉,这里使用了Mac语法)
接近UUID:NSMakeRange(4, 16)
Major:NSMakeRange(20,2)
Minor:NSMakeRange(22,2)
为确保正确,您可以将值记录为十六进制(使用格式字符串%x
),并确保它们与NSData
的description
匹配。
advertisementData = { kCBAdvDataIsConnectable = 1; kCBAdvDataLocalName = estimote; kCBAdvDataServiceData = { "Device Information" = <0ec9686a 05d8b60e c9686a>; }; }
- YarGnawhadvertisementData
中使用 kCBAdvDataManufacturerData
键”,并且您应该删除“davidyoung 完全错误...”因为他不是,他只是部分正确和部分错误。 - MysteltainnNSRange 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是设备UUID,而不是接近度UUID。
data
变量的数据类型是什么?我们能否直接在这里使用 kCBAdvDataServiceData
数组? - Kamal Upasena