개발 관련/개인 자료

안드로이드에서 시리얼 블루투스 디바이스 통신을 쉽게 하기 위한 클라이언트 클래스.

snoworca 2014. 6. 22. 10:42

우선 안드로이드 개발 문서를 살펴보자.

http://developer.android.com/guide/topics/connectivity/bluetooth.html

친철하게도 한글로 번역해놓은 분도 계시다. (감사합니다 b >.< d) 

http://hardroid.net/profiles/blogs/bluetooth 

  요즘은 안드로이드 관련 이슈나 API 문서를 한글로 번역해 놓는 분들이 많아서 참 고맙다. 친분이 있다면 치맥이라도 대접해 드리고 싶은 심정이다.

  그동안 안드로이드 개발해오면서 사운드 관련 API와 함께 블루투스 관련 API 는 깔끔한 편에 속하는 것 같다. (개인적인 느낌으로는...) UI 관련 API는 멘탈이 강하지 않으면 사용하기 힘들다. 단, 요즘은 3.x 이하 버전을 버리는 추세라서 많이 나아졌다.

  

우선 안드로이에서 블루투스를 사용하기 위한 단계를 살펴보면

   1. BluetoothAdapter 인스턴스 가져오기.

   2. 블루투스 활성화가 되어있지 않은 경우 활성화 시키기.

   3. 이미 페어링 되었던 디바이스 목록과 근처 사용 가능한 디바이스 스캔하기.

   4. 3번 과정을 통하여 가져온 디바이스 중에 하나를 골라서 시리얼 포트 모드로 연결한다.

   5. 데이터 주고 받기. OutputStream, InputStream 를 이용하여 데이터를 주고 받을 수 있다. 

   6. 연결을 닫는다.


  이와 같은 과정을 사용하는데, 문서에 있는 내용을 복불해서 매번 구현 하려면 귀찮아서 아래와 같은 클래스로 사용하기 편하게 만들었다.  사용하려는 목적은  블루투스 모듈과의 시리얼 통신이다. 



  우선 아래의 링크로 들어가서 나오는 코드를 복사 붙여넣기 한다. (안드로이드와 아두이노와의 에코 메세지를 주고 받는 간단한 프로젝트를 github 에 올려 놓았다.)

https://github.com/ice3x2/HC-06_Arduino_Echo/blob/master/src/kr/re/Dev/Bluetooth/BluetoothSerialClient.java


 사용법은 다음과 같다. 

 먼저  BluetoothSerialClient 클래스를 프로젝트에 추가한다. 

 AndroidMenifest.xml 파일에 블루투스 권한을 주고 액티비티를 하나 추가해야 한다.

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 

BluetoothUpActivity 를 매니페스트에 추가해준다.

경로는 각각의 프로젝트에 맞게 잘 변경해 주자.

<activity android:name="kr.re.Dev.Bluetooth.BluetoothSerialClient$BluetoothUpActivity"             android:theme="@android:style/Theme.Translucent.NoTitleBar"
 android:configChanges="orientation|screenSize|keyboard"/>

  이제 준비 완료!

   (잘 안 되면    https://github.com/ice3x2/HC-06_Arduino_Echo/ 의 전체 코드를 참고하시라.)


1. 초기화

BluetoothSerialClient client = BluetoothSerialClient.getInstance();
if(client == null) {
      // 블루투스를 사용할 수 없는 장비일 경우 null.
      Toast.makeText(getApplicationContext(), "블루투스를 사용할 수 없는 기기입니다.", Toast.LENGTH_LONG).show();
}


2. 기기의 블루투스를 사용 가능한 상태로 만들어준다.

  if(!client.isEnabled()) {
	  // 블루투스 사용을 활성화 한다.
	  // 사용자에게 블루투스 사용을 묻는 시스템 창을 출력하게 된다.
	  //블루투스가 사용가능한 상태이면 무시한다.
	  client.enableBluetooth(SampleActivity.this, 
	new BluetoothSerialClient.OnBluetoothEnabledListener() {
		  @Override
		  public void onBluetoothEnabled(boolean success) {
			  // sucess 가 false 일 경우 사용자가 블루투스 사용하기를 희망하지 않음. 
		  }
              });
  }


3. 페어링되었던 블루투스 기기 리스트를 가져거나 검색한다.

final ArrayList<BluetoothDevice> deviceList = new ArrayList<BluetoothDevice>(); // 이미 페어링된 디바이스 리스트를 가져온다. Set<BluetoothDevice> pairedDevices = client.getPairedDevices(); deviceList.addAll(pairedDevices); // 근처 디바이스를 스캔한다. client.scanDevices(this, new BluetoothSerialClient.OnScanListener() { @Override public void onStart() { // 스캔 시작. } @Override public void onFoundDevice(BluetoothDevice bluetoothDevice) { // 스캔이 완료된 디바이스를 받아온다. if(deviceList.contains(bluetoothDevice)) { deviceList.remove(bluetoothDevice); } deviceList.add(bluetoothDevice); } @Override public void onFinish() { // 스캔 종료. } }); // 아래와 같이 스캔 도중에 취소할 수 있다. //client.cancelScan(this)


4. 장비에 직접 연결하고 데이터를 주고 받거나 연결 종료.  

// 블루투스 데이터 통신 이벤트 핸들러.
  // 데이터를 주고 받을 수 있다.
  BluetoothSerialClient.BluetoothStreamingHandler handler 
  			= new BluetoothSerialClient.BluetoothStreamingHandler() {
	@Override
	public void onError(Exception e) {
		// 에러 발생. 연결이 종료된다.
	}

	@Override
	public void onConnected() {
		// 연결 이벤트.
	}

	@Override
	public void onDisconnected() {
		// 연결 종료 이벤트. 
	}

	@Override
	public void onData(byte[] buffer, int length) {
		// 블루투스로부터 데이터 이벤트가 발생. (read)
	} 
  };
  
  // 연결 종료.
  //handler.close();
  
  // 데이터 전송.
  //handler.write("데이터".getBytes())
  
  // 페어링된 디바이스 리스트를 불러오거나 검색을 통하여 가져온 블루투스 객체를 이용하여 
  // 해당 블루투스 장비에 접속한다.
  if(!client.connect(this, device, handler)) {
	 // 블루투스가 사용 가능한 상태가 아니려면 false 리턴. 
	 // enableBluetooth 메소드를 이용하여 블루투스를 on 해줘야 한다.
  }