[Android ADK] Android Open Accessory Development Kit_2
알 수 없는 사용자
2011. 11. 29. 16:17
안녕하세요. 광주멤버십 20-2기 유성기입니다.
오랜만에 다시 쓰게 되었네요. 기존의 혼자 하던 방식에서 사람들을 모아서 함께 공부하는 것도 좋은 것 같아서 모으다 보니 많이 늦어졌던 것 같습니다.
저번에는 Android ADK에 대해서 간단한 설명과 어떻게 쓰이고 있는지에 대한 동영상을 보았었습니다.
이전에도 말씀 드렸듯이 구글에서는 주변장치들을 USB를 통하여 안드로이드 플랫폼에서 손쉽게 사용할 수 있도록 규격을 정해놓았습니다. 그렇지 않은 경우에는 ADK를 사용해 구현할 수 있도록 하였습니다.
이번에는 ADK에 대해서 좀 더 자세히 설명하고자 합니다.
Open Accessory Development Kit(이하 ADK)의 가장 기본적인 목적은 안드로이드 플랫폼에서 사용하는 USB 포트와 연결하여 자신이 지정한 동작을 수행하도록 하는 것입니다. 안드로이드는 호환성의 문제가 발생하지 않도록 PC와 연결할 때 표준으로 사용하는 USB 포트를 이용해 해결했습니다. 평상 시에는 PC와 연결하여 동기화나 충전, 때로는 대용량 저장장치로서 다양하게 쓰이고 있으며, USB 포트를 통하여 Accessory와의 연결을 할 수 있게끔 아두이노 플랫폼이 USB Host 역할을 하고 있습니다.
Android USB mode
안드로이드는 USB Accessory 모드와 USB Host 모드를 통하여 USB 주변 기기 및 Android USB Accessory (안드로이드 액세서리 프로토콜로 구현되어있는 하드웨어)를 지원하고 있습니다.
Figure 1. USB Host and Accessory Modes
그림에서 보듯이 Android device는 USB Host 모드와 Accessory 모드(USB Device)를 가질 수 있지만, Android device가 USB Host Mode가 되기 위해서는 몇 가지 제약 조건을 가지게 됩니다.
-H/W에서의 USB host 지원
-Android 3.1 이상에서 USB Host 관련 API 제공
위의 제약 조건 외에도 여러 가지 이유가 있겠지만 Accessory 모드는 USB Device로 동작한다는 것만 알아두시면 되겠습니다.
USB Accessory 모드는 USB Host에서 외부 USB 하드웨어로 역할을 합니다. 그 예로는 도킹 스테이션, 음악장비, 키오스크, 카드 리더기, 로봇 컨트롤러가 될 수 있습니다. USB Accessory 모드는 안드로이드 구동 장치와 함께 작동하도록 설계해야 하며 안드로이드 액세서리 통신 프로토콜(Android accessory communication protocol)을 준수해야 합니다.
USB Host 모드는 안드로이드 장치에서 사용하며 PC와 같이 USB 장치로 연결되어 관리 및 동작하는 USB Host 장치가 있는 상태에서 Accessory USB 디바이스 형태로 연결되게 됩니다. 그 예로는 디지털 카메라, 키보드, 마우스 및 게임 컨트롤러가 되겠습니다.
안드로이드 플랫폼을 탑재한 장치에서 USB Host를 탑재하거나 ADK와 연결되어 동작하는 Accessory 모드일 때 사용하는 프로토콜과 관련 API가 제공됩니다.
Android USB API
우선 USB Accessory 모드 API의 경우, 네임스페이스는 com.android.future.usb와 android.hardware.usb입니다.
USB Accessory API 사용 시 매니페스트 파일에 추가되어야 할 예입니다. 여기서android.hardware.usb.action.USB_ACCESSORY_ATTACHED를 사용해 원하는 USB 장치가 연결되었을 시, 동작해야 할 메인 Activity를 지정하게 됩니다.
다음은 Res/xml/accessory_filter.xml 파일에 저장되는 내용입니다.
여기에서는 Accessory가 Android Device에 연결되었을 때 Accessory를 구별할 수 있는 ID String을 Android Device에 전송하게 됩니다. 해당 모델 제조 업체 및 버전을 가진 Accessory를 resource에 추가하면 됩니다.
Android Device에 USB accessory가 연결되었을 때, Application이 연결된 Accessory를 지원하는지 확인하고 지원하면 Accessory와의 통신을 설정한다.
1.Accessory attach event를 위한 intent filter를 사용해서 Accessory 연결 확인
2.Accessory와의 통신을 하기 위한 permission 요청
3.Interface endpoint를 통해서 Accessory와 Data를 read, write
USB Host 모드 API의 경우에는 USB Host 장치를 탑재한 안드로이드 장치에서 사용하는 클래스로 PC와 같이USB 장치로 연결되어 관리 및 동작하는 USB Host 장치가 있는 상태에서 Accessory가 USB 디바이스 형태로 연결될 때 이를 관리하기 위해 지원되는 클래스들입니다.