2016년 10월 3일 월요일

CommBluetooth

아두니티에서 블루투스 통신을 하려면 CommBluetooth를 사용해야 합니다.


CommBluetooth는 Bluetooth SPP 통신을 의미하고 안드로이드에서만 사용할 수 있습니다.
PC에서 블루투스 통신을 할 때는 CommBluetooth가 아닌 CommSerial을 사용해야 합니다. 그 이유는 Windows/Mac에서는 Bluetooth SPP가 시리얼 포트를 통해 이루어지기 때문입니다.
CommBluetooth가 iOS를 지원하지 않는 이유는 Bluetooth SPP의 경우 Apple에 별도 인증을 받은 모듈만 가능하기 때문입니다.
즉, 일반 블루투스 장치를 통해 Bluetooth SPP 통신을 하려면 안드로이드에서만 가능합니다.
CommBluetooth의 Inspector 설정은 다음과 같습니다.
  • searchTimeout: 블루투스 장치 검색 시간
  • OnOpen: 블루투스 장치가 연결되었을 때
  • OnClose: 블루투스 장치 연결이 해제되었을 때
  • OnOpenFailed: 블루투스 장치 연결을 실패했을 때
  • OnErrorClosed: 블루트스 장치 연결이 강제로 해제되었을 때
  • OnStartSearch: 블루투스 장치 검색이 시작되었을 때
  • OnStopSearch: 블루투스 장치 검색이 종료되었을 때
CommBluetooth를 사용하려면 ArdunityApp과 연결되어야 합니다.

유니티 에디터에서는 CommBluetooth를 테스트할 수 없는데, 그 이유는 실제 안드로이드 기기에서만 작동되기 때문입니다.
따라서, 회로 작동 제어를 테스트할 때는 CommSerial을 사용하고 안드로이드 기기에서 테스트할 때만 CommBluetooth를 연결하여 사용할 것을 추천합니다.
유니티 에디터에서 테스트할 때는 각 컴포넌트의 Inspector 메뉴를 사용할 수 있었지만, 빌드가 된 이후에는 오직 GUI로만 테스트해야 합니다.
유니티 에디터에서는 Inspector 메뉴를 이용해 테스트할 수 있다.

유니티 빌드 후에는 GUI가 있어야 테스트할 수 있다.

이 말은 CommBluetooth를 사용하기 위해서는 먼저 유니티 UI로 사용자가 조작할 수 있는 GUI를 만들어줘야 한다는 의미입니다.
아두니티에는 CommBluetooth 테스트를 위해 예제를 제공하고 있습니다.
(ARDUnity/Examples/ConnectionUI/BluetoothConnection)
이 예제를 사용하면 CommBluetooth를 위한 GUI를 쉽게 구현할 수 있습니다.
기본으로 Connect/Quit 버튼이 생깁니다.

블루투스 장치 검색 및 선택을 위한 UI가 있습니다.

이제 남은 것은 유니티에서 안드로이드 빌드를 해서 APK파일을 만드는 것입니다.
유니티에서 안드로이드 빌드 절차는 "유니티 안드로이드 빌드" 글을 참고하시기 바랍니다.
그냥 안드로이드 빌드를 하면 블루투스 장치가 검색되지 않는 문제를 겪게 될 것입니다.
이 문제가 발생하는 이유는 한 가지를 빼먹었기 때문인데, 바로 AndroidManifest.xml을 수정하지 않았기 때문입니다.

모든 안드로이드 앱은 AndroidManifest.xml을 갖고 있으며 이 파일에는 앱 관리 및 실행에 필요한 모든 정보가 기입되어 있습니다.
AndroidManifest.xml 파일의 내용 예

여러분이 이 파일을 직접 작성하는 것이 아니고 Android Studio와 같은 안드로이드 앱 개발 도구가 자동으로 만들어줍니다.
유니티도 마찬가지로 AndroidManifest.xml 파일을 자동으로 만들어주기때문에 여러분들이 신경쓸 필요가 없었습니다.
문제는 유니티가 제공해주지 않는 기능을 사용할 때는 여러분이 직접 AndroidManifest.xml을 수정해야 한다는 것입니다.
블루투스 통신은 유니티가 제공하지 않는 기능입니다. 안드로이드 블루투스와 유니티가 서로 연결되도록 하는 것은 아두니티의 역할입니다.
그러나, 여러분이 만든 앱의 실행 권한은 여러분이 직접 AndroidManifest.xml에 기입해줘야 합니다.
작성할 주 내용은 다음과 같습니다.
  • 본 앱은 블루투스 장치를 사용합니다.
    <uses-permission android:name="android.permission.BLUETOOTH"/>
  • 본 앱은 블루투스 장치 관리자 권한이 필요합니다.
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
  • 본 앱이 실행하는 기기에는 블루투스 장치가 내장되어야 합니다.
    <uses-feature android:name="android.hardware.bluetooth" android:required="true"/>
위와 같은 내용을 AndroidManifest.xml에 삽입해야 블루투스 장치를 검색하고 테스트할 수 있습니다.

아두니티는 이런 번거로움을 최소화하기 위해 미리 수정된 AndroidManifest.xml 파일을 제공합니다. 따라서, 여러분은 이 파일을 사용하면 AndroidManifest.xml파일을 찾거나 수정하는 번거로움없이 블루투스 통신을 성공할 수 있습니다.
먼저, 아두니티 에셋에서 AndroidManifest.xml파일을 찾습니다.
(ARDUnity/Plugins/Android/AndroidManifest.xml)
그 다음으로 Project Window에서 Plugins/Android 폴더를 만듭니다.
이 에셋 폴더를 만드는 이유는 유니티가 수정된 AndroidManifest.xml를 Plugins/Android 폴더에서 찾기 때문입니다.
마지막으로 아두니티 에셋에 있는 AndroidManifest.xml 파일을 복사하여 앞에서 만든 Plugins/Android 폴더에 넣습니다.

이 과정을 마친 다음 다시 유니티에서 안드로이드 빌드를 한 후 스마트 기기에서 앱을 실행하면 블루투스 장치가 검색되는 것을 확인할 수 있습니다.

만약, 다른 에셋이 이미 수정된 AndroidManifest.xml을 사용하고 있어서 아두니티 에셋의 AndroidManifest.xml파일을 복사할 수 없는 경우는 앞에서 언급한 내용을 직접 이미 사용 중인 AndroidManifest.xml에 삽입하면 됩니다.

댓글 4개:

  1. 如果有這篇能有影片輔助教學,我會很感激您的!

    답글삭제
    답글
    1. I would like to ask you a question on the ARDUnity Forum.
      (https://groups.google.com/forum/#!forum/ardunity-forum)

      삭제
  2. 안녕하세요, ARDUnity를 이용해 아두이노와 유니티간 블루투스 통신을 연습하고 있는 학생입니다.
    이 게시글에서 설명해주신 내용이 너무 친절하게 잘 설명되어 있어 차근차근 따라가면서 안드로이드로 애플리케이션을 빌드하고 블루투스 모듈(HC-06)와 연결을 시도하는 부분까지 스스로 할 수 있었습니다. 그런데 어째서인지 블루투스 통신을 시도하면 시도하고 나서 잠시동안 연결되는 듯 HC-06모듈의 불이 계속 들어와 있다가 Connection Failed라는 경고창이 나타납니다. https://groups.google.com/forum/m/#!category-topic/ardunity-forum/6Ogz8DGSruI
    구글 포럼에서 저와 비슷한 문제를 겪은 분이 계시기에 이 URL을 참고해 Android Menifest도 확인해보았으나 언급해주신 3개 코드가 전부 제대로 작성되어 있었습니다. 그래서 혹시 이러한 문제를 해결하실 방법에 대해 알고 계시는지 여쭤보고 싶습니다. 혹시 이 문제에 대한 해결책을 알고 계시나요?
    바쁘실텐데 번거롭게 해 드려 정말 죄송합니다.

    답글삭제
    답글
    1. 방금 스스로 해결했습니다!ㅠㅠ 감사합니다.

      삭제