안녕하세요 질문 제목 그대로
2개의 기기를 블루투스로 연결하려고 하는데.. 막상 블루투스 연결을 하려고 하면 에러가 나네요..
각각의 센서값들을 동시에 받아오려고 하는데 저게 맞는 코드인지도 잘 모르겠습니다
번거로우시겠지만 답변 꼭 부탁드립니다..ㅠㅠ
// 블루투스 지원하며 활성 상태인 경우.
void selectDevice() {
// 블루투스 디바이스는 연결해서 사용하기 전에 먼저 페어링 되어야만 한다
// getBondedDevices() : 페어링된 장치 목록 얻어오는 함수.
mDevices = mBluetoothAdapter.getBondedDevices();
mPariedDeviceCount = mDevices.size();
if(mPariedDeviceCount == 0 ) { // 페어링된 장치가 없는 경우.
Toast.makeText(getApplicationContext(), "페어링된 장치가 없습니다.", Toast.LENGTH_LONG).show();
finish(); // App 종료.
}
// 페어링된 장치가 있는 경우.
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("블루투스 장치 선택");
// 각 디바이스는 이름과(서로 다른) 주소를 가진다. 페어링 된 디바이스들을 표시한다.
List<String> listItems = new ArrayList<String>();
for(BluetoothDevice device : mDevices) {
// device.getName() : 단말기의 Bluetooth Adapter 이름을 반환.
listItems.add(device.getName());
}
listItems.add("취소"); // 취소 항목 추가.
// CharSequence : 변경 가능한 문자열.
// toArray : List형태로 넘어온것 배열로 바꿔서 처리하기 위한 toArray() 함수.
final CharSequence[] items = listItems.toArray(new CharSequence[listItems.size()]);
// toArray 함수를 이용해서 size만큼 배열이 생성 되었다.
listItems.toArray(new CharSequence[listItems.size()]);
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
// TODO Auto-generated method stub
if(item == mPariedDeviceCount) { // 연결할 장치를 선택하지 않고 '취소' 를 누른 경우.
Toast.makeText(getApplicationContext(), "연결할 장치를 선택하지 않았습니다.", Toast.LENGTH_LONG).show();
finish();
}
else { // 연결할 장치를 선택한 경우, 선택한 장치와 연결을 시도함.
connectToSelectedDevice(items[item].toString());
}
}
});
builder.setCancelable(false); // 뒤로 가기 버튼 사용 금지.
AlertDialog alert = builder.create();
alert.show();
}
void checkBluetooth() { //블루투스 지원하는지 확인함
/**
* getDefaultAdapter() : 만일 폰에 블루투스 모듈이 없으면 null 을 리턴한다.
이경우 Toast를 사용해 에러메시지를 표시하고 앱을 종료한다.
*/
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter == null ) { // 블루투스 미지원
Toast.makeText(getApplicationContext(), "기기가 블루투스를 지원하지 않습니다.", Toast.LENGTH_LONG).show();
finish(); // 앱종료
}
else { // 블루투스 지원
/** isEnable() : 블루투스 모듈이 활성화 되었는지 확인.
* true : 지원 , false : 미지원
*/
if(!mBluetoothAdapter.isEnabled()) { // 블루투스 지원하며 비활성 상태인 경우.
Toast.makeText(getApplicationContext(), "현재 블루투스가 비활성 상태입니다.", Toast.LENGTH_LONG).show();
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
// REQUEST_ENABLE_BT : 블루투스 활성 상태의 변경 결과를 App 으로 알려줄 때 식별자로 사용(0이상)
/**
startActivityForResult 함수 호출후 다이얼로그가 나타남
"예" 를 선택하면 시스템의 블루투스 장치를 활성화 시키고
"아니오" 를 선택하면 비활성화 상태를 유지 한다.
선택 결과는 onActivityResult 콜백 함수에서 확인할 수 있다.
*/
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
else // 블루투스 지원하며 활성 상태인 경우.
selectDevice();
}
}
// connectToSelectedDevice() : 원격 장치와 연결하는 과정을 나타냄.
// 실제 데이터 송수신을 위해서는 소켓으로부터 입출력 스트림을 얻고 입출력 스트림을 이용하여 이루어 진다.
void connectToSelectedDevice(String selectedDeviceName) {
// BluetoothDevice 원격 블루투스 기기를 나타냄.
mRemoteDevie = getDeviceFromBondedList(selectedDeviceName);
mRemoteDevie2 = getDeviceFromBondedList(selectedDeviceName);
// java.util.UUID.fromString : 자바에서 중복되지 않는 Unique 키 생성.
UUID uuid = java.util.UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
UUID uuid2 = java.util.UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
try {
// 소켓 생성, RFCOMM 채널을 통한 연결.
// createRfcommSocketToServiceRecord(uuid) : 이 함수를 사용하여 원격 블루투스 장치와 통신할 수 있는 소켓을 생성함.
// 이 메소드가 성공하면 스마트폰과 페어링 된 디바이스간 통신 채널에 대응하는 BluetoothSocket 오브젝트를 리턴함.
mSocket = mRemoteDevie.createRfcommSocketToServiceRecord(uuid);
mSocket2 = mRemoteDevie2.createRfcommSocketToServiceRecord(uuid);
mSocket.connect(); // 소켓이 생성 되면 connect() 함수를 호출함으로써 두기기의 연결은 완료된다.
mSocket2.connect();
// 데이터 송수신을 위한 스트림 얻기.
// BluetoothSocket 오브젝트는 두개의 Stream을 제공한다.
// 1. 데이터를 보내기 위한 OutputStrem
// 2. 데이터를 받기 위한 InputStream
mOutputStream = mSocket.getOutputStream();
mInputStream = mSocket.getInputStream();
mOutputStream = mSocket2.getOutputStream();
mInputStream = mSocket2.getInputStream();
// 데이터 수신 준비.
beginListenForData();
}catch(Exception e) { // 블루투스 연결 중 오류 발생
Toast.makeText(getApplicationContext(), "블루투스 연결 중 오류가 발생했습니다.", Toast.LENGTH_LONG).show();
finish(); // App 종료
}
}
// 블루투스 장치의 이름이 주어졌을때 해당 블루투스 장치 객체를 페어링 된 장치 목록에서 찾아내는 코드.
BluetoothDevice getDeviceFromBondedList(String name) {
// BluetoothDevice : 페어링 된 기기 목록을 얻어옴.
BluetoothDevice selectedDevice = null;
// getBondedDevices 함수가 반환하는 페어링 된 기기 목록은 Set 형식이며,
// Set 형식에서는 n 번째 원소를 얻어오는 방법이 없으므로 주어진 이름과 비교해서 찾는다.
for(BluetoothDevice deivce : mDevices) {
// getName() : 단말기의 Bluetooth Adapter 이름을 반환
if(name.equals(deivce.getName())) {
selectedDevice = deivce;
break;
}
}
return selectedDevice;
}