본문으로 건너뛰기

안드로이드 블루투스 연결 데모 분석

무료2015-03-16#Android#Solution#蓝牙联机#BluetoothChat

최근 친구와 함께 모바일 게임을 만들며 2인 대전 부분을 설계하던 중, 블루투스를 이용해 연결하기로 계획하고 공식 데모와 관련 자료를 찾아 분석했습니다. 이해한 내용을 바탕으로 상세한 주석을 달았으며, 관련 리소스를 다운로드할 수 있습니다.

들어가며:

모바일 게임의 2인 대전 구현 방식은 다음과 같이 여러 가지가 있습니다.

  • 온라인 대전 (클라이언트 요청을 전달할 서버가 필요하며, 다양한 대형 모바일 게임에서 사용하는 방식)
  • 분할 화면 대전 (휴대폰 화면을 상하로 나누어 플레이하며, Fruit Ninja의 2인 대전이 대표적인 예)
  • 블루투스 연결 대전 (블루투스를 통해 연결하며, 삼국Kill 연결 버전이 대표적인 예)

먼저, 온라인 대전은 고려하지 않았고(비용이 높고 서버가 비쌈...), 분할 화면 대전은 제약이 너무 큽니다(두 명이 휴대폰 하나로 플레이하는 것은 매우 불편함).

따라서 블루투스 연결 대전은 저비용으로 구현 가능한 좋은 선택입니다(삼국Kill이 가장 좋은 예이며, 적어도 실현 가능하다는 것을 증명했습니다).

1. 리소스 수집

"안드로이드 개발 블루투스 연결"을 검색하여 많은 유용한 정보를 찾았고, 선별 결과 대부분의 정보가 BluetoothChat과 관련되어 있음을 발견했습니다. BluetoothChat은 공식 데모이므로 분석하기 수월했습니다.

먼저 소스 코드를 내려받고, 선배 개발자의 소스 코드 분석 자료도 찾아 수고를 덜었습니다. 간단히 정리한 리소스는 다음과 같습니다. (앞의 두 개는 인터넷에서 찾은 것이고, 뒤의 두 개는 새로 만든 것입니다.)

2. 데모 테스트

데모를 가져와서 사용 가능한지 먼저 확인했습니다.

  1. 이클립스(Eclipse)에 임포트하니 빨간 X 표시가 떴으나, AndroidManifest.xml의 SDK 버전을 수정하니 사라졌습니다.
  2. 휴대폰을 연결해 설치 및 실행했으나 비정상 종료되었습니다. 로그를 확인하니 'you can not combine custom titles with other title'라는 오류 메시지가 있었습니다.
  3. 최종적으로 리소스 파일을 수정하여 이 문제를 해결했습니다. 상세 내용 및 해결 방법은 다음과 같습니다.
  4. 테스트 성공, 실제 기기에서 채팅이 잘 작동합니다.

데모 사용 중 발생할 수 있는 문제:

  • 'you can not combine custom titles with other title' 오류의 원인과 해결 방법은?
원인: xml에 정의된 activity의 테마(theme)와 코드에 정의된 테마가 일치하지 않아 타이틀 스타일 충돌이 발생함.
해결 방법: xml의 해당 activity 테마를 @android:style/Theme으로 변경함.
주의: xml의 activity에 theme 태그가 없다면 추가하고 위 값을 설정해야 함.

실제 기기 실행 화면은 다음과 같습니다.

3. 블루투스 연결 과정

  1. 블루투스 관련 권한 선언 (권한에 대한 상세 내용은 선배의 분석 자료를 참고하세요.)
  2. 본체 블루투스 어댑터 획득 (BluetoothAdapter는 시스템이 제공하는 블루투스 인터페이스이며, 어댑터를 통해 본체 블루투스를 조작합니다.)
  3. 연결 가능한 외부 블루투스 기기 스캔 (블루투스 모듈이 반환하는 브로드캐스트 메시지를 수신하여 외부 기기 정보를 얻습니다.)
  4. 외부 기기의 MAC 주소 획득
  5. MAC 주소를 통해 소켓(Socket) 연결 생성 (소켓 연결만 되면 이후 작업은 일반적인 소켓 채팅 프로그램과 다르지 않습니다.)
  6. 소켓 연결을 통한 메시지 송수신

간단히 말해, 연결 과정은 위 단계들로 요약됩니다. 필자는 소스 코드를 이해하고 분석한 뒤(선배의 분석 자료 참고), 읽기 쉬운 주석을 보충했습니다. 예:

4. 요약

소스 코드 분석은 시간과 노력이 많이 드는 일이지만, 시간이 허락한다면 그만한 가치가 충분히 있습니다. 단순히 복사해서 수정하는 것보다 훨씬 낫습니다. 다른 사람의 코드를 분석하는 과정에서 다음과 같은 것들을 얻을 수 있습니다.

  • 구현 원리 (단순한 코드 블록의 기능을 넘어, 기능을 구현하기 위해 각 컴포넌트가 어떻게 분담되고 상호작용하는지 이해)
  • 코딩 규약 (메서드, 클래스, 레이어를 왜 나누었는지에 대한 이해)
  • 코딩 스타일 (변수, 메서드, 클래스, 패키지 명명 규칙, 들여쓰기 스타일 등)
  • 팁/상식 (출시 전 디버깅 정보를 삭제하는 번거로움을 피하기 위해, 플래그 변수를 정의해 디버깅 단계임을 표시하고 디버깅 코드를 if 문으로 감싸서 출시 전 플래그만 false로 바꾸는 방식 등)

댓글

아직 댓글이 없습니다

댓글 작성