마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드에서 2개의 기기(아두이노 UNO / 릴리패드)들을 블루투스로 연결하고자 합니다

0 추천

안녕하세요 질문 제목 그대로

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;
	}

 

 

 

 

익명사용자 님이 2016년 10월 23일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...