04.Bluetoothデバイスから文字列を受信する処理を作る



Bluetoothデバイスから文字列を受信する処理を作成します。

解説

Bluetoothデバイスから文字列を受信するためにすべきことは、以下です。

  1. BluetoothSocketオブジェクトを用いて、「InputStream」オブジェクトを取得します。
    (mInput = mBluetoothSocket.getInputStream();)
  2. 取得した「InputStream」オブジェクトを用いて、Bluetoothデバイスから送信されるバイト列を受信します。
    (bytes = mInput.read( buf );)

上記以外に、今回やっていることは、以下です。

実装

プロジェクトを開く

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モジュールの動作は以下です。

Android端末では、Bluetoothモジュールとのペアリングをしておきます。

Android端末にて、動作確認。

ソフト起動後の画面。


Bluetoothデバイスと接続直後の画面。
Bluetoothデバイスから送信された文字列が受信処理され表示されます。


Bluetoothデバイスから値が送信されるたびに、受信処理され、値が更新されます。

ダウンロード

サンプルプロジェクト
github.com上のダウンロードページ

関連ページ

前項目:03.Bluetoothデバイスとの接続・切断の処理を作る

次項目:05.Bluetoothデバイスへ文字列を送信する処理を作る