03.BLEデバイスとの接続・切断の処理を作る
BLEデバイスと接続する処理、BLEデバイスとの接続を切断する処理を作成します。
解説
BLEデバイスと接続するためにすべきことは、以下です。
- ConnectGattコールバックオブジェクトを定義します。
- ConnectGattコールバックオブジェクトの定義にて、接続状態が変わったときの処理であるonConnectionStateChange関数を定義し、ソフトウェア固有の処理(ボタンの有効無効処理、等)を行うようにします。
- BluetoothAdapterオブジェクトを用いて、BLEデバイスのオブジェクトを取得します。
(BluetoothDevice device = mBluetoothAdapter.getRemoteDevice( mDeviceAddress );)) - 取得したBLEデバイスオブジェクトを用いて、connectGatt関数を呼び出す。第3引数には、1.で作成したConnectGattコールバックオブジェクトを指定します。
(mBluetoothGatt = device.connectGatt( this, false, mGattcallback );
BLEデバイスと切断するためにすべきことは、以下です。
- BluetoothGattオブジェクトを用いて、close関数を呼び出します。
(mBluetoothGatt.close();) - BluetoothGattオブジェクトを開放します。
(mBluetoothGatt = null;)
上記以外に、今回やっていることは、以下です。
- 「Connect」ボタンで接続、「Disconnect」ボタンで接続を切断します。
(onClick関数において、「Connect」ボタンの場合は、connect関数を呼び出します。「Disconnect」ボタンの場合は、disconnect関数を呼び出します。) - 「BLEデバイス検出アクティビティ」から戻ってきた際には、自動で内部的に「Connect」ボタンをクリックします。
(onResume関数で、「Connect」ボタンオブジェクトのcallOnClick関数を呼び出します) - 接続可能範囲から外れて切断された場合には、接続可能範囲に入ったら自動接続するようにします。
(BluetoothGattコールバックオブジェクトについて、切断完了時に、接続可能範囲に入ったら自動接続するために、mBluetoothGatt.connect()を呼び出します。)
実装
プロジェクトを開く
02.で作成したプロジェクトを開きます。
文字列リソースの追加
必要な文字列定義を追加します。
「Project」ペインの「app > res > values > strings.xml」を開きます。
「Connect」ボタン用の文字列の定義と、「Disconnect」ボタン用の文字列の定義を追加します。
「strings.xml」全体としては、以下のようにします。
ファイルを上書き保存します。
レイアウトの編集
メインアクティビティのレイアウトを編集します。
「Project」ペインの「app > res > layout > activity_main.xml」を開きます。
デバイス名と、デバイスアドレスを表示するためのTextViewの下に、「Connect」ボタンと「Disconect」ボタンを設置します。
activity_main.xmlの内容を以下のようにします。
メインアクティビティクラスのメンバー変数の追加
メインアクティビティに、必要な定数宣言とメンバー変数宣言を追加します。
BluetoothGattオブジェクト、「Connect」ボタンオブジェクト、「Disconnect」ボタンオブジェクトの変数宣言を追加します。
「MainActivity」クラスの定数、変数の宣言を以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのonCreate関数の編集
メインアクティビティのonCreate関数に、必要な処理を追加します。
「Connect」ボタン、「Disconnect」ボタンの取得とクリックリスナーの設定の処理を追加します。
onCreate関数を、以下のようにします。
メインアクティビティクラスにボタンのクリックリスナーの追加
ボタンのクリックリスナーを実装するために、メインアクティビティクラスに「implements View.OnClickListener」を追加します。
ボタンのクリックリスナーを実装します。
「MainActivity」クラスの末尾に、以下を追加します。
メインアクティビティクラスに接続・切断の関数の追加
接続・切断の関数を追加します。
「MainActivity」クラスの末尾に、以下を追加します。
メインアクティビティクラスにBluetoothGattコールバッククラスのオブジェクトの定義の追加
BluetoothGattコールバッククラスのオブジェクトの定義を追加します。
接続完了したときの処理と、接続可能範囲から外れて切断されたときの処理を追加します。
「MainActivity」クラスのメンバ変数宣言の直後、onCreate関数の前に、以下を追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのonResume関数の編集
onResume関数を編集します。
初回表示時および復帰時には、「Connect」ボタン、「Disconnect」ボタンが無効となるように処理を追加します。
初回表示時および復帰時に、デバイスアドレスが空でなければ、接続ボタンが有効になるように処理を追加します。
初回表示時および復帰時には、「Connect」ボタンが自動で押されるように処理を追加します。
メインアクティビティクラスに、onPause関数、onDestroy関数の追加
メインアクティビティに、「別のアクティビティ(か別のアプリ)に移行したことで、バックグラウンドに追いやられた時」に呼ばれる関数である onPause関数と、「アクティビティの終了直前」に呼ばれる関数である
onDestroy関数を追加します。
onPause関数では、切断の関数を呼びます。
onDestroy関数では、BluetoothGattコールバッククラスのオブジェクトを削除します。
onResume関数の直後に、以下を追加します。
実行
BLEモジュールの準備。
「フィジカルコンピューティング > RN4020 > Arduinoからのキャラクタリスティックの値の書き込み」に従い、BLEモジュールを準備しておきます。
Android端末にて、動作確認。
ソフト起動後の画面。
「Connect」ボタンと「Disconnect」ボタンは無効となっています。
右上の「検出」アイコンをタップすると、「BLEデバイス検出アクティビティ」に移行します。
検出されたBLEデバイスの名前をタップすると、「メインアクティビティ」に戻ります。
「Device Name」欄と「Device Addres」欄に、BLEデバイスの名前とアドレスが表示されます。
「Connect」ボタンは自動で押され、BLEデバイスに接続します。接続が完了すると「Disconnect」ボタンが有効となります。
「Disconnect」ボタンを押すと、BLEデバイスとの接続が切断されます。切断が完了すると「Connect」ボタンが有効となります。
ダウンロード
サンプルプロジェクト
(github.com上のダウンロードページ)
関連ページ
前項目:02.BLEデバイスを検出する処理を作る
次項目:04.BLEデバイスから値を読み込む処理を作る