04.BLEデバイスから値を読み込む処理を作る
BLEデバイスから値を読み込む処理を作成します。
解説
BLEにおいては、値は、キャラクタリスティック(≒特性値)と呼ばれます。
BLEデバイスから、キャラクタリスティックを読み込むためにすべきことは、以下です。
- BluetoothGattオブジェクトを用いて、サービスUUIDを指定してサービスオブジェクトを取得します。
mBluetoothGatt.getService( uuid_service ); - 取得したサービスオブジェクトを用いて、キャラクタリスティックUUIDを指定してキャラクタリスティックオブジェクトを取得します。
blechar = mBluetoothGatt.getService( uuid_service ).getCharacteristic( uuid_characteristic ); - BluetoothGattオブジェクトを用いて、取得したキャラクタリスティックオブジェクトを指定して、キャラクタリスティック読み込み関数を呼び出します。
mBluetoothGatt.readCharacteristic( blechar ); - BluetoothGattコールバックオブジェクトの定義にて、キャラクタリスティックが読み込まれたときの処理であるonCharacteristicRead関数を定義し、ソフトウェア固有の処理(値の表示等)を行います。
BLEデバイスが指定のサービスをサポートしていない場合は、キャラクタリスティックを読み込むことはできません。BLEデバイスが指定のサービスをサポートしているか調べる必要があります。BLEデバイスが指定のサービスをサポートしているかを調べるためにすべきことは、以下です。
- BluetoothGattオブジェクトを用いて、サービスを検索する処理であるdiscoverServices()を呼び出します。
mBluetoothGatt.discoverServies(); - BluetoothGattコールバックオブジェクトの定義にて、サービス検索が終了したときの処理であるonServicesDiscovered関数を定義し、ソフトウェア固有の処理(読み込みボタンの有効処理等)を行います。
上記以外に、今回やっていることは、以下です。
- 「Chara1」ボタンで「プライベートキャラクタリスティック1」の値の読み込みをします。「Chara2」ボタンで「プライベートキャラクタリスティック2」の値の読み込みをします。
(onClick関数において、「Char1(2)」ボタンの場合は、readCharacteristic関数を呼び出します。)
実装
プロジェクトを開く
03.で作成したプロジェクトを開きます。
文字列リソースの追加
必要な文字列定義を追加します。
「Project」ペインの「app > res > values > strings.xml」を開きます。
2つの「キャラクタリスティック読み込み」ボタン用の文字列の定義を追加します。
「strings.xml」全体としては、以下のようにします。
ファイルを上書き保存します。
レイアウトの編集
メインアクティビティのレイアウトを編集します。
「Project」ペインの「app > res > layout > activity_main.xml」を開きます。
「Connect」ボタンと「Disconect」ボタンの下に、2つの「キャラクタリスティック読み込み」ボタンと値を表示するためのTextViewを設置します。
activity_main.xmlの内容を以下のようにします。
メインアクティビティクラスのメンバー変数の追加
メインアクティビティに、必要な定数宣言とメンバー変数宣言を追加します。
「Bluetooth LE Gatt UUID」定数の宣言、2つの「キャラクタリスティック読み込み」ボタンオブジェクトの変数宣言を追加します。
「MainActivity」クラスの定数、変数の宣言を以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのonCreate関数の編集
メインアクティビティのonCreate関数に、必要な処理を追加します。
2つの「キャラクタリスティック読み込み」ボタンの取得とクリックリスナーの設定の処理を追加します。
onCreate関数を、以下のようにします。
メインアクティビティクラスのクリックリスナーの編集
メインアクティビティのクリックリスナーに、必要な処理を追加します。
2つの「キャラクタリスティック読み込み」ボタンクリック時の処理を追加します。
onClick関数を、以下のようにします。
キャラクタリスティックの読み込みの関数の追加
キャラクタリスティックの読み込みの関数を追加します。
「MainActivity」クラスの末尾に、以下を追加します。
BluetoothGattコールバッククラスのオブジェクトの定義の編集
BluetoothGattコールバッククラスのオブジェクトの定義を編集します。
接続完了したときの処理に、サービス検索処理である「mBluetoothGatt.discoverServices();」を追加します。
接続可能範囲から外れて切断されたとき処理に、読み込みボタンを無効にする処理を追加します。
サービス検索が完了したときの処理を追加します。
キャラクタリスティックが読み込まれたときの処理を追加します。
BluetoothGattコールバッククラスのオブジェクトの定義を以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのonResume関数の編集
onResume関数を編集します。
初回表示時および復帰時には、2つの「キャラクタリスティック読み込み」ボタンが無効となるように処理を追加します。
メインアクティビティクラスの、disconnect関数の編集
disconnect関数を編集します。
接続を切断したときには、2つの「キャラクタリスティック読み込み」ボタンが無効となるように処理を追加します。
メインアクティビティクラスの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」ボタンと「CHARA1」ボタンがあります。
「CHARA1」ボタンをタップすると、キャラクタリスティック1の値が読み込まれ、表示されます。
「CHARA2」ボタンをタップすると、キャラクタリスティック2の値が読み込まれ、表示されます。
ダウンロード
サンプルプロジェクト
(github.com上のダウンロードページ)
関連ページ
前項目:03.BLEデバイスとの接続・切断の処理を作る
次項目:05.BLEデバイスから値の変更の通知を受け取る処理を作る