05.BLEデバイスから値の変更の通知を受け取る処理を作る
BLEデバイスから値の変更の通知を受け取る処理を作成します。
解説
Bluetooth Low Energyには、キャラクタリスティックが書き換えられて,値が変更された時にその通知を受け取れる仕組みがあります。この仕組みをノーティファイ(Notify)と呼びます。ノーティファイを用いると値が自動更新されます。
BLEデバイスから、値の変更の通知を受け取るためにすべきことは、以下です。
- BluetoothGattオブジェクトを用いて、サービスUUIDを指定してサービスオブジェクトを取得します。
mBluetoothGatt.getService( uuid_service ); - 取得したサービスオブジェクトを用いて、キャラクタリスティックUUIDを指定してキャラクタリスティックオブジェクトを取得します。
blechar = mBluetoothGatt.getService( uuid_service ).getCharacteristic( uuid_characteristic ); - BluetoothGattオブジェクトを用いて、取得したキャラクタリスティックオブジェクトを指定して、キャラクタリスティック通知関数を呼び出します。
mBluetoothGatt.setCharacteristicNotification( blechar, enable ); - 取得したキャラクタリスティックオブジェクトを用いて、デスクリプターを取得します。
descriptor = blechar.getDescriptor( UUID_NOTIFY ); - 取得したデスクリプターに、ノーティフィケーションを有効にする値をセットします。
descriptor.setValue( BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE ); - BluetoothGattオブジェクトを用いて、デスクリプターを書き込みます。
mBluetoothGatt.writeDescriptor( descriptor ); - BluetoothGattコールバックオブジェクトの定義にて、キャラクタリスティック変更が通知されたときの処理であるonCharacteristicChanged関数を定義し、ソフトウェア固有の処理(値の表示等)を行います。
上記以外に、今回やっていることは、以下です。
- 「Chara1(Notify)」チェックボックスをチェックすると、キャラクタリスティック1の変更通知機能が有効になります。チェックを外すと、キャラクタリスティック1の変更通知機能が無効になります。
(onClick関数において、「Char1(Notify)」チェックボックスの場合は、setCharacteristicNotification関数を呼び出します。)
実装
プロジェクトを開く
04.で作成したプロジェクトを開きます。
文字列リソースの追加
必要な文字列定義を追加します。
「Project」ペインの「app > res > values > strings.xml」を開きます。
「キャラクタリスティック1変更通知ON/OFF」チェックボックス用の文字列の定義を追加します。
「strings.xml」全体としては、以下のようにします。
ファイルを上書き保存します。
レイアウトの編集
メインアクティビティのレイアウトを編集します。
「Project」ペインの「app > res > layout > activity_main.xml」を開きます。
2つの「キャラクタリスティック読み込み」ボタンと値を表示するためのTextViewの下に、 「キャラクタリスティック1変更通知ON/OFF」チェックボックスと値を表示するためのTextViewを設置します。
activity_main.xmlの内容を以下のようにします。
メインアクティビティクラスのメンバー変数の追加
メインアクティビティに、必要な定数宣言とメンバー変数宣言を追加します。
ノーティフィケーション用の「Bluetooth LE Gatt UUID」定数の宣言、「キャラクタリスティック1変更通知ON/OFF」チェックボックスオブジェクトの変数宣言を追加します。
「MainActivity」クラスの定数、変数の宣言を以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのonCreate関数の編集
メインアクティビティのonCreate関数に、必要な処理を追加します。
「キャラクタリスティック1変更通知ON/OFF」チェックボックスの取得とクリックリスナーの設定の処理を追加します。
onCreate関数を、以下のようにします。
メインアクティビティクラスのクリックリスナーの編集
メインアクティビティのクリックリスナーに、必要な処理を追加します。
「キャラクタリスティック1変更通知ON/OFF」チェックボックスクリック時の処理を追加します。
onClick関数を、以下のようにします。
キャラクタリスティック通知の設定の関数の追加
キャラクタリスティック通知の設定の関数を追加します。
「MainActivity」クラスの末尾に、以下を追加します。
BluetoothGattコールバッククラスのオブジェクトの定義の編集
BluetoothGattコールバッククラスのオブジェクトの定義を編集します。
接続可能範囲から外れて切断されたとき処理に、「キャラクタリスティック1変更通知ON/OFF」チェックボックスを無効にする処理を追加します。
サービス検索が完了したときの処理に、「キャラクタリスティック1変更通知ON/OFF」チェックボックスを有効にする処理を追加します。
キャラクタリスティック変更が通知されたときの処理を追加します。
BluetoothGattコールバッククラスのオブジェクトの定義を以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのonResume関数の編集
onResume関数を編集します。
初回表示時および復帰時には、「キャラクタリスティック1変更通知ON/OFF」チェックボックスのチェックを外し、無効となるように処理を追加します。
メインアクティビティクラスの、disconnect関数の編集
disconnect関数を編集します。
接続を切断したときには、「キャラクタリスティック1変更通知ON/OFF」チェックボックスのチェックを外し、無効となるように処理を追加します。
メインアクティビティクラスのonActivityResult関数の編集
メインアクティビティクラスのonActivityResult関数を編集します。
デバイスリストアクティビティから復帰したときの処理に、TextViewの値を初期化する処理を追加します。
onActivityResult関数を、以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
実行
BLEモジュールの準備。
「フィジカルコンピューティング > RN4020 > Arduinoからのキャラクタリスティックの値の書き込み」に従い、BLEモジュールを準備しておきます。
作成したプライベートサービスの仕様としては、以下です。
- キャラクタリスティックは2つ。
- 1つ目のキャラクタリスティックは、
- 読み出しができる。
- ノーティファイが可能。
- データサイズは、2バイト(数値を想定。0~65,535)。 - 2つ目のキャラクタリスティックは、
- 書き込みと読み出しができる。
- ノーティファイはなし。
- データサイズは、8バイト(文字列を想定。半角文字8文字)
Arduinoからのキャラクタリスティックの値の書き込みのプログラムの内容としては、以下です。
- 1秒ごとに、カウンターをカウントアップする。
- 1秒ごとに、カウンターの値を、1つ目のキャラクタリスティックに書き込む。
- 60秒ごとに、(カウンターの値 / 60)から経過分数を算出し、文字列「(経過分数)[min]」を、2つ目のキャラクタリスティックにを書き込む。
Android端末にて、動作確認。
BLEデバイスと接続直後の画面。
「Chara1(Notify)」チェックボックスがあります。
「Chara1(Notify)」チェックボックスをチェックすると、キャラクタリスティック1の値が読み込まれ、表示されます。
ノーティファイ機能により、キャラクタリスティック1の値は自動更新されます
ダウンロード
サンプルプロジェクト
(github.com上のダウンロードページ)
関連ページ
前項目:04.BLEデバイスから値を読み込む処理を作る
次項目:06.BLEデバイスへの値を書き込む処理を作る