広告パケットのproximityUUIDをすべてプログラムで確認したい。 iOSでは不可能との記事もありますが、Androidは可能です。でも、素晴らしいアプリ「BLExplr」に機能があるので信じられません。アプリに機能を実装する必要があります。 。誰かがそれを行う方法や良い例を知っていますか?どんな助けもいただければ幸いです。
(更新2014/1/17)
@davidgyoungの答えは正しいと思います。 EstimoteビーコンのproximityUUIDは「B9407F30-F5F8-466E-AFF9-25556B57FE6D」ですが、BLExplrアプリに表示されたEstimoteビーコンのUUIDは別のIDです。
残念ながら、iOSではこれを行うことはできません。 BLExplrとLightBlueがこれを実行できると言うとき、BluetoothサービスUUIDとiBeaconプロキシミティUUIDを混同しています。これらは2つの非常に異なるものです。
BluetoothサービスのUUIDはiOSに表示されますが、iBeaconの識別子とは関係がなく、iBeaconsの操作には役立ちません。サービスUUIDは、Bluetoothデバイスが表示されるたびにiOSによって生成され、Bluetoothデバイスが範囲内にある間だけ同じままです。 Bluetoothデバイスを取り出して後で戻すと、別のサービスUUIDが使用されます。
IBeaconの識別子(ProximityUUID、Major、Minor)は、Bluetoothアドバタイズメントの本文に埋め込まれています。 iOSデバイスの問題は、AppleのCoreBluetooth APIが生の広告本文へのアクセスを許可しないため、サードパーティのアプリがこれらの識別子を読み取ることができないことです。 Appleは、特別なiBeacon CoreLocation APIを使用してこれらの識別子へのアクセスのみを許可しますが、これらのAPIでは、事前にプロキシミティUUIDを知っている必要があります。
申し訳ありませんが、これはあなたが聞きたい答えではないことを私は知っています! (それについても申し訳ありません!)その価値については、Android、OSX Mavericks、およびLinuxでこれを行うことができます。
詳細を見る ここ 。
davidgyoungは、iBeacon情報を取得できないことについて部分的に間違っています。実際にはcan OS Xで近接UUIDを取得しますiOSではありません。
CBPeripheral
のadvertisingData
には、kCBAdvDataManufacturerData
というキーが必要です。これは、iBeaconの広告情報を表すNSData
です。 このキーはOS Xでのみ使用可能です。
2番目のバイトが_0x02
_に等しく、最初の2バイトが_0x004c
_(10進数で_76
_)に等しく、4番目のバイト(10進数)+4がデータの長さに等しいことを確認します(25である必要があります)。
NSRanges(Mac構文では申し訳ありません)
プロキシミティUUID:NSMakeRange(4, 16)
メジャー:NSMakeRange(20,2)
マイナー:NSMakeRange(22,2)
正しく実行していることを確認するために、値を16進数としてログに記録し(フォーマット文字列_%x
_を使用)、それらがwhereceからのdescription
のNSData
と一致することを確認できます。彼らが来ました。
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ではありません