2014-01-16 7 views
8

Ich möchte die ganze Nähe UUID von Werbe-Paketen programmgesteuert sehen. Einige Artikel sagen, dass es auf iOS unmöglich ist, aber Android ist möglich. Aber ich kann es nicht glauben, weil ich die fantastische App "BLExplr" gefunden habe. Ich muss die Funktion in meine App implementieren. Weiß jemand wie man es macht oder gute Beispiele? Jede Hilfe wird geschätzt.iOS-iBeacon: Wie programmgesteuert alle N?

(UPDATE 2014/1/17)

Ich glaube @davidgyoung Antwort richtig ist. Estimote beacons nowernameUUID ist "B9407F30-F5F8-466E-AFF9-25556B57FE6D", aber die UUID meines Estimote-Beacons in der BLExplr-App ist eine andere ID.

enter image description here enter image description here

+0

ich eine andere App "Light Blue" gefunden. Diese App hat die gleichen Funktionen. Aber ich kann immer noch keine mögliche Lösung finden. Muss ich BLE-Rohdaten mithilfe des Bluetooth-Frameworks lesen? (Ich bin mir nicht sicher, ob es möglich ist oder nicht) – zono

Antwort

23

Leider können Sie nicht auf diese auf iOS. Wenn Sie sagen, dass BLExplr und LightBlue das können, verwirren Sie die Bluetooth-Dienst-UUID mit der iBeacon Proximity-UUID. Dies sind zwei sehr unterschiedliche Dinge.

Die Bluetooth-Dienst-UUID ist für iOS sichtbar, hat aber nichts mit einem iBeacon-Identifikator zu tun und ist für die Arbeit mit iBeacons nutzlos. Die Service-UUID wird jedes Mal von iOS generiert, wenn ein Bluetooth-Gerät erkannt wird, und bleibt nur für die Dauer der Zeit, während der sich das Bluetooth-Gerät in Reichweite befindet. Wenn Sie ein Bluetooth-Gerät wegnehmen und es später wieder zurückbringen, wird es eine andere Dienst-UUID haben.

Die IDs eines iBeacons (ProximityUUID, Major, Minor) sind in den Bluetooth-Werbespot eingebettet. Das Problem auf iOS-Geräten ist, dass die Apple CoreBluetooth-APIs den Zugriff auf den rohen Werbeblock nicht zulassen. Daher kann keine App von Drittanbietern diese IDs lesen. Apple gestattet den Zugriff auf diese Kennungen nur mit den speziellen iBeacon CoreLocation-APIs. Diese APIs erfordern jedoch, dass Sie die Proximity-UUID im Voraus kennen.

Sorry, ich weiß, das ist nicht die Antwort, die Sie hören möchten! (Es tut mir auch leid!) Für was es sich lohnt, können Sie dies unter Android, OSX Mavericks und Linux tun.

Siehe Details here.

+1

Vielen Dank! Sie haben Recht! Ich habe BLExplrs Screenshot angehängt. Die Service-UUID unterscheidet sich von der Proximity-UUID der Estimote Beacons. – zono

+1

@davidgyoung Können Sie sagen, wie die Radius Networks App "Locate" im AppStore meine UUID und Minor und Major Werte lesen kann, ohne dass ich sie eingib? Ich entwickle eine App, die unbekannte UUID holen muss, um sie mit dem zu vergleichen, was ich in einer Datenbank habe. Prost – Estevex

+0

Es kann nicht. Die App ist mit einem Dutzend beliebter UUIDs vorkonfiguriert. Sie müssen eine beliebte auf Ihrem Beacon haben. – davidgyoung

8

davidgyoung ist teilweise falsch über nicht in der Lage, iBeacon info zu bekommen. Sie tatsächlich kann die Nähe UUID auf OS X erhalten, aber nicht iOS.

In einem CBPeripheraladvertisingData, sollte es einen Schlüssel namens kCBAdvDataManufacturerData; Es ist eine NSData, die die iBeacon Werbeinformation darstellt. Dieser Schlüssel ist nur unter OS X verfügbar.

Überprüfen Sie, ob das zweite Byte zu 0x02 gleich ist, sind die ersten beiden Bytes gleich 0x004c (76 in dezimal) und das vierte Byte (dezimal) + 4 ist gleich der Länge der Daten (sollte 25 sein).

NSRanges (sorry für Mac-Syntax)
Nähe UUID: NSMakeRange(4, 16)
Bürgermeister: NSMakeRange(20,2)
Minor: NSMakeRange(22,2)

Um sicherzustellen, dass Sie es richtig machen, können Sie die Werte als Hex-lügen (Verwendung die Formatzeichenfolge %x) und stellen Sie sicher, dass sie die description der NSData von woher sie kamen.

+1

was ibeacon hast du dafür benutzt? Es scheint nicht für Beacons zu funktionieren. 'advertisementData = {kCBAdvDataIsConnectable = 1; kCBAdvDataLocalName = Schätzung; kCBAdvDataServiceData = {"Geräteinformation" = <0ec9686a 05d8b60e c9686a>; }; } ' – YarGnawh

+0

YarGnawh, ich befolge das Profil des iBeacon-Profils von Werbedaten. So wirbt der Peripherie-Manager von CoreBluetooth. Es kann andere Wege geben, mit Beacons zu werben. Estimote kann nach kCBAdvDataServiceData suchen und sich mit dem Beacon verbinden und dann ein Merkmal lesen, um das Major und Minor zu erhalten. –

+1

Darüber hinaus ist das Abstimmen einer Antwort, die korrekte Information liefert, die die Frage beantwortet (besonders wenn andere die Frage gerade ablehnen), 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) 
      }; 

aber die UUID ist die DeviceUUID, nicht die ProximityUUID

+0

Was ist der Datentyp dieser 'Data'-Variable können wir' kCBAdvDataServiceData' verwenden Array direkt hier drin? –

+0

ja, Daten sind [advertisingData objectForKey: kCBAdvDataServiceData] –

Verwandte Themen