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