<div>업무하면서 찾았던 자료들을 정리하는 중입니다.</div> <div>머리속에 알고 있는 내용인데도 글로 쓰려니 오래 걸리네요...</div> <div>실제로 개발했던 코드는 군용 S/W라 코드를 가지고 나올 수 없어서 머리속에 있는 것만 가지고 군과 관련없는 기술적인 내용만 정리하려니 더 오래 걸리는 것 같습니다. ㅠㅠ</div> <div><br></div> <div>이 글은 제 Github Page에 올린 내용을 복사한 것입니다.</div> <div><a target="_blank" href="http://regentag.github.io/android/2015/05/15/android-usb-communication-1/">http://regentag.github.io/android/2015/05/15/android-usb-communication-1/</a></div> <div><br></div> <div><br></div> <div><br></div> <div><header class="post-header" style="margin-bottom:30px;color:#111111;font-family:'맑은 고딕', sans-serif;font-size:16px;line-height:24px;background-color:#fdfdfd;"><h1 class="post-title" style="margin:0px 0px 15px;padding:0px;font-weight:300;font-size:42px;letter-spacing:-1px;line-height:1;">안드로이드와 PC간의 USB 통신 (1)</h1> <p class="post-meta" style="margin:0px 0px 15px;padding:0px;font-size:14px;color:#828282;">May 15, 2015</p></header><article class="post-content" style="margin-bottom:30px;color:#111111;font-family:'맑은 고딕', sans-serif;font-size:16px;line-height:24px;background-color:#fdfdfd;"><h1 style="margin:0px 0px 15px;padding:0px;font-weight:300;">시작하기 전에</h1> <p style="margin:0px 0px 15px;padding:0px;">안드로이드를 운영체제로 사용하는 모바일 기기들은 대부분 와이파이를 비롯한 무선 인터넷을 통하여 다른 시스템과 통신을 하는 것이 일반적입니다. 하지만 기술적 또는 절차적 제한으로 인하여 무선 인터넷을 사용할 수 없는 환경은 아직도 존재하고, 그러한 환경에서 모바일 기기 내부의 자료를 갱신해야 할 필요성도 있습니다.</p> <p style="margin:0px 0px 15px;padding:0px;">USB 하드웨어를 만드는 업체가 아닌 이상 대부분의 경우에는 이런 상황을 고려하지 않으므로 인터넷에서 관련 자료를 찾기가 쉽지 않습니다. 안드로이드와 PC의 USB 통신을 구글에 검색하면 대부분 ADB를 사용하여 소켓 통신을 하라고 말합니다. 하지만 일반 사용자에게 ADB를 써야하니 안드로이드 SDK를 설치하라고 하는것은 올바른 해결책이 아니겠죠.</p> <p style="margin:0px 0px 15px;padding:0px;">이 글의 내용은 대한민국 공군에서 모 체계를 개발하면서 안드로이드 기기와 PC간의 USB 통신이 필요했고 그것을 해결하면서 얻은 자료를 정리한 것입니다.</p> <h1 style="margin:0px 0px 15px;padding:0px;font-weight:300;">안드로이드의 USB통신</h1> <p style="margin:0px 0px 15px;padding:0px;">USB로 연결된 두 장치는 전원을 공급하고 각 장치들을 열거하는 호스트와 호스트에 연결되어 작동하는 주변기기(Accessory)로 구분됩니다.</p> <p style="margin:0px 0px 15px;padding:0px;">안드로이드는 USB 통신을 위해 두 가지 모드를 제공하고 있습니다.<img src="http://regentag.github.io/static/android-usb/usb-host-accessory.png" alt="Android USB Host & Accessory" style="vertical-align:middle;"></p> <ul style="margin:0px 0px 15px 30px;padding:0px;"><li> <p style="margin:0px 0px 15px;padding:0px;">Host mode : 안드로이드 기기가 USB 호스트가 되어 장치에 전원을 공급하는 모드입니다. 이 모드를 사용하려면 안드로이드 기기가 OTG를 지원해야 하고 OTG 케이블이 별도로 필요합니다.</p></li> <li> <p style="margin:0px 0px 15px;padding:0px;">Accessory mode : 안드로이드 기기가 주변기기가 되고 연결되는 USB 장치가 호스트가 되는 모드입니다. 여기서는 Accessory mode로 호스트인 PC에 연결되도록 구현할 것입니다.</p></li></ul><p style="margin:0px 0px 15px;padding:0px;">안드로이드에서 USB를 왜 이렇게 관리하는지에 대한 자세한 내용은 <a target="_blank" href="https://developer.android.com/guide/topics/connectivity/usb/index.html" style="color:#1756a9;text-decoration:none;" target="_blank">안드로이드 개발자 홈페이지</a>를 참고하시기 바랍니다.</p> <h1 style="margin:0px 0px 15px;padding:0px;font-weight:300;">USB 통신을 위한 준비</h1> <h4 style="margin:0px 0px 15px;padding:0px;font-weight:300;font-size:20px;">안드로이드</h4> <p style="margin:0px 0px 15px;padding:0px;">안드로이드에는 Accessory mode에서 USB 통신을 위한 기능들이 이미 모두 준비되어 있습니다.</p> <h4 style="margin:0px 0px 15px;padding:0px;font-weight:300;font-size:20px;">PC</h4> <p style="margin:0px 0px 15px;padding:0px;">USB 드라이버가 필요합니다. 범용 USB 드라이버 중 하나인 <a target="_blank" href="http://www.libusb.org/" style="color:#1756a9;text-decoration:none;" target="_blank"><code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">libusb</code></a>의 윈도용 포팅인 <a target="_blank" href="http://sourceforge.net/p/libusb-win32/wiki/Home/" style="color:#1756a9;text-decoration:none;" target="_blank"><code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">libusb-win32</code></a>를 사용할 것입니다. Unix-like 환경이라면 libusb를 사용해도 무방합니다.</p> <p style="margin:0px 0px 15px;padding:0px;"><a target="_blank" href="http://sourceforge.net/projects/libusb-win32/files/libusb-win32-releases/" style="color:#1756a9;text-decoration:none;" target="_blank">다운로드 페이지</a>에서 최신 버전을 내려받습니다.</p> <p style="margin:0px 0px 15px;padding:0px;">코드는 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">libusb</code>의 Java wrapper인 <a target="_blank" href="http://libusbjava.sourceforge.net/wp/" style="color:#1756a9;text-decoration:none;" target="_blank"><code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">libusbjava</code></a>를 사용하여 자바로 작성할 것입니다. <a target="_blank" href="http://sourceforge.net/projects/libusbjava/files/" style="color:#1756a9;text-decoration:none;" target="_blank">다운로드 페이지</a>에서 최신 버전의 JAR 파일과 DLL을 내려받습니다.</p> <h1 style="margin:0px 0px 15px;padding:0px;font-weight:300;">드라이버 설정</h1> <h4 style="margin:0px 0px 15px;padding:0px;font-weight:300;font-size:20px;">하드웨어 ID와 장치 클래스 확인</h4> <p style="margin:0px 0px 15px;padding:0px;">모든 USB 장치는 제조사 ID(VID; Vendor ID)와 제품 ID(PID; Product ID)를 가지고 있습니다. 이 두개의 값으로 장치의 종류(기종)를 구분할 수 있습니다.</p> <p style="margin:0px 0px 15px;padding:0px;">장치 클래스는 비슷한 기능을 제공하는 USB 장치들을 하나로 묶어 드라이버를 제공하기 위한 범주입니다. 덕분에 마우스와 키보드 같은 장치들은 제조사가 모두 다르더라도 운영체제에서 제공하는 드라이버로 사용이 가능합니다.</p> <p style="margin:0px 0px 15px;padding:0px;">안드로이드 기기를 USB 케이블로 PC에 연결한 후 장치관리자를 실행하면 <strong>휴대용 장치</strong>의 하위에 기기가 나타나 있을 것입니다.</p> <p style="margin:0px 0px 15px;padding:0px;"><img src="http://regentag.github.io/static/android-usb/01-device-list.png" alt="장치관리자" style="vertical-align:middle;"></p> <p style="margin:0px 0px 15px;padding:0px;">장치의 속성에서 <strong>자세히</strong> 탭을 선택하면 하드웨어 ID와 장치 클래스를 확인할 수 있습니다.</p> <p style="margin:0px 0px 15px;padding:0px;"><img src="http://regentag.github.io/static/android-usb/02-hardware-id.png" alt="하드웨어 ID" style="vertical-align:middle;"></p> <p style="margin:0px 0px 15px;padding:0px;"><img src="http://regentag.github.io/static/android-usb/03-device-class.png" alt="장치 클래스" style="vertical-align:middle;"></p> <p style="margin:0px 0px 15px;padding:0px;">이 안드로이드 기기의 VID와 PID는 각각 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">0x1004</code>와 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">0x61F9</code>이며 장치 클래스는 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">WPD</code>임을 알 수 있습니다.</p> <p style="margin:0px 0px 15px;padding:0px;"><code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">0x1004</code>는 LG전자의 제조사 ID입니다. 다른 회사의 제품이라면 해당 제조사의 ID가 보여집니다.<code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">0x61F9</code>는 LG전자의 안드로이드 기기들의 제품 ID입니다. 다른 모델의 제품이라도 LG전자의 안드로이드 기기는 모두 같은 PID 값을 가질 것입니다.</p> <p style="margin:0px 0px 15px;padding:0px;"><code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">WPD</code>는 MTP 장치의 장치 클래스입니다.</p> <h4 style="margin:0px 0px 15px;padding:0px;font-weight:300;font-size:20px;">필터 드라이버 설치</h4> <p style="margin:0px 0px 15px;padding:0px;">내려받은 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">libusb-win32</code>의 파일을 적당한 위치에 압축을 풀어줍니다. <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">bin</code> 디렉터리의 하위에 CPU 아키텍처별로 나누어진 디렉터리가 있습니다. 자신의 PC CPU 아키텍처에 맞는 디렉터리의 파일들을 사용합니다.</p> <ul style="margin:0px 0px 15px 30px;padding:0px;"><li><code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">install-filter.exe</code> : 필터 드라이버를 설치/제거하는 CUI 프로그램입니다.</li> <li><code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">install-filter-win.exe</code> : 필터 드라이버를 설치/제거하는 GUI 프로그램입니다.</li> <li><code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">libusb0.sys</code> : USB 드라이버 파일입니다.</li> <li><code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">libusb0.dll</code> : USB 드라이버의 기능들을 호출하기 위한 라이브러리 DLL입니다.</li></ul><p style="margin:0px 0px 15px;padding:0px;">먼저 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">libusb0.sys</code> 파일을 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">C:\Windows\System32\drivers</code> 디렉터리에 복사합니다.</p> <p style="margin:0px 0px 15px;padding:0px;">그 다음 필터 드라이버 설치를 위해 명령 프롬프트를 <strong>관리자 권한</strong>으로 실행합니다. 다음 명령으로 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">WPD</code>장치 클래스에 필터 드라이버를 설치합니다.</p> <div class="highlight" style="margin-bottom:15px;background:#ffffff;"><pre style="margin-top:0px;margin-bottom:15px;padding:8px 12px;font-size:15px;border:1px solid rgb(232,232,232);background-color:#eeeeff;"><code class="language-text" style="border:0px;padding:1px 0px;">$ install-filter install --class=WPD </code></pre></div> <p style="margin:0px 0px 15px;padding:0px;">설치가 완료되면 안드로이드 기기의 USB 케이블을 뽑았다가 다시 연결해 주세요. 그런 다음<code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">testlibusb</code> 명령을 사용해 필터 드라이버가 올바르게 설치되었는지 검사합니다. 올바르게 설치되었다면 다음과 같이 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">Dev #1</code>항목이 출력되어야 합니다.</p> <div class="highlight" style="margin-bottom:15px;background:#ffffff;"><pre style="margin-top:0px;margin-bottom:15px;padding:8px 12px;font-size:15px;border:1px solid rgb(232,232,232);background-color:#eeeeff;"><code class="language-text" style="border:0px;padding:1px 0px;">$ testlibusb.exe Dev #0: 0000 - 0000 Dev #1: LG Electronics Inc. - MTP </code></pre></div> <p style="margin:0px 0px 15px;padding:0px;"><code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">testlibusb-win.exe</code>를 사용해 GUI 화면으로 확인할 수도 있습니다. <img src="http://regentag.github.io/static/android-usb/04-filter-driver-test.png" alt="Filter Driver Test" style="vertical-align:middle;"></p> <p style="margin:0px 0px 15px;padding:0px;">GUI 화면에는 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">DLL version</code>과 <code style="font-size:15px;border:1px solid rgb(232,232,232);padding:1px 5px;background-color:#eeeeff;">Driver version</code> 및 장치의 상세 정보가 출력되어야 합니다.</p> <hr style="margin:0px;padding:0px;"><p style="margin:0px 0px 15px;padding:0px;">다음 글에서 안드로이드 기기를 Accessory mode로 진입시키고 이것을 감지하여 USB 통신을 처리할 안드로이드 앱을 실행시키는 법에 대하여 설명하도록 하겠습니다.</p></article></div> <div><br></div> <div><br></div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.