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;
ListView mListView1 = null;
ArrayList<BluetoothDevice> mBluetoothDeviceList = null;
CustomAdapter mCustomAdapter = null;
BroadcastReceiver mCustomReceiver = null;
BluetoothAdapter mBluetoothAdapter = null;
public static final int REQUEST_CODE_BLUETOOTH_ENABLE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
mListView1 = (ListView)findViewById(R.id.listview1);
mListView1.setOnItemClickListener(this);
mBluetoothDeviceList = new ArrayList<BluetoothDevice>();
mCustomAdapter = new CustomAdapter(this, R.layout.list_item, mBluetoothDeviceList);
mListView1.setAdapter(mCustomAdapter);
mCustomReceiver = new CustomReceiver(this);
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
TODO
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter != null){
if (!mBluetoothAdapter.isEnabled()){
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, REQUEST_CODE_BLUETOOTH_ENABLE);
}
else{
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mCustomReceiver, filter);
mBluetoothAdapter.startDiscovery();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent){
if (requestCode == REQUEST_CODE_BLUETOOTH_ENABLE){
if (resultCode == Activity.RESULT_OK){
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mCustomReceiver, filter);
mBluetoothAdapter.startDiscovery();
}
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
BluetoothDevice bluetoothDevice = mBluetoothDeviceList.get(position);
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
BluetoothSocket soc = null;
try {
soc = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);
Toast.makeText(mContext, "soc = " + soc.toString(), Toast.LENGTH_LONG).show();
soc.connect();
Toast.makeText(mContext, "soc.connect", Toast.LENGTH_LONG).show();
OutputStream outputStream = soc.getOutputStream();
String str = "ABCDE";
outputStream.write(str.getBytes(Charset.forName("UTF-8")));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(soc.getInputStream(), Charset.forName("UTF-8")));
String res = bufferedReader.readLine();
Toast.makeText(mContext, "res = " + res, Toast.LENGTH_LONG).show();
soc.close();
soc = null;
Toast.makeText(mContext, "soc.close", Toast.LENGTH_LONG).show();
}
catch (Exception e1) {
TODO
e1.printStackTrace();
Toast.makeText(mContext, "e1 = " + e1.getMessage(), Toast.LENGTH_LONG).show();
if (soc != null){
try {
soc.close();
soc = null;
Toast.makeText(mContext, "soc.close", Toast.LENGTH_LONG).show();
} catch (Exception e2) {
TODO
e2.printStackTrace();
Toast.makeText(mContext, "e2 = " + e2.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
}
}
こんな感じ。
server.cは、
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
int main(void){
int soc = -1;
struct sockaddr_rc local_addr = {0};
struct sockaddr_rc remote_addr = {0};
int remote_addr_len = 0;
int acc = -1;
char remote_addr_str[1024] = {0};
int read_len = -1;
char read_buf[1024] = {0};
char write_str[] = "VWXYZ";
soc = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
if (soc == -1){
printf("socket error!\n");
return -1;
}
printf("soc = %d\n", soc);
local_addr.rc_family = AF_BLUETOOTH;
local_addr.rc_bdaddr = *BDADDR_ANY;
local_addr.rc_channel = (uint8_t)22;
if (bind(soc, (struct sockaddr *)&local_addr, sizeof(local_addr)) == -1){
printf("bind error!\n");
close(soc);
return -1;
}
printf("bind success.\n");
if (listen(soc, 1) == -1){
printf("listen error!\n");
close(soc);
return -1;
}
printf("listen success.\n");
remote_addr_len = sizeof(remote_addr);
acc = accept(soc, (struct sockaddr *)&remote_addr, &remote_addr_len);
if (acc == -1){
printf("accept error!\n");
close(soc);
return -1;
}
ba2str(&remote_addr.rc_bdaddr, remote_addr_str);
printf("accept!(Bluetooth Address = %s)\n", remote_addr_str);
read_len = read(acc, read_buf, sizeof(char) * 1024);
if (read_len > 0){
printf("read_buf = %s\n", read_buf);
write(acc, write_str, strlen(write_str) + 1);
}
close(acc);
close(soc);
return 0;
}
こうする。
上手く読み込めない。
bufferedReader.readLineじゃなくてinputStream.readしてから文字列にしよ。
一応server.cで10秒待ってみる。
いらないかもだけど。
今度はちゃんと読み込めた。
10秒ぐらいしてからサーバも終わった。
Sample/android/BluetoothSocket/getInputStream/src at master · bg1bgst333/Sample · GitHub