web-dev-qa-db-ja.com

BLEドングルを搭載したRaspberry PiはiBeaconsを検出できますか?

Radius NetworksioGear GBU521 BLE 4.0 dongleを含むRaspberry Piから開発者キットを購入しました。 RadBeacon iBeaconsの1つも購入しました。両方とも宣伝どおりに機能しますが、私が得たものにちょっと驚きました。

私はRaspPiiBeaconsを検出できると想定していました。代わりに、キットはcreate an iBeaconにセットアップされます。私のユースケースは、forkliftが特定の部屋に入ったときを検出して、仕事を送れるようにすることです。私の考えは、フォークリフトにiBeaconを置き、次にiBeaconsを検索するRaspPiを置くことでした。また、iBeacon(フォークリフト)が検出された場合、近くにあると結論付けることができます。 RaspPiをLANに配線し、REST or similarを介して情報を伝達します。適切なAndroid or Apple deviceを配置してそれを達成できることは知っていますが、このドングルがこれらのiBeaconsを検出できず、そのUUID'sが何であるかを教えてくれません。私は何が欠けていますか?

38
user1153660

はい! Raspberry Piを使用して、iBeaconsをスキャンできます。これを行うスクリプトを以下にまとめましたが、次の手順で自分で行うこともできます。

  1. Bluetooth LEスキャンを実行するバックグラウンドプロセスを開始します。

    Sudo hcitool lescan --duplicates &
    

    --duplicates設定を使用すると、スキャンは同じiBeaconからの複数のパケットを無視しません。

  2. hcidumpを開始し、iBeaconパケットをフィルタリングするスクリプトに生の出力をパイプします。

    Sudo hcidump --raw 
    

フィルタリングは注意が必要な部分です。hcidumpからの生の出力は適切にフォーマットされておらず、iBeacon送信ではないパケットも表示されます。これを解決するために、出力を1行ずつ読み込み、他の出力(MACアドレスなど)から生のパケットを分離するフィルタースクリプトを作成しました。 Radius Networksでは、 iBeacon bluetooth profile について多くの研究を行ってきました。これを使用して、iBeaconパケットを識別し、他のデバイスからのパケットから除外しました。

これをすべて、生の識別子を人間が読める形式に変換するなど、すべてを実行するibeacon_scanスクリプトにまとめました。ダウンロードできます こちら 。まもなく、これを iBeacon Development Kit に含めて、スキャン機能を追加します。

スクリプトからの出力の例を次に示します。

$ ./ibeacon_scan
UUID: 74278BDA-B644-4520-8F0C-720EAF059935 MAJOR: 0 MINOR: 73 POWER: -50
UUID: 2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 MAJOR: 1 MINOR: 6 POWER: -59
UUID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 MAJOR: 6 MINOR: 9 POWER: -55

他のスクリプトに簡単に解析できるベア出力用の-bオプションも含まれています。以下に例を示します。

$ ./ibeacon_scan -b
2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 6 -59
E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 6 9 -55
74278BDA-B644-4520-8F0C-720EAF059935 0 73 -50

このオプションを使用し、スクリプトの出力をスクリプトにパイプして、特定の識別子を持つiBeaconsが検出されたときにアクションをトリガーできます。

EDIT:このスクリプトを書き直して、応答性と堅牢性を高め、 開発キット の最新バージョンに組み込みました=。更新プログラムは、 こちら からダウンロードできます。

EDIT2:@ sai-ramachandran で指摘されているように、このスクリプトを拡張して各iBeaconパケットのRSSIをキャプチャできます。 POWERに加えて。これを行うには、スクリプトに次の行を追加します。

 RSSI=`echo $packet | sed 's/^.\{132\}\(.\{2\}\).*$/\1/'`
 RSSI=`echo "ibase=16; $RSSI" | bc`
 RSSI=$[RSSI - 256]

そして、出力にRSSIを追加してください:

 echo "UUID: $UUID MAJOR: $MAJOR MINOR: $MINOR POWER: $POWER RSSI: $RSSI"
71
jjnebeker

iBeacon Development Kit はiBeaconsを検出するように設計されておらず、iBeaconとして送信するように設計されていることは正しいです。

とはいえ、コメントで @ ChrisStratton が示唆するもののバリエーションを使用して、Raspberry PiでiBeaconsを検出することが可能です。私の同僚 @ jjnebeker からの回答をご覧ください。

2
davidgyoung