닫기

산업동향

[Inside AIDC] 아이폰 블루투스 연결 장치 개발과 프로그래밍

  • 등록 2014.11.27 16:11:46
URL복사

아이폰이 초기에 출시했을때 가장 기대를 받았던 시장은 주변장치에 대한 시장이었다. 케이스로 부터 시작해서, 충전기, 장난감 등 각종 주변 장치에 대한 아이디어가 넘처 나왔고 제품이 나오기 시작했었다. 하지만 개발 중 가장 큰 문제는 아이폰과 블루투스의 연결은 MFi라는 애플의 인증을 받아야 한다는 장애가 있었다. 이번 글에서는 블루투스 4.0을 이용해 어떻게 장치간의 연결이 이루어지고 프로그래밍하는지 살펴본다.



아이폰에서 블루투스와 BLE


필자를 비롯한 지인들 역시 이러한 문제 때문에 실제 제품 개발에 있어서 어려움을 겪은 적이 있다. 이때 나온 방법이 잘 아는 것처럼 마이크 잭을 사용하는 형태로 앱세서리 제품들(그림1 참조)이다.
하지만 블루투스 4.0이 나오면서 별다른 인증 없이도 아이폰과 연결할 수 있는 장치를 만들 수 있게 되었다. 현재 수많은 앱세서리 제품들이 출시되고 있으며 그 종류 및 내용은 사실 한계가 없다고 해도 과언이 아니다. 앞으로 기존에 사용하던 많은 장치들이 스마트폰과 연동되는 형태들로 구현될 것이며 그 중심에 블루투스 4.0이 있을 것이다. 아이폰에서 블루투스 4.0 구현 및 기능에 대해 간단히 살펴보면 다음과 같다.

그림1. 블루투스 4.0을 이용한 다양한 앱세서리 제품들


•‌구현 : 앱에서 구현하여 앱 스토어에서 다운로드, 즉 앱에 프로파일에 대한 사항을 구현
•적용 SDK : CoreBluetoothFramework API 이용
•‌API  기능 : 디바이스 탐색, 디바이스 연결, 데이터 전송 기능 제공
•MFi : 적용 받지 않음
•블루투스 4.0 라디오
•블루투스 4.0 코어 소프트웨어
•블루투스 API(CoreBluetoothFramework)
•개발자 개발 부분
•블루투스 프로파일(profile) : 앱에서 구현
•앱 UI 및 실행 코드 구현


그림2. 블루투스 4.0의 소프트웨어 내부 구조



블루투스 4.0을 안드로이드에 적용하면 ▶기존 안드로이드 플랫폼에서는 블루투스 4.0을 정식으로 지원하지 않음(젤리빈 4.3 버전에서 정식 지원) ▶안드로이드 4.3 이전 버전에서는 제조사 별로 블루투스 4.0 지원 ▶삼성이나 모토로라에서는  자사 고유의 블루투스 4.0 스텍 및 API 제공 ▶블루투스 프로파일은 API를 이용하여 개발자가 개발하도록 되어 있다 등의 특징을 보인다.


그림3. 아이폰용 블루투스 4.0 샘플 앱 화면


블루투스 4.0에서 프로파일은 기존의 프로파일과 같이 구현이 어렵지 않다. Bluetooth SIG에 있는 표준  프로파일을 이용하여 앱에서 구현도 가능하고, 개발자가 독자적인 프로파일을 개발하여 제품에 적용도 가능하다.
기존 블루투스를 이용하여 스마트폰과 통신에서 가능 어려운 부분은 스마트폰에서 개발자가 원하는 프로파일을 지원할 때까지 원하는 프로파일의 적용이 어려웠으나 블루투스 4.0은 개발자가 쉽게 적용이 가능하여 Phone 제조사에서 지원할 때까지 기다리지 않고 빠른 적용이 가능하다. 그림 2는 블루투스 4.0의 소프트웨어 내부의 소프트웨어 구조를 간략하게 보여준다. 자세한 내용은 다음에 설명하도록 하겠다.


그림4. 블루투스 4.0 테스트 프로젝트 화면



 아이폰에서 블루투스 4.0 프로그래밍


지금부터 개발할 내용은 아이폰에서 블루투스 4.0을 지원하는 앱을 개발하는 방법에 대해 살펴보도록 하겠다. 우선 본 앱은 블루투스 4.0관련 API를 사용하여 블루투스 장치를 찾고 연결하는 기본적인 프로그램이다.


새로운 프로젝트 생성


그림 4는 블루투스 4.0을 이용한 테스트 프로젝트의 그림이다. 프로젝트를 시작할때 중요한 내용은 CoreBluetooth(그림 5 참조)프레임웍을 포함시키는 것이다. 해당 프레임웍은 블루투스 통신을 위한 대부분의 API가 포함되어 있다.

사용자 인터페이스 구성
이번 예제에서 사용하는 내용은 그림 6과 같다. 프로그램의 설명을 하기 위한 UILabel, 블루투스 4.0 장치를 찾기 위한 버튼 및 찾은 장치와 연결하기 위한 버튼, 두 버튼 모두 UIButton으로 구성한다. 그리고 마지막으로 UITextView를 활용하여 블루투스 장치에 관한 작업을 할때 발생하는 세부 정보를 출력하도록 구성한다.


Outlet 구성


그림5. CoreBluetooth 프레임웍 추가 화면


그림6. 사용자 인터페이스 구성 화면



구성한 UI 컴포넌트의 구성은 그림 7과 같다.connection Button Press 및 scan Button Press는 메소드로써 블루투스 장치에 대한 연결 관리를 하기 위해서 사용된다. UIText View로 구성된 dbg Text는 디버그 정보, 즉 장치에 대한 연결 및 관련 세부 정보를 출력하는데 사용한다.
디버깅 정보는 단순한 디버깅을 위해서라기 보다 아이폰내의 iOS운영체제에서 블루투스 4.0을 어떻게 관리하고 처리하는지에 대해 설명해준다고 보면 좋다.  블루투스 4.0에 대한 세부 내용에 대해 이해하기에는 시간이 걸리고 블루투스에 대한 내부 동작 구조를 이해해야 하기 때문에 전체적인 정보를 파악하는데 필요한 간략한 정보를 확인할 때 사용하면 된다. 블루투스 즉 CoreBluetooth 프레임웍에 대해서는 애플 개발자 문서(https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html)의 내용을 살펴보기 바란다.

그림7. UI 설정 화면
 




▼ BTSAppDelegate.h 의 소스


 
▼ BTSAppDelegate.m의 소스 내용


BTSAppDelegate.m 및 BTSAppDelegate.h 파일은 블루투스 테스트 프로젝트 자동 생성된 파일이며 앱의 기본 동작을 담당한다. BTSViewController.h 는 뷰 콘트롤러 소스로 실제 UI 버튼 및 연결 정보를 처리하는데 사용한다. CBCMCtrl.h및CBCMCtrl.m 파일은 블루투스 연결 관리 클래스로써 coreBluetooth 프레임웍에서 블루투스 연결 관리를 위해 사용하는 centralManager에 대한 동작 및 상태 정보를 관리하는 클래스로 구성되었다.
▼ BTSViewController.h



▼ BTSViewController.m
 


 

scanForPeripheralsWithServices라는 메소드는 특정한 블루투스 장치를 검색할때 사용한다. 하지만 현재 테스트 프로그램에서 찾고자 하는 블루투스 장치나 종류를 지정하지 않고 찾기 때문에 인자를 nil로 설정하고 검색하게 된다. 검색된 장치는 self.peripheral에 저장되어 있다가 connect Peripheral:self.peripheral를 호출하면서 최종 연결 되게 된다.


표. Outlet의 구성

 
▼ CBCMCtrl.h
 
CBCMCtrl.h 파일은 블루트스 연결 관리에 대한 클래스 정의 파일이다. 블루투스 연결에 사용되는 주요 클래스는CBCentralManager 클래스로써 블루투스의 연결 및 장치, 상태 정보를 관리하기 위한 메소드를 가지고 있다.
연결 관리자 초기화
•initWithDelegate:queue:
•initWithDelegate:queue:options:
블루투스 주변 장치에 대한 연결/해제
•connectPeripheral:options:
•cancelPeripheralConnection:
블루투스 주변 장치에 대한 검색 및 정보 획득
•retrieveConnectedPeripheralsWithServices:
•retrieve Peripherals WithIdentifiers:
•‌retrieve Connected Peripherals(iOS 7.0에서는 없어짐)
•retrievePeripherals: (iOS 7.0에서는 없어짐)
블루투스 장치에 대한 검색 및 검색 종료
•scanFor Peripherals With Services:options:
•stopScan
장치 상태 모니터링
•state  프로퍼티
•delegate  프로퍼티
▼ CBCMCtrl.m
 
 



 
아이폰 주의에 블루투스 장치를 가져다 놓고 앱을 시작한다. 그리고 장치 검색 버튼을 누르면 블루투스 장치에 대한 검색이 이루어진다. 검색이 이루어지면 검색된 장치에 대한 세부 정보가 로그로 출력되게 된다.

그림8. 테스트앱에서 블루투스 장치를 검색하는 화면


그림9. 블루투스장치가 연결된 상태의 앱 화면


 
위 로그는 검색된 장치에 대한 세부 정보이다. 여기서 특이하게 봐야하는 것은 UUID다. UUID는Uinique User Identidfier의 약자로써 고유 번호를 의미한다. 블루투스 4.0에서는 이 UUID가 자주 등장하며 장치간의 연결 및 프로파일에 관련된 정보에서도 중요하게 사용된다. 불루투스 장치의 무선 감도를 나타내는 RSSI 정보, 장치의 고유 이름 등의 정보를 이용하여 어떠한 장치인지, 어떠한 기능을 사용할 수 있는지 정보를 아이폰에 전달해 주게 된다.
그림 9는 블루투스 장치가 아이폰에 연결된 후 출력되는 로그 및 화면이다. 현재 아이폰과는 미국 켄싱톤의 블루투스 장치가 연결되어 있으며 연결후에는 연결 정보를 통해 장치에 대한 상태 및 세부 동작을 제어하게 된다. 실제로 블루투스 장치와의 작업은 연결, 필요한 프로파일에 대한 설정, 전달된 정보 처리등을 통해 아이폰과 통신 작업이 이루어지게 된다.
지금까지 아이폰과 블루투스 장치간의 연결에 대해 대략적인 내용을 살펴봤다. 블루투스와의 연결 및 처리는 소스에서 볼 수 있듯이 꽤 간단하게 처리할 수 있다. 핵심적인 내용이 프레임웍 내부에 구성되어 있기 때문이다. 이러한 부분은 내용이 매우 많기 때문에 다음 연재에서 설명하고자 한다.



라영호 대표 (주식회사 테뷸라)






주요파트너/추천기업