BluetoothSocket.getInputStream

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秒ぐらいしてからサーバも終わった
10秒ぐらいしてからサーバも終わった

10秒ぐらいしてからサーバも終わった。

Sample/android/BluetoothSocket/getInputStream/src at master · bg1bgst333/Sample · GitHub