04.Bluetoothデバイスから文字列を受信する処理を作る
Bluetoothデバイスから文字列を受信する処理を作成します。
解説
Bluetoothデバイスから文字列を受信するためにすべきことは、以下です。
- BluetoothSocketオブジェクトを用いて、「InputStream」オブジェクトを取得します。
(mInput = mBluetoothSocket.getInputStream();) - 取得した「InputStream」オブジェクトを用いて、Bluetoothデバイスから送信されるバイト列を受信します。
(bytes = mInput.read( buf );)
上記以外に、今回やっていることは、以下です。
- 受信したバイト列を、「改行文字(\r)」まで切り出し、画面に表示します。
(「case BluetoothService.MESSAGE_READ:」の処理)
実装
プロジェクトを開く
03.で作成したプロジェクトを開きます。
文字列リソースの追加
必要な文字列定義を追加します。
「Project」ペインの「app > res > values > strings.xml」を開きます。
「受信」ラベル用の文字列の定義を追加します。
「strings.xml」全体としては、以下のようにします。
ファイルを上書き保存します。
レイアウトの編集
メインアクティビティのレイアウトを編集します。
「Project」ペインの「app > res > layout > activity_main.xml」を開きます。
「Connect」ボタンと「Disconect」ボタンの下に、「受信」ラベルと受信文字列を表示するためのTextViewを設置します。
activity_main.xmlの内容を、以下のようにします。
メインアクティビティクラスのメンバー変数の追加
メインアクティビティに、必要な定数宣言とメンバー変数宣言を追加します。
受信時に使用するバイトバッファーについて、バッファーサイズ定数の宣言と、バイトバッファー変数の定義と、カウンター変数の定義を追加します。
「MainActivity」クラスの、定数、変数の宣言を、以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
Bluetoothサービスクラスの編集
Bluetoothデバイスと通信する際に使用する補助クラス「Bluetoothサービス」クラスに、受信処理を追加します。
「Bluetoothサービスのスレッド」から「UIのスレッド」へメッセージを送信するためのメッセージ定数「MESSAGE_READ」を追加します。
「BluetoothService」クラスの、定数の宣言を、以下のようにします。
「Bluetoothサービス」クラスの内部クラスの「コネクションスレッド」クラスに、受信処理で使用する「InputStream」オブジェクトの宣言を追加します。
「ConnectionThread」クラスのメンバー変数の宣言を、以下のようにします。
「Bluetoothサービス」クラスの内部クラスの「コネクションスレッド」クラスのコンストラクタに、「InputStream」オブジェクト取得処理をを追加します。
「ConnectionThread」クラスのコンストラクタを、以下のようにします。
「Bluetoothサービス」クラスの内部クラスの「コネクションスレッド」クラスのrun()に、受信処理を追加します。「case STATE_CONNECTED:」に追加します。
「ConnectionThread」クラスのrun()を、以下のようにします。
Bluetoothサービスから情報を取得するハンドラの定義の編集
Bluetoothサービスから情報を取得するハンドラの定義を編集します。
Bluetoothサービスからのメッセージを処理するhandleMessage()に、Bluetoothデバイスから文字列を受信した時の処理「case
BluetoothService.MESSAGE_READ:」を追加します。
Bluetoothサービスから情報を取得するハンドラの定義を、以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
メインアクティビティクラスのonActivityResult関数の編集
メインアクティビティクラスのonActivityResult関数を編集します。
デバイスリストアクティビティから復帰したときの処理に、TextViewの値を初期化する処理を追加します。
onActivityResult関数を、以下のようにします。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
実行
Bluetoothモジュールの準備。
「フィジカルコンピューティング > Arduino > Bluetooth通信する(Bluetoothモジュール RN-42 使用)」に従い、Bluetoothモジュールを準備しておきます。
Bluetoothモジュールの動作は以下です。
- 1秒ごとに、カウントアップされる値を文字列として送信する。
- 受信した文字列を、「改行文字(\r)」まで切り出し、LCDに表示する。
Android端末では、Bluetoothモジュールとのペアリングをしておきます。
Android端末にて、動作確認。
ソフト起動後の画面。
Bluetoothデバイスと接続直後の画面。
Bluetoothデバイスから送信された文字列が受信処理され表示されます。
Bluetoothデバイスから値が送信されるたびに、受信処理され、値が更新されます。
ダウンロード
サンプルプロジェクト
(github.com上のダウンロードページ)
関連ページ
前項目:03.Bluetoothデバイスとの接続・切断の処理を作る
次項目:05.Bluetoothデバイスへ文字列を送信する処理を作る