2014-01-16 85 views
8

我想以編程方式查看廣告數據包的所有proximityUUID。一些文章說,在iOS上不可能,但Android是可能的。但我不能相信它,因爲我發現了這個夢幻般的應用程序「BLExplr」具有該功能。我需要在我的應用程序中實現該功能。有誰知道如何做到這一點或很好的例子?任何幫助將不勝感激。iOS iBeacon:如何以編程方式獲取所有proximityUUID?

(UPDATE 2014年1月17日)

我相信@davidgyoung的答案是正確的。 Estimote beacon的proximityUUID是「B9407F30-F5F8-466E-AFF9-25556B57FE6D」,但在BLExplr應用程序上顯示了我的Estimote信標的UUID是另一個ID。

enter image description here enter image description here

+0

我發現了另一個應用程序 「淡藍色」。這個應用程序具有相同的功能。但我仍然無法找到一個可能的解決方案。我是否需要使用藍牙框架讀取BLE原始數據..? (我不確定是否有可能) – zono

回答

23

不幸的是,你不能這個iOS上。當您說BLExplr和LightBlue可以做到這一點時,您將藍牙服務UUID與iBeacon Proximity UUID混淆。這是兩個完全不同的東西。

藍牙服務UUID對iOS可見,但與iBeacon的標識符無關,對於使用iBeacons無用。服務UUID由iOS在每次看到藍牙設備時生成,並且僅在藍牙設備處於範圍內的持續時間內保持不變。如果您將藍牙設備拿走並稍後重新使用,它將具有不同的服務UUID。

iBeacon的標識符(ProximityUUID,Major,Minor)嵌入在藍牙廣告的主體中。 iOS設備上的問題是Apple的CoreBluetooth API禁止訪問原始廣告主體,因此沒有第三方應用能夠讀取這些標識符。 Apple只允許使用特殊的iBeacon CoreLocation API訪問這些標識符,但這些API要求您事先了解Proximity UUID。

對不起,我知道這不是你想聽到的答案! (我也對此感到抱歉!)對於它的價值,您可以在Android,OSX Mavericks和Linux上進行此操作。

查看詳情here

+1

非常感謝!你是對的!我附上了BLExplr的屏幕截圖。服務UUID與Estimote信標的Proximity UUID不同。 – zono

+1

@davidgyoung您能否告訴我們AppStore中的Radius Networks應用程序「定位」如何在不輸入它們的情況下讀取我的UUID和次要和主要值?我正在開發一個需要獲取未知UUID的應用程序,以將它們與我在數據庫中的內容進行比較。乾杯 – Estevex

+0

它不能。該應用程序預先配置了十幾種流行的UUID。你的燈塔上必須有一個受歡迎的燈。 – davidgyoung

8

davidgyoung對於無法獲取iBeacon信息部分錯誤。你實際上是可以得到OS X上的接近UUID,但不是iOS

CBPeripheraladvertisingData中,應該有一個叫做kCBAdvDataManufacturerData的鍵;代表iBeacon廣告信息的是NSData此項僅適用於OS X

檢查第二字節等於0x02,所述第一兩個字節是等於0x004c76十進制),和第四字節(十進制)+ 4等於數據的長度(應爲25)。

NSRanges(對不起,Mac的語法)
接近UUID:NSMakeRange(4, 16)
專業:NSMakeRange(20,2)
輔修:NSMakeRange(22,2)

要確保你正在做的是正確的,你可以登錄值十六進制(使用格式字符串%x),並確保它們與NSDatadescription匹配。

+1

ibeacon的用途是什麼?它似乎不適用於估計信標。 'advertisementData = {kCBAdvDataIsConnectable = 1; kCBAdvDataLocalName = estimote; kCBAdvDataServiceData = {「Device Information」= <0ec9686a 05d8b60e c9686a>; }; }' – YarGnawh

+0

YarGnawh,我遵循iBeacon簡介的廣告數據概要。這就是CoreBluetooth的外設經理做廣告的方式。可能有其他的方式與信標廣告。 Estimote可能會查找kCBAdvDataServiceData並連接到信標,然後讀取特徵以獲取主要和次要信息。 –

+1

此外,向下投票的答案提供了回答問題的正確信息(特別是當其他人僅僅解答問題時)就是asinine。 –

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

+0

什麼是這個'數據'變量的數據類型,我們可以使用'kCBAdvDataServiceData'數組直接在這裏? –

+0

是的,數據是[advertisingData objectForKey:kCBAdvDataServiceData] –

相關問題