05.BLEデバイスからの値の変更の通知を受け取る処理を作る05.BLEデバイスから値の変更の通知を受け取る処理を作るBLEデバイスから値の変更の通知を受け取る処理を作成します。Energyには、キャラクタリスティックが書き換えられて,値が変更された時にその通知を受け取れる仕組みがあります。この仕組みをノーティファイ(Notify)と呼びます。ノーティファイを用いると値が自動更新されます。BLEデバイスから、値の変更の通知を受け取るためにすべきことは、以下です。BluetoothGattオブジェクトを用いて、サービスUUIDを指定してサービスオブジェクトを取得します。);取得したサービスオブジェクトを用いて、キャラクタリスティックUUIDを指定してキャラクタリスティックオブジェクトを取得します。);BluetoothGattオブジェクトを用いて、取得したキャラクタリスティックオブジェクトを指定して、キャラクタリスティック通知関数を呼び出します。);取得したキャラクタリスティックオブジェクトを用いて、デスクリプターを取得します。);取得したデスクリプターに、ノーティフィケーションを有効にする値をセットします。);BluetoothGattオブジェクトを用いて、デスクリプターを書き込みます。);BluetoothGattコールバックオブジェクトの定義にて、キャラクタリスティック変更が通知されたときの処理であるonCharacteristicChanged関数を定義し、ソフトウェア固有の処理(値の表示等)を行います。上記以外に、今回やっていることは、以下です。「Chara1(Notify)」チェックボックスをチェックすると、キャラクタリスティック1の変更通知機能が有効になります。チェックを外すと、キャラクタリスティック1の変更通知機能が無効になります。(onClick関数において、「Char1(Notify)」チェックボックスの場合は、setCharacteristicNotification関数を呼び出します。)実装プロジェクトを開く04.で作成したプロジェクトを開きます。必要な文字列定義を追加します。strings.xml」を開きます。「キャラクタリスティック1変更通知ON/OFF」チェックボックス用の文字列の定義を追加します。</string>「strings.xml」全体としては、以下のようにします。</resources>ファイルを上書き保存します。レイアウトの編集メインアクティビティのレイアウトを編集します。activity_main.xml」を開きます。「キャラクタリスティック1変更通知ON/OFF」チェックボックスと値を表示するためのTextViewを設置します。</LinearLayout>activity_main.xmlの内容を以下のようにします。</LinearLayout>メインアクティビティクラスのメンバー変数の追加メインアクティビティに、必要な定数宣言とメンバー変数宣言を追加します。UUID」定数の宣言、「キャラクタリスティック1変更通知ON/OFF」チェックボックスオブジェクトの変数宣言を追加します。「MainActivity」クラスの定数、変数の宣言を以下のようにします。Enter」で、必要なクラスをimportします。リビルドし、エラー、警告がないことを確認します。メインアクティビティクラスのonCreate関数の編集メインアクティビティのonCreate関数に、必要な処理を追加します。「キャラクタリスティック1変更通知ON/OFF」チェックボックスの取得とクリックリスナーの設定の処理を追加します。onCreate関数を、以下のようにします。(・・・省略・・・)メインアクティビティクラスのクリックリスナーの編集メインアクティビティのクリックリスナーに、必要な処理を追加します。「キャラクタリスティック1変更通知ON/OFF」チェックボックスクリック時の処理を追加します。onClick関数を、以下のようにします。}キャラクタリスティック通知の設定の関数の追加キャラクタリスティック通知の設定の関数を追加します。「MainActivity」クラスの末尾に、以下を追加します。}BluetoothGattコールバッククラスのオブジェクトの定義の編集BluetoothGattコールバッククラスのオブジェクトの定義を編集します。接続可能範囲から外れて切断されたとき処理に、「キャラクタリスティック1変更通知ON/OFF」チェックボックスを無効にする処理を追加します。サービス検索が完了したときの処理に、「キャラクタリスティック1変更通知ON/OFF」チェックボックスを有効にする処理を追加します。キャラクタリスティック変更が通知されたときの処理を追加します。BluetoothGattコールバッククラスのオブジェクトの定義を以下のようにします。接続状態変更(connectGatt()の結果として呼ばれる。接続可能範囲に入ったら自動接続するために、mBluetoothGatt.connect()を呼び出す。読み込みボタンを無効にする(通知チェックボックスはチェック状態を維持。サービス検索が完了したときの処理(mBluetoothGatt.discoverServices()の結果として呼ばれる。キャラクタリスティック1:データサイズは、2バイト(数値を想定。キャラクタリスティック2:データサイズは、8バイト(文字列を想定。キャラクタリスティック1:データサイズは、2バイト(数値を想定。Enter」で、必要なクラスをimportします。リビルドし、エラー、警告がないことを確認します。メインアクティビティクラスのonResume関数の編集onResume関数を編集します。初回表示時および復帰時には、「キャラクタリスティック1変更通知ON/OFF」チェックボックスのチェックを外し、無効となるように処理を追加します。デバイスアドレスが空でなければ、接続ボタンを有効にする。}メインアクティビティクラスの、disconnect関数の編集disconnect関数を編集します。接続を切断したときには、「キャラクタリスティック1変更通知ON/OFF」チェックボックスのチェックを外し、無効となるように処理を追加します。mBluetoothGatt.disconnect()ではなく、mBluetoothGatt.close()しオブジェクトを解放する。理由:「ユーザーの意思による切断」と「接続範囲から外れた切断」を区別するため。1「ユーザーの意思による切断」は、mBluetoothGattオブジェクトを解放する。再接続は、オブジェクト構築から。2「接続可能範囲から外れた切断」は、内部処理でmBluetoothGatt.disconnect()処理が実施される。切断時のコールバックでmBluetoothGatt.connect()を呼んでおくと、接続可能範囲に入ったら自動接続する。}メインアクティビティクラスのonActivityResult関数の編集メインアクティビティクラスのonActivityResult関数を編集します。デバイスリストアクティビティから復帰したときの処理に、TextViewの値を初期化する処理を追加します。onActivityResult関数を、以下のようにします。Enter」で、必要なクラスをimportします。リビルドし、エラー、警告がないことを確認します。実行BLEモジュールの準備。Arduinoからのキャラクタリスティックの値の書き込み」に従い、BLEモジュールを準備しておきます。作成したプライベートサービスの仕様としては、以下です。キャラクタリスティックは2つ。ノーティファイが可能。データサイズは、2バイト(数値を想定。書き込みと読み出しができる。ノーティファイはなし。データサイズは、8バイト(文字列を想定。半角文字8文字)Arduinoからのキャラクタリスティックの値の書き込みのプログラムの内容としては、以下です。1秒ごとに、カウンターをカウントアップする。1秒ごとに、カウンターの値を、1つ目のキャラクタリスティックに書き込む。60)から経過分数を算出し、文字列「(経過分数)[min]」を、2つ目のキャラクタリスティックにを書き込む。Android端末にて、動作確認。BLEデバイスと接続直後の画面。「Chara1(Notify)」チェックボックスがあります。「Chara1(Notify)」チェックボックスをチェックすると、キャラクタリスティック1の値が読み込まれ、表示されます。コンタクト」よりお願いいたします。コンタクト」より連絡していただけると幸いです。