web-dev-qa-db-ja.com

iOSでBLEの広告データを取得する

範囲内のすべてのBLEデバイスのUUIDを取得するアプリを作成しています。私はそれをAndroidでうまく機能させており、広告データをバイト配列として提供しています。今私はiOSで同じことをしようとしています。

私はスキャンを実行していて、デバイスを検出しています。コールバックには、advertisingDataというNSDictionaryがあります。ただし、その中の唯一の情報は次のとおりです。

kCBAdvDataChannel = 39;
kCBAdvDataIsConnectable = 1;
kCBAdvDataLocalName = jaalee;
kCBAdvDataTxPowerLevel = 0;

広告パケット全体を取得する必要があると思いますか?そうでない場合、どうすれば入手できますか?

16
user2564511

残念ながら、iOSでは生の広告データにアクセスできません。私は ブログ投稿 を書いて、これを実証しました。 投稿は具体的にはiBeaconsに関するものですが、それはすべてのBLE広告に適用されます。

EDIT:明確にするために、非iBeaconアドバタイズの製造元の生データバイトまたはサービスデータバイトを読み取ることができます。 CoreLocationによって製造元のデータバイトが隠されているのは、iBeacon広告のみです。こちらをご覧ください: iOSでBluetooth LEスキャン応答データを取得

同等のMacOS CoreLocationメソッドはこれを可能にするため、おそらくiOSでの意図的なセキュリティまたは省電力の制限です。

18
davidgyoung

Apple iOSからの公式ドキュメントと私の個人的な経験に基づく:

はい、iOSではRAW広告データにアクセスできません。

[〜#〜]しかし[〜#〜]

情報を広告パケットに入れて、周辺機器に接続せずにiOSアプリから読み取ることが目的である場合、これは可能です。以下にその方法を説明します。

1)周辺機器ファームウェアで、メーカー固有のデータを広告パケットに挿入する必要があります。データタイプはGAP_ADTYPE_MANUFACTURER_SPECIFIC0xFFメーカー固有のデータでは、最初の2オクテットに会社識別コードとそれに続く追加のメーカー固有のデータ

2)iOSの場合

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

次のキーを使用して、advertisingDataディクショナリでメーカー固有のデータを確認できます。

CBAdvertisementDataManufacturerDataKey

3)アプリでペリフェラルからiOSに送信されるすべての広告パケットがコールバック通知を受信するようにしたい場合は、スキャンオプションを必ずYESに変更してください。それについてこの投稿を見てください: コアBluetooth-範囲内のデバイスのRSSIの更新が一定

私のブログ投稿ではすぐにチュートリアルになります: http://www.megabri.com/

16
megabri