안드로이드 시리얼 통신_USB_COM_PROT
- Coding/Android
- 2019. 4. 30.
1. 개요
프로젝트 진행 도중 안드로이드 환경의 개발보드에서 기타 하드웨어와의 USB시리얼 통신이 필요하게 되었습니다.
현제 안드로이드 환경에서의 프로젝트 진행중 su 권한 설정과 관련해 많은 어려움을 겪고 있던 도중이라
어플리케이션 자체에서 su 권한 없이 USB시리얼 통신이 가능한 예제가 필요하였습니다.
구글에서 시리얼 통신에 관하여 여러가지 예제를 검색하여 동작이 잘 되는 예제 2가지를 발견,
저와 같은 문제를 겪고 있으신 분들을 위하여 포스팅을 하게 되었습니다.
2. 시리얼 통신??
간단히 말해 시리얼 통신은 직렬 통신입니다.
하나의 기기가 다른 기기와 데이터 통신을 하기 위하여 한 개 이상의 테이터 통신선이 필요한 통신이며,
동기 시리얼 통신과 비동기 시리얼 통신으로 나뉩니다.
저는 이 프로젝트에서 USB 단자를 통하여 안드로이드 환경의 기기와 기타 기기와의 통신에
시리얼 통신을 테스트 하였습니다.
이 포스팅에서 사용하는 USB시리얼 통신의 기본 규격은 RS-232C이며 기타 규격에 대해서는
테스트를 진행해 보지 못했습니다.
3. 예제 1
제가 생각하는 좋은 예제 사이트 2곳을 올려드립니다.
모두 예제 모두 NDK환경이 아닌 JAVA를 이용하여 USB시리얼 통신을 하는 예제이고,
루팅이 필요 없는 예제입니다.
https://ittravelkr.tistory.com/16
제가 찾아본 여러 가지 RS-232C 시리얼 통신 예제 중에 가장 간단하고 직관적이라고 생각합니다.
다만 시리얼 통신의 통신 빈도수나 통신 데이터의 길이가 길 경우 Thread를 사용하기 때문인지(?)
UsbReceiver Class의 CUT_SIZE 맴버변수와 Thread.sleep의 시간을
잘 조정해 주어야 원하는 결과를 얻을 수 있습니다.
제가 아직 미숙해서 추가적으로 테스트해볼 예정입니다.
라이센스의 경우 아파치 라이센스 2.0입니다.
4. 예제 2
두 번째 예제입니다.
이 예제의 경우 안드로이드와 아두이노의 시리얼 통신을 연결하는 예제인데
xml/device_filter.xml을 살펴보면 아두이노와의 통신만을 위한 프로젝트는 아닌 듯합니다.
https://github.com/godstale/Arduino-Serial-Controller
예제 1과의 차이점은 일정 시간(기본 1000ms)마다 연결 가능한 디바이스 리스트를 불러옵니다.
예제 1의 경우 디바이스 리스트를 따로 불러 올 수가 없어서
여러 개의 USB디바이스가 연결되어 시리얼 통신을 하는 상황이라면
위의 예제의 DeviceListActivity를 참고하시면 될 듯합니다.
예제 2에서 아두이노와의 연결은 아래 블로그를 참고하시면 도움이 될 듯합니다.
http://www.hardcopyworld.com/ngine/aduino/index.php/archives/241
5. USB시리얼 통신 디바이스 접근 권한에 대하여
안드로이드에서도 리눅스와 마찬가지로 장치 관련 파일을 /dev 폴더에서 확인이 가능합니다.
adb shell을 통하여 안드로이드에 접근하여 su 권한을 얻고 /dev 폴더에 들어가면
연결된 디바이스의 정보를 확인이 가능합니다.
(저의 경우 디바이스를 연결할 경우 ttyUSB0로 확인이 됩니다.)
안드로이드 환경에서 USB시리얼 통신을 하기 위해서 사용한 위의 예제 모두
안드로이드의 UsbManager를 사용합니다. 이를 위해선 권한 설정이 필요한데,
이를 위해 AndroidManifest.xml에 권한 추가가 필요합니다.
어디에 권한을 추가해야 하는지 헷가리실까봐 권한에 관하여 예제를 하나 덧붙입니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sh.Thisproject">
<uses-feature android:name="android.hardware.usb.host" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
</application>
</manifest>
6. ETC
저도 공부하며 정리하는 중이라 새로운 사항이 추가되면 포스팅을 업데이트하겠습니다.
많이 부족한 내용이라 지적사항이나 질문 사항 있으시면 댓글로 문의하시면 감사하겠습니다.
X. 참고 사이트
http://www.nctechnology.co.kr/product-sogae/serial-basic.htm
https://ittravelkr.tistory.com/16
https://javaexpert.tistory.com/430
http://www.androidside.com/bbs/board.php?bo_table=B49&wr_id=169492
https://gigglehd.com/gg/bbs/3352702
http://www.hardcopyworld.com/ngine/aduino/index.php/archives/241
'Coding > Android' 카테고리의 다른 글
안드로이드 Java 난수 발생 시키기_Random Number (0) | 2020.03.22 |
---|---|
안드로이드 HttpURLConnection을 이용한 CCTV CGI control (0) | 2019.05.11 |
안드로이드 init.rc와 ifconfig를 통한 부팅시 고정 아이피 설정 (0) | 2019.05.07 |
안드로이드 부팅 후 앱 자동실행_AndroidStudio (3) | 2019.05.04 |
안드로이드 CMakeList.txt 를 이용한 FFMPEG 라이브러리 적용법 (2) | 2019.04.18 |