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



Bluetoothデバイスへ文字列を送信する処理を作成します。

解説

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

  1. BluetoothSocketオブジェクトを用いて、「OutputStream」オブジェクトを取得します。
    (mOutput = mBluetoothSocket.getOutputStream();)
  2. 取得した「OutputStream」オブジェクトを用いて、Bluetoothデバイスへバイト列を送信します。
    (mOutput.write( buf );)

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

実装

プロジェクトを開く

04.で作成したプロジェクトを開きます。

文字列リソースの追加

必要な文字列定義を追加します。

「Project」ペインの「app > res > values > strings.xml」を開きます。

「送信」ラベル用の文字列と、2つの「文字列送信」ボタン用の文字列の定義を追加します。


「strings.xml」全体としては、以下のようにします。


ファイルを上書き保存します。

レイアウトの編集

メインアクティビティのレイアウトを編集します。

「Project」ペインの「app > res > layout > activity_main.xml」を開きます。

「受信」ラベルと受信文字列を表示するためのTextViewの下に、2つの「文字列送信」ボタンを設置します。


activity_main.xmlの内容を以下のようにします。

メインアクティビティクラスのメンバー変数の追加

メインアクティビティに、必要な定数宣言とメンバー変数宣言を追加します。

2つの「文字列送信」ボタンの変数宣言を追加します。

「MainActivity」クラスの、変数の宣言を以下のようにします。


リビルドし、エラー、警告がないことを確認します。

メインアクティビティクラスのonCreate関数の編集

メインアクティビティのonCreate関数に、必要な処理を追加します。

2つの「文字列送信」ボタンの取得とクリックリスナーの設定の処理を追加します。

onCreate関数を、以下のようにします。

メインアクティビティクラスのクリックリスナーの編集

メインアクティビティのクリックリスナーに、必要な処理を追加します。

2つの「文字列送信」ボタンクリック時の処理を追加します。

onClick関数を、以下のようにします。

文字列送信の関数の追加

文字列送信の関数を追加します。

「MainActivity」クラスの末尾に、以下を追加します。

Bluetoothサービスクラスの編集

Bluetoothデバイスと通信する際に使用する補助クラス「Bluetoothサービス」クラスに、送信処理を追加します。

「Bluetoothサービスのスレッド」から「UIのスレッド」へメッセージを送信するためのメッセージ定数「MESSAGE_WRITTEN」を追加します。

「BluetoothService」クラスの、定数の宣言を、以下のようにします。


「Bluetoothサービス」クラスの内部クラスの「コネクションスレッド」クラスに、送信処理で使用する「OutputStream」オブジェクトの宣言を追加します。

「ConnectionThread」クラスのメンバー変数の宣言を、以下のようにします。


「Bluetoothサービス」クラスの内部クラスの「コネクションスレッド」クラスのコンストラクタに、「OutputStream」オブジェクト取得処理をを追加します。

「ConnectionThread」クラスのコンストラクタを、以下のようにします。


「Bluetoothサービス」クラスの内部クラスの「コネクションスレッド」クラスの末尾に、バイト列送信関数を追加します。


「Bluetoothサービス」クラスの末尾に、バイト列送信関数を追加します。

Bluetoothサービスから情報を取得するハンドラの定義の編集

Bluetoothサービスから情報を取得するハンドラの定義を編集します。

Bluetoothサービスからのメッセージを処理するhandleMessage()に、Bluetoothデバイスへ文字列を送信した時の処理「case BluetoothService.MESSAGE_WRITTEN:」を追加します。


Bluetoothサービスからのメッセージを処理するhandleMessage()の、接続完了時の処理「case BluetoothService.STATE_CONECTED:」に「文字列送信」ボタンが有効になるように、また、切断開始時の処理「case BluetoothService.STATE_DISCONNECT_START:」に「文字列送信」ボタンが無効になるように、処理を追加します。


Bluetoothサービスから情報を取得するハンドラの定義を、以下のようにします。

「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。

メインアクティビティクラスのonResume関数の編集

onResume関数を編集します。

初回表示時および復帰時には、「文字列送信」ボタンが無効となるように処理を追加します。

実行

Bluetoothモジュールの準備。

「フィジカルコンピューティング > Arduino > Bluetooth通信する(Bluetoothモジュール RN-42 使用)」に従い、Bluetoothモジュールを準備しておきます。

Bluetoothモジュールの動作は以下です。

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

Android端末にて、動作確認。

ソフト起動後の画面。
「HELLO」ボタンと「WORLD」ボタンがありますが、無効となっています。


Bluetoothデバイスと接続直後の画面。
「HELLO」ボタンと「WORLD」ボタンが有効になります。


「HELLO」ボタンをタップすると、文字列「Hello」をBluetoothデバイスへ送信します。
送信結果は、ArduinoのLCDで確認します。


「WORLD」ボタンをタップすると、文字列「World」をBluetoothデバイスへ送信します。
送信結果は、ArduinoのLCDで確認します。

ダウンロード

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

関連ページ

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