BluetoothSocket.getInputStreamで、InputStreamオブジェクトを取得して、あとはそれを使って読み込む。
BluetoothSocket | Android Developers
MainActivity.javaで、
package com.bgstation0.android.sample.bluetoothsocket_; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.UUID; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; //メインアクティビティ public class MainActivity extends Activity implements OnClickListener, OnItemClickListener{ // メンバフィールドの定義 Context mContext = null; // mContextをnullで初期化. ListView mListView1 = null; // mListView1をnullで初期化. ArrayList<BluetoothDevice> mBluetoothDeviceList = null; // mBluetoothDeviceListをnullで初期化. CustomAdapter mCustomAdapter = null; // mCustomAdapterをnullで初期化. BroadcastReceiver mCustomReceiver = null; // ブロードキャストレシーバはnullで初期化. BluetoothAdapter mBluetoothAdapter = null; // nullで初期化. public static final int REQUEST_CODE_BLUETOOTH_ENABLE = 1; // REQUEST_CODE_BLUETOOTH_ENABLEを1で初期化. // アクティビティ生成時 @Override protected void onCreate(Bundle savedInstanceState) { // 既定の処理 super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // mContextに自身をセット. mContext = this; // mContextにthisを格納. // リストビューの取得とアイテム選択ハンドラのセット. mListView1 = (ListView)findViewById(R.id.listview1); // mListView1を取得. mListView1.setOnItemClickListener(this); // thisをセット. // カスタムアダプタの生成とセット.. mBluetoothDeviceList = new ArrayList<BluetoothDevice>(); // mBluetoothDeviceListを生成. mCustomAdapter = new CustomAdapter(this, R.layout.list_item, mBluetoothDeviceList); // CustomAdapterの生成. mListView1.setAdapter(mCustomAdapter); // mListView1.setAdapterでmCustomAdapterをセット. // カスタムレシーバ生成. mCustomReceiver = new CustomReceiver(this); // CustomReceiverを生成.(thisを渡す.) // button1の初期化. Button button1 = (Button)findViewById(R.id.button1); // button1を取得. button1.setOnClickListener(this); // thisをセット. } // クリック時 @Override public void onClick(View v) { // TODO Auto-generated method stub // BluetoothAdapterの取得. mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // mBluetoothAdapterの取得. if (mBluetoothAdapter != null){ // nullでない. // 利用可能でなかったら, Bluetooth設定画面に遷移し, 利用可能なら探索. if (!mBluetoothAdapter.isEnabled()){ // 利用可能でない. Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); // 利用可能リクエスト. startActivityForResult(intent, REQUEST_CODE_BLUETOOTH_ENABLE); // startActivityForResultでintent発行, REQUEST_CODE_BLUETOOTH_ENABLEを渡す. } else{ // 利用可能. // インテントフィルターをカスタムレシーバに登録. IntentFilter filter = new IntentFilter(); // filterの生成. filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); // 開始 filter.addAction(BluetoothDevice.ACTION_FOUND); // 発見 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); // 終了 registerReceiver(mCustomReceiver, filter); // mCustomReceiverにfilterを登録. // 探索. mBluetoothAdapter.startDiscovery(); // mBluetoothAdapter.startDiscoveryで探索開始. } } } // Bluetooth許可ダイアログから返ってきた時. @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent){ // リクエストがBluetooth許可の場合. if (requestCode == REQUEST_CODE_BLUETOOTH_ENABLE){ if (resultCode == Activity.RESULT_OK){ // ユーザが許可を押した時. // インテントフィルターをカスタムレシーバに登録. IntentFilter filter = new IntentFilter(); // filterの生成. filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); // 開始 filter.addAction(BluetoothDevice.ACTION_FOUND); // 発見 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); // 終了 registerReceiver(mCustomReceiver, filter); // mCustomReceiverにfilterを登録. // 探索. mBluetoothAdapter.startDiscovery(); // mBluetoothAdapter.startDiscoveryで探索開始. } } } // アイテムが選択された時. @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // デバイスの取得. BluetoothDevice bluetoothDevice = mBluetoothDeviceList.get(position); // mBluetoothDeviceList.getでbluetoothDeviceを取得. // SPPのUUID準備. UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // SPPのUUIDはこれ. // Bluetoothソケットで接続. BluetoothSocket soc = null; // Bluetoothソケットsocをnullで初期化. try { // ソケット作成. soc = bluetoothDevice.createRfcommSocketToServiceRecord(uuid); Toast.makeText(mContext, "soc = " + soc.toString(), Toast.LENGTH_LONG).show(); // soc.toString()を表示. // ソケット接続. soc.connect(); // soc.connectで接続. Toast.makeText(mContext, "soc.connect", Toast.LENGTH_LONG).show(); // "soc.connect"と表示. // 書き込み. OutputStream outputStream = soc.getOutputStream(); // soc.getOutputStreamで出力ストリーム取得. String str = "ABCDE"; // strに"ABCDE"をセット. outputStream.write(str.getBytes(Charset.forName("UTF-8"))); // strを書き込み. // 読み込み. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(soc.getInputStream(), Charset.forName("UTF-8"))); // bufferedReaderを生成. String res = bufferedReader.readLine(); // bufferedReader.readLineで読み込み, resに格納. Toast.makeText(mContext, "res = " + res, Toast.LENGTH_LONG).show(); // resを表示. // ソケットを閉じる. soc.close(); // soc.closeで閉じる. soc = null; // 閉じたらsocをnullにする. Toast.makeText(mContext, "soc.close", Toast.LENGTH_LONG).show(); // "soc.close"と表示. } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); Toast.makeText(mContext, "e1 = " + e1.getMessage(), Toast.LENGTH_LONG).show(); // 例外メッセージ表示. if (soc != null){ // socが残ってたら閉じておく. try { // ソケットを閉じる. soc.close(); // soc.closeで閉じる. soc = null; // 閉じたらsocをnullにする. Toast.makeText(mContext, "soc.close", Toast.LENGTH_LONG).show(); // "soc.close"と表示. } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); Toast.makeText(mContext, "e2 = " + e2.getMessage(), Toast.LENGTH_LONG).show(); // 例外メッセージ表示. } } } } }
こんな感じ。
server.cは、
/* ヘッダファイルのインクルード */ #include <stdio.h> /* 標準入出力 */ #include <unistd.h> /* UNIX標準 */ #include <sys/types.h> /* 派生型 */ #include <sys/socket.h> /* ソケット */ #include <bluetooth/bluetooth.h> /* Bluetooth */ #include <bluetooth/rfcomm.h> /* RFCOMM */ /* main関数 */ int main(void){ /* 変数の初期化. */ int soc = -1; /* Bluetoothソケットを-1で初期化. */ struct sockaddr_rc local_addr = {0}; /* local_addrを{0}で初期化. */ struct sockaddr_rc remote_addr = {0}; /* remote_addrを{0}で初期化. */ int remote_addr_len = 0; /* remote_addr_lenを0で初期化. */ int acc = -1; /* 待ち受けソケットを-1で初期化. */ char remote_addr_str[1024] = {0}; /* リモートアドレス文字列を{0}で初期化. */ int read_len = -1; /* 読み込んだ長さread_lenを-1で初期化. */ char read_buf[1024] = {0}; /* 読み込みバッファread_buf(長さ1024)を{0}で初期化. */ char write_str[] = "VWXYZ"; /* write_strを"VWXYZ"で初期化. */ /* Bluetooth(RFCOMM)のソケット作成 */ soc = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); /* socketにAF_BLUETOOTHとBTPROTO_RFCOMMをセットしてsocを作成. */ if (soc == -1){ /* socが-1の時はエラー. */ /* エラー処理 */ printf("socket error!\n"); /* "socket error!"と出力. */ return -1; /* -1を返す. */ } /* ソケットの値を出力. */ printf("soc = %d\n", soc); /* socを出力. */ /* バインドするアドレス情報の設定. */ local_addr.rc_family = AF_BLUETOOTH; /* Bluetoothアドレスファミリー */ local_addr.rc_bdaddr = *BDADDR_ANY; /* BDADDR_ANY */ local_addr.rc_channel = (uint8_t)22; /* チャンネルは22とする. */ /* socにlocal_addrをバインドする. */ if (bind(soc, (struct sockaddr *)&local_addr, sizeof(local_addr)) == -1){ /* bindが-1ならエラー. */ /* エラー処理 */ printf("bind error!\n"); /* "bind error!"と出力. */ close(soc); /* closeでsocを閉じる. */ return -1; /* -1を返す. */ } /* 成功したら"bind success." */ printf("bind success.\n"); /* "bind success."と出力. */ /* リッスン開始. */ if (listen(soc, 1) == -1){ /* listenで1つだけ待ち受ける. */ /* エラー処理 */ printf("listen error!\n"); /* "listen error!"と出力. */ close(soc); /* closeでsocを閉じる. */ return -1; /* -1を返す. */ } /* 成功したら"listen success." */ printf("listen success.\n"); /* "listen success."と出力. */ /* remote_addr_lenのセット. */ remote_addr_len = sizeof(remote_addr); /* sizeof(remote_addr)をセット. */ /* アクセプト開始. */ acc = accept(soc, (struct sockaddr *)&remote_addr, &remote_addr_len); /* acceptでアクセプトしたら, アクセプトソケットをaccに格納. */ if (acc == -1){ /* accが-1ならエラー. */ /* エラー処理 */ printf("accept error!\n"); /* "accept error!"と出力. */ close(soc); /* closeでsocを閉じる. */ return -1; /* -1を返す. */ } /* リモートアドレスの出力. */ ba2str(&remote_addr.rc_bdaddr, remote_addr_str); /* ba2strで文字列に変換. */ printf("accept!(Bluetooth Address = %s)\n", remote_addr_str); /* remote_addr_strを出力. */ /* 読み込み. */ read_len = read(acc, read_buf, sizeof(char) * 1024); /* readで読み込んだ内容をread_bufに格納. */ if (read_len > 0){ /* 長さが1以上. */ printf("read_buf = %s\n", read_buf); /* read_bufを出力. */ write(acc, write_str, strlen(write_str) + 1); /* write_strを書き込み. */ } /* ソケットを閉じる. */ close(acc); /* closeでaccを閉じる. */ close(soc); /* closeでsocを閉じる. */ /* プログラムの終了 */ return 0; }
こうする。

上手く読み込めない。
bufferedReader.readLineじゃなくてinputStream.readしてから文字列にしよ。
一応server.cで10秒待ってみる。
いらないかもだけど。

今度はちゃんと読み込めた。

10秒ぐらいしてからサーバも終わった。
Sample/android/BluetoothSocket/getInputStream/src at master · bg1bgst333/Sample · GitHub