05.Bluetoothデバイスへ文字列を送信する処理を作る
Bluetoothデバイスへ文字列を送信する処理を作成します。
解説
Bluetoothデバイスへ文字列を送信するためにすべきことは、以下です。
- BluetoothSocketオブジェクトを用いて、「OutputStream」オブジェクトを取得します。
(mOutput = mBluetoothSocket.getOutputStream();) - 取得した「OutputStream」オブジェクトを用いて、Bluetoothデバイスへバイト列を送信します。
(mOutput.write( buf );)
上記以外に、今回やっていることは、以下です。
- 「Hello」ボタンで、文字列「Hello」をBluetoothデバイスへ送信します。「World」ボタンで、文字列「World」をBluetoothデバイスへ送信します。
(onClick関数において、「Hello」ボタン、「World」ボタンの場合、write関数を呼び出します。)
実装
プロジェクトを開く
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モジュールの動作は以下です。
- 1秒ごとに、カウントアップされる値を文字列として送信する。
- 受信した文字列を、「改行文字(\r)」まで切り出し、LCDに表示する。
Android端末では、Bluetoothモジュールとのペアリングをしておきます。
Android端末にて、動作確認。
ソフト起動後の画面。
「HELLO」ボタンと「WORLD」ボタンがありますが、無効となっています。
Bluetoothデバイスと接続直後の画面。
「HELLO」ボタンと「WORLD」ボタンが有効になります。
「HELLO」ボタンをタップすると、文字列「Hello」をBluetoothデバイスへ送信します。
送信結果は、ArduinoのLCDで確認します。
「WORLD」ボタンをタップすると、文字列「World」をBluetoothデバイスへ送信します。
送信結果は、ArduinoのLCDで確認します。
ダウンロード
サンプルプロジェクト
(github.com上のダウンロードページ)
関連ページ
前項目:04.Bluetoothデバイスから文字列を受信する処理を作る