블루투스 이용한 통신 | 아이폰 블루투스 연결 장치 개발과 프로그래밍 (1)
아이폰 프로파일 분석 통해 접근하라
아이폰 4S가 처음 출시되었을 때 블루투스 4.0이 처음 탑재가 되었다.
블루투스 4.0이 관심을 받았던 가장 큰 이유는 애플의 MFI 인증칩을 탑재하지 않고도 아이폰과 연결 가능한 하드웨어를 개발할 수 있다는 점이다. 이 글에서는 아이폰의 블루투스 연결 장치와 프로그래밍에 대한 살핀다.
iOS 7에서는 블루투스 4.0을 활용한 마이크로 로케이션 기능인 ‘아이비콘(iBeacon)’은 NFC를 대체할 결제 솔루션의 준비 기반으로서 그 잠재력이 주목 받고 있다(그림 1 참조, http://briefmobile.com). 이로써 아이패드, 패스북, 지문 인식을 통한 터치 ID, 아이애드, 애플 ID와 함께 ‘아이커머스(iCommerce)’를 위한 애플 생태계를 준비하고 있다.
아이비콘의 기술은 기존의 블루투스 4.0의 기술과 크게 다르지 않다. 다시 말해서 블루투스 4.0의 “PROXIMITY”라는 프로파일 기술을 활용해 아이폰과 비콘의 위치를 파악하는 기술이다. 물론 정확히 몇 미터, 몇 센치를 파악하는 것이 아니라 “근접”, “가까지에 있다”, “멀리 있다” 등으로 판단하는 기술이다. 하지만 어떻게 이 기술을 실제 응용에 사용할 것인지는 좀 더 지켜봐야 할 것이다.
아이비콘의 실제 기술의 내용 및 활용에 대한 내용은 추후에 자세히 다루도록 하겠다.
그림1 아이비콘의 동작 예
블루투스 4.0과 변화
그림2 음식물의 상태를 검사하는 앱세서리
아이폰에서 블루투스 4.0의 변화는 단순히 블루투스 버전의 변화만 의미하지는 않는다. 하드웨어 및 소프트웨어적인 변화를 이끌고 있다. 하드웨어적인 측면은 스마트폰과 연동되는 저렴한 장치를 만들 수 있게 되었고 이 장치를 통해 앱세서리(Appcessory)라는 새로운 시장이 형성되었다는 것이다(그림 2, 그림 3 참조).
그림3 각종 환경을 모니터링 하는 앱세서리
그림4 장치별 지원 블루투스 프로파일
아이폰 블루투스 프로그래밍
아이폰 블루투스 프로그래밍은 아이폰에 탑재된 프로파일 분석을 통해 어떠한 식으로 접근해 나가야 하는지 살펴볼 수 있다(그림 4 참조).
■HFP 1.6 = HFP(핸즈프리 프로파일)은 블루투스 헤드셋 및 차량용 핸즈프리 키트를 이용하여 휴대 전화로 통신할 수 있도록 해 준다..
■PBAP = PBAP(전화번호부 액세스 프로파일)은 아이폰과 다른 블루투스 장비 사이에 전화번호를 교환할 수 있도록 해 준다. 차량용 키트와 휴대 전화는 프로파일을 사용해 ▶전화를 건 발신자의 이름을 차량용 키트에 표시 ▶사용자가 차량용 디스플레이에서 전화를 걸 수 있도록 차량용 키트에 전화번호부 동기화 등을 수행한다.
■A2DP = A2DP(고급 오디오 배포 프로파일)은 블루투스 연결을 통해 하나의 장비에서 다른 장비로 고품질 오디오(스테레오 또는 모노)를 스트리밍할 수 있도록 해준다. 이를 사용하여 iOS에서 무선으로 무선 헤드셋 또는 호환되는 카오디오 시스템으로 음악을 재생하도록 한다.
■AVRCP 1.4 = AVRCP 1.4(오디오/비디오 원격 제어 프로파일)은 iOS 장비의 재생 기능을 원격으로 제어하여 호환되는 장비(보통 A2DP 프로파일을 사용하는 블루투스 장비)에서 사용할 수 있도록 해준다. 최신 버전의 iOS는 일시정지, 재생, 중지, 다음 트랙, 이전 트랙, 탐색과 같은 명령을 지원한다.
■PAN 프로파일 = PAN(개인 영역 네트워크) 프로파일은 블루투스를 통한 네트워크 연결을 제공한다. 이는 보통 iOS를 통해 아이폰의 멀티플레이어 게임 및 개인용 핫스팟에서 사용된다.
■HID 프로파일 = HID(휴먼 인터페이스 장비) 프로파일은 iOS와 블루투스 키보드 간에 서로 통신할 수 있도록 해 준다.
■MAP = MAP(메시지 액세스 프로파일은 장비에서 메시지를 교환할 수 있도록 해 준다. 이는 대부분 자동 핸즈프리용으로 사용된다.
그림5 GameKit 프레임워크
블루투스 프로그램 만들기
블루투스의 특징을 이용해 Xcode 상에서 블루투스 프로그램을 만드는 방법을 알아본다.
GameKit
아이폰으로 블루투스 프로그램을 하려면 여러 가지 프레임워크 중에서 GameKit이라는 것을 사용해야 한다. 이름에 Game Kit라는 단어가 들어가 있어서 게임과 관련된 것이라고 생각할 수 있는데, 사실상 네트워크와 인터넷과 관련된 여러 가지 기능들을 모아둔 프레임워크라고 생각하면 된다(그림 5 참조).
블루투스는 기기간의 통신이기 때문에 다소 내용을 이해하기가 복잡하다. 따라서 아이폰 블루투스를 이해하는 첫번째 시간이기 때문에 GameKit를 사용하여 어떻게 프로그래밍 하는지 먼저 살펴 보도록 하겠다. GameKit는 블루투스를 사용한 1대1(peer-to-peer) 통신방법중의 하나이다. 그림6은 GKSession 기반으로 어떻게 장치 간의 통신이 이루어지는지 보여준다.
먼저 뷰기반 프로젝트를 하나 만들고 프로젝트의 이름은 블루투스로 지정한다. currentSession은 GameKit 기반의 통신 세션을 관리하는 변수이며, 수신 및 전송할 메시지를 관리하는 UITextField 기반 txtMessage, 연결과 해제를 위한 버튼으로 구성되어 있다.
그림6 GKSession 기반 블루투스 통신
그림7 블루투스 연결 프로그램의 UI 구성
메시지 전송, 블루투스 연결, 블루투스 해제를 위한 메소드인 btnSend, btnConnect, btnDisconnect로 구성되어 있다(그림 7, 그림 8 참조).
그림8 UI 연결
#import
인터페이스 빌더에서 각각의 오브젝트들과 해당 함수 등을 연결한다.
BluetoothViewController.m에 뷰가 로드 될 때, 메모리 해제될 때의 처리 루틴을 추가한다.
각각의 오브젝트들에 대해 synthesize 코드를 작성한다. @synthesize는 @property로 지정한 각각의 오브젝트와 반드시 쌍으로 작성돼야 한다
BluetoothViewController.h에는 GKPeer Picker Controller의 객체인 picker를 선언한다. GKPeer Picker Controller는 GameKit를 통하여 연결된 다른 블루투스 장치를 선택할 수 있게 하는 표준 사용자 인터페이스다.
Connect버튼을 눌렀을 때 처리하는 btnConnect 메소드의 내용이다. GKPeerPickerController를 할당 및 초기화하고 연결 버튼 및 연결 해제 버튼의 상태를 변경한다. 그리고 나서 블루투스 장치 목록을 보여줄 사용자 인터페이스를 보여주게 된다. 이때 연결할 장치를 선택하게 된다.
여기서 picker. delegate를 자신으로 설정한다. 그리고 연결시 picker의 연결 타입을 결정한다. GKPeer Picker Connection Type Online 또는 GKPeer Picker Connection Type Nearby로 설정한다. GKPeer Picker Connection Type Online 타입은 인터넷 연결이 된 상태의 네트워크 상황에서의 타입을 지정한 것이며, GKPeer Picker Connection Type Nearb타입은 블루투스 타입으로 주변에 있는 장치와 연결하는 방식을 말한다.
연결할 블루투스 장치가 근처에 있고, GKPeer Picker Controller를 통하여 연결할 장치의 이름을 선택하여 장치간의 연결이 될 때 peerPickerController:didConnectPeer:toSession: 메소드가 호출되게 된다. 이떄 연결된 세션 및 핸들에 대한 정보를 저장하고 연결 작업을 처리하게 된다.
사용자가 연결작업을 취소했을때는 GKPeerPicker Controller에 대한 할당을 해제하고 버튼의 상태를 변경한다.
사용자가 연결 해제 버튼을 눌렀을때는 연결된 모든 세션을 해제하고, 세션 정보를 nil로 처리한다. 마찬가지로 버튼의 상태는 연결 버튼은 활성화, 연결 해제 버튼은 비활성화를 setHidden의 속성을 사용하여 제어한다.
블루투스 장치간의 연결과 해제시 호출되는 메소드인 session:peer:didChangeState:는 다음과 같이 구성된다.
mySendDataToPeers 함수는 NSData 형태의 data를 현재 연결된 세션인 currentSession을 통하여 다른 연결된 블루투스 장치로 보내는 역할을 담당한다. 속성으로는 모든 장치로 데이터를 전달하도록 하는 sendDataToAllPeers라는 것과 데이터를 보낼 때 모드를 지정하는 withDataMode라는 것이 있다.
보내는 값으로 GKSend Data Reliable, GKSend Data Unreliable이 있는데, 빠른 속도가 필요한 전달 모드에서는 전자를 사용하고, 좀 느려도 정확한 전달을 원할 때는 후자를 사용한다.
메시지 전송 버튼을 눌렸을 때 처리하는 btnSend 메소드. txtMessage의 NSString 형태의 데이터를 NSData 형태로 변환, mySendDataToPeers 메소드를 사용해 전송한다.
블루투스를 통해 수신된 메소드는 receiveData:fromPeer:inSession:context:를 통해 수신 받게 된다. 수신 받은 데이터는 UIAlertView를 통하여 표시한다.
동작 테스트
그림9는 GKPeerPickerController를 통하여 주변에 있는 연결 가능한 장치를 표시하고 연결해주는 것을 설명하고 있다. 장치가 주변에 있으면 목록이 나타나게 되고, 해당 장치의 이름을 선택하게 되어 장치 간 연결하게 된다(그림 10 참조).
그림9 주변에 있는 블루투스 장치 검색 그림
그림10 블루투스 장치 확인 그림
그림11 다른 장치로부터 데이터 수신 확인 그림
그림11은 다른 장치에서 전송된 데이터를 UIAlertView를 통해 전송받은 데이터를 표시하고 있다.
지금까지 GameKit를 사용하여 아이폰에서 블루투스 연결하는 방법에 대해 살펴봤다. 다음호에서는 블루투스 4.0을 이용하여 어떻게 장치 간의 연결이 이루어지고 프로그래밍하는지에 대해 살펴보도록 하겠다.
라영호 대표 (주식회사 테뷸라)
Copyright ⓒ 첨단 & Hellot.net