RaspberryPiにてBLE(Bluetooth Low Energy)接続のセンサーを試す

こんにちは、mi2yo4です。

いよいよ4月になりますね。

心も新たにスタートを切る人もいるかと思いますが…当方は通常営業です^^)

今日は以前からやっておかなきゃなぁ、と心の片隅に留め置いていたことを実行に移してみましたよ。

IMG_0293


そう言えばBluetoothアダプタがありました

弊社には、技術調査などという名目で様々なガジェット(おもちゃとも言う)が積まれています。

その中にはbluetooth4.0アダプタが…

そう言えば大分前に、会社で研究のため、と称して購入してもらった事を思い出しました。

購入しただけで何かを成し遂げた気分になってそのままお蔵入りしていましたが…orz

今回はこれを使って、BLE(Bluetooh Low Energy)接続のセンサーを繋げて遊んで技術調査してみます。

BLE(Bluetooth Low Energy)とは

と、ここでBLEとは何ぞや?という話があるのかもしれないので、用語解説。

BLEとは、近距離無線通信技術Bluetoothの拡張仕様の一つで、極低電力で通信が可能なもの。 2010年7月に発表されたBluetooth 4.0規格の一部として策定された。 免許なく使える2.4GHz帯(ISMバンド)の電波を用い、最大1Mbpsの通信が可能。

(IT用語辞典より引用)

ヘッドホンやキーボード、マウスなどの無線通信で使われている事の多いBluetoothですが、4.0になると上記のような拡張仕様が策定されました。

iOS上でiBeaconというものが世に出てメジャーになりましたが、技術上はBluetooth4.0のBLEが使われているそうです。

今回はそのBLEをRaspberryPiで使ってみよう!と思い立ちました。

上の写真の青い物体、これ実はBLE接続の照度センサです。

コイン電池で動いて、省電力。使ってみたくなりますよね?

こんなセンサーです。型番はBLECAST_BLです。

では早速動かしてみましょう。


Bluetoothライブラリのコンパイル、インストール

BLEが世に出たのは2010年で、それから時間も経っています。ネット上に何か情報は無いかな?と検索したところ…ありましたよ!

今回はここの情報を参考にさせて頂きました。

RaspberryPi に BlueZ をインストールして BLE を検知してみた

基本的には上記のままで動かします。(完)

…という訳にもいかないので、補足しつつ進めていきましょう!


bluezのコンパイル・インストール

linuxでのBluetoothライブラリはBlueZというのが定番のようです。

私は現時点で最新の5.38をダウンロードしてコンパイル・インストールしています。

そのままではBLEに対応していない、との記述もあったことからソースからコンパイルする事にしました。

(最新のバージョン=Jessieでは対応しているのかもしれません)

$ ./configure --disable-systemd --enable-library
$ make
$ sudo make install

Bluetoothアダプタを繋げて下記のコマンドを入力すれば、早速BLEセンサーを拾い出してくれると思います。

$ sudo hciconfig hci0 up
$ hciconfing lescan

pybluezインストール

このままだと使いづらいので、スクリプトから使えるようにしましょう。

どうしてもPythonで動かしたいので(Python大好き)、PythonのBluetoothライブラリpybluezをインストールします。

$ pip install pybluez

iBeacon-scannerダウンロード

今回のセンサーはアドバタイズモードで動作するそうです。

色々とライブラリを探してみたのですが、アドバタイズモードだけであれば大層なライブラリを使わずとも問題なさそうでしたので、iBeacon-scannerスクリプトを改造してみるのが一番楽そうだ、という結論になりました。

iBeacon-scannerダウンロード

$ python testblescan.py

スクリプトを適当なフォルダに展開してその中に移動、上記のコマンドを入力すればスキャンを開始します。


blescan.pyの修正

上記のtestblescan.pyは同じディレクトリのblescan.pyを呼び出しています。

何かしら情報を表示してくれますが、今回のセンサーの出力レイアウトと一致していないので、MACアドレス以外は使い物になりません。

そこでblescan.pyを修正してみました。

まずはDEBUGモードをONにします。

DEBUG=True

次に、156行目近辺の「if (DEBUG is True):」の中のprint文に以下を追加します。

# BLECAST_BL
print "\tNAME: ", pkt[report_pkt_offset - 12: report_pkt_offset - 2]
print "\tCOUNTER: ", struct.unpack('<H', pkt[report_pkt_offset - 18: report_pkt_offset - 16])[0]
print "\tBRIGHT: ", struct.unpack('<H', pkt[report_pkt_offset - 16: report_pkt_offset - 14])[0]

unpackを使えば簡単にバイナリ化されているデータを取り出せますね!


まとめ

いかがだったでしょうか?

ちょっと駆け足気味で書いてしまいましたが、これだけでBLE接続のセンサー値を読み取れてしまいます。

調べて理解するのに時間がかかりましたが、実作業の時間は少なかったです。

無線接続のセンサですと、設置の自由度が上がる、技術的には沢山のセンサを繋げられる、などのメリットがあります。

またデメリットとしては、有線接続のセンサと比較すると信頼度が低い(場合によっては繋がらない時もある)、(今回のセンサだと)電池交換が面倒などが挙げられますね。

信頼度が低いため、解析の元データとして使うには心許ないかもしれませんが、値だけ確認したいというニーズにはぴったりとマッチしそうです。

あぐりログの正式な対応センサーとしても魅力的な選択肢になるのではないかな?と思った所で今回の調査はおしまい。

ではまた!