屋内環境を手軽にモニタリングする～③TI SensorTag CC2650から温度/湿度/照度などをJavaで取得する(Bluetooth LE / bluez-dbus)～

## はじめに
前回の記事で、[テキサス・インスツルメンツ社のSensorTag CC2650](http://processors.wiki.ti.com/index.php/CC2650_SensorTag_User's_Guide)について、少し触れました。本記事では、[bluez-dbus](https://github.com/hypfvieh/bluez-dbus)を使用して、CC2650から各種センサーデータを取得するために作成したJavaライブラリ[cc2650-driver](https://github.com/s5uishida/cc2650-driver)の概要を紹介します。といっても、Githubの内容そのままです。実装の詳細や使い方のサンプルは、[Githubのコード](https://github.com/s5uishida/cc2650-driver/blob/master/src/io/github/s5uishida/iot/device/tisensortag/cc2650/driver/CC2650Driver.java)を参照して下さい。

## CC2650のセンサーデータ
CC2650は、ボタン電池のCR2032で駆動するBLEセンサーデバイスです。cc2650-driverでは、以下のデータを取得するように作成しました。

- システム情報
  - ファームウェアバージョン
  - バッテリーレベル
- センサーデータ
  - 物体温度 / 周囲温度
  - 湿度
  - 気圧
  - 照度
  - 運動(角速度 / 加速度 / 磁気)

ファームウェアバージョンを取得する理由は、バッテリーレベルが1.30以降でサポートされており、バッテリーレベルの取得の可否を判断するためです。このために、バッテリーレベルを取得する機能をbluez-dbusに[PR](https://github.com/hypfvieh/bluez-dbus/pull/23)して、マージしてもらいました。また、センサーデータの取得には、次の方式に対応しています。

- 直接読み出し
- 通知(Notification)

CC2650の場合、通知方式で指定できる最大の時間間隔は2550 msecとかなり短いです。これが使い物になるかどうかは、用途次第と思います。わたしは、これら環境情報をcrontabスタイルのスケジュールで、例えば1分間隔で取得することを考えているので、通知方式ではなく直接読み出し方式で使用しています。

更に、CC2650には通知方式の一機能として、Wake On Motionがあります。これは、揺れを検知すると、指定した通知の時間間隔で、運動のセンサーデータを10秒間、送信することができます。これを利用して、例えば動きを想定していない箇所にCC2650を貼り付けて、万一の動きを検知することができます。cc2650-driverは、Wake On Motionにも対応しています。

## CC2650で気付いたこと
CC2650はボタン電池駆動ですが、どれ位の期間、連続稼動できるかは良く分かりません。経験的には、バッテリーレベルが60位になると使用できなくなりました。なので、このバッテリーレベルという指標は、バッテリーの残量、というよりも、電圧に関連した何らかの指標なのではと推測しています。

## サンプルコード
**[cc2650-driver](https://github.com/s5uishida/cc2650-driver)**の処理の肝は、[bluetooth-scanner](https://github.com/s5uishida/bluetooth-scanner)と同様に、[dbus-java](https://github.com/hypfvieh/dbus-java)が提供する`AbstractPropertiesChangedHandler.java`を`extends`したクラスを用意して、`public void handle(PropertiesChanged properties)`を実装することです。詳細は、[Github](https://github.com/s5uishida/bluetooth-scanner)のコードを参照して下さい。[cc2650-driver](https://github.com/s5uishida/cc2650-driver)を使用した以下のサンプルコードを[クラスファイル](https://github.com/s5uishida/cc2650-driver/blob/master/src/io/github/s5uishida/iot/device/tisensortag/cc2650/driver/CC2650Driver.java)に含めておきました。

- CC2650Driver#testRead()
- CC2650Driver#testNotification()
- CC2650Driver#testWakeOnMotion()

## 一連の記事
このシリーズは、以下の記事から構成されます。
1. [動機とコンセプト](https://qiita.com/items/9c31e6fd9b6eb0fa9c96)
2. [Bluetooth LEアドバタイズ信号をJavaでキャッチする(Bluetooth LE / bluez-dbus)](https://qiita.com/items/a4543c9e7fb13b4c7c6e)
　関連するGithubは[こちら](https://github.com/s5uishida/bluetooth-scanner)。
3. **TI SensorTag CC2650から温度/湿度/照度などをJavaで取得する(Bluetooth LE / bluez-dbus)(今回)**
　関連するGithubは[こちら](https://github.com/s5uishida/cc2650-driver)。
4. [MH-Z19BからCO2濃度をJavaで取得する(シリアル通信 / jSerialComm)](https://qiita.com/items/1759498f8f706c4c3314)
　関連するGithubは[こちら](https://github.com/s5uishida/mh-z19b-driver)。
5. [PPD42NSからPM2.5濃度をJavaで取得する(GPIO / Pi4J)](https://qiita.com/items/4ae7784aeaf50df1e3d3)
　関連するGithubは[こちら](https://github.com/s5uishida/ppd42ns-driver)。
6. [産業オートメーション機器の稼動情報をJavaで取得する(OPC-UA / Eclipse Milo)](https://qiita.com/items/60954d356a3ea1048c61)
　関連するGithubは[こちら](https://github.com/s5uishida/rainy-opcua)。
7. [簡易ツールにまとめる](https://qiita.com/s5uishida/items/c56f1444c6856656b128)
　関連するGithubは[こちら](https://github.com/s5uishida/rainy)。
8. [後記](https://qiita.com/s5uishida/items/d2a888eb2d68e72f32ae)

## 追記
[2019.11.16]
簡易ツールの最新情報は、[こちら](https://github.com/s5uishida/rainy)をご参照下さい。