본문 바로가기
아두이노

앱인벤터와 BLE(Bluetooth Low Energy) 기기 연결하기

by 이지이지(EGEasy) 2023. 1. 31.

BLE 기기 연결 예

 

 

안녕하세요. 이지이지입니다.

이번 포스팅에서는 앱인벤터와 BLE(Bluetooth Low Energy / Bluetooth LE)기기를 연결하는 방법에 대해 알아보도록 하겠습니다.

 

Bluetooth와 BLE의 차이에 대해서는 관련 문서가 많으니 검색을 통해 알아보시기 바랍니다.

 

앱인벤터에서는 기본으로 제공되는  BluetoothClient 컴포넌트로 BLE 기기와 연결할 수 없습니다.

저도 처음에는 BLE기기와 연결하는 데 많은 애를 먹었는데, 이해를 하고나면 그리 어렵지도 않은 것 같습니다.

차근차근 이지가 알려주는대로 따라해보세요.

 

참고.) 본 포스팅은 앱인벤터와 코코아팹의 오렌지보드 BLE를 연결한 예입니다.

 

 

    사전 준비하기

 

앱인벤터와 BLE 기기를 연결하기 위해서는 Service UUIDCharacteristic UUID를 알아내어야 합니다.

Service UUID와 Characteristic UUID는 기기마다 다른데요.

이를 알아내기 위해 BLE UUID Explorer앱을 사용합니다.

 

BLE UUID Explorer는 다음 링크를 통해 플레이스토어에서 내려받도록 합니다.

 

 

BLE UUID Explorer - Google Play 앱

블루투스 로우 에너지 UUID를 탐색

play.google.com

 

1. BLE UUID Explorer을 실행시키고 상단의 [SCAN]버튼을 눌러 장치를 검색합니다.

[SCAN] 버튼을 클릭하면 장치가 검색되고 버튼이 [STOP]로 바뀌게 됩니다.

 

2. 연결하기를 원하는 장치가 목록에 나타나면 그 장치를 클릭하여 연결합니다.

 

디바이스 scan하기

 

2. 장치와 연결이 되면 하위항목 중 [Nodric UART Service]를 선택하고 하위 항목들을 확인합니다.

 

UUID 확인하기

 

Service UUID로 앱인벤터에서 기기와 연결할 때 필요한 정보입니다.

6e400001~~~ 부분이 필요합니다.

Characteristic UUID로 Properties 부분을 보면 WriteNoResponse라고 되어있습니다. 이는 앱에서 장치에 어떤 메시지를 전달하지만, 장치는 메시지를 전달만 받고 전달을 잘 받았는지 등 어떠한 반응도 앱에 전달하지는 않습니다.

6e400002~~~ 부분이 필요합니다.

Characteristic UUID로 Properties 부분을 보면 Notify라고 되어있습니다. 이는 장치가 앱에 메시지를 전달할때 사용됩니다. 예를들어, 적외선 장치로 도난경보 시스템을 만들었다면 침입감지가 되었을 때, 장치가 앱에 경고를 알릴 수 있습니다.

6e400003~~~ 부분이 필요합니다.

 

"ble read, write, notify" 등으로 검색해보시면 더 자세하고 많은 정보를 얻을 수 있습니다.

 

이것으로 앱인벤터와 디바이스를 연결하기 위한 사전준비는 끝입니다.

 

 

    화면구성

 

먼저 소스코드를 첨부해드리니 내려받아 참고하시기 바랍니다.

 

EG_BLE.aia
0.19MB

 

 

※ 앱인벤터에서 BLE 기기와 통신하기 위해서는 휴대폰의 "위치사용서비스"와 "블루투스"를 반드시 사용할 수 있도록 설정해두어야 합니다.

 

다음은 앱인벤터 화면구성입니다.

화면구성에 특별한 점은 없고, 아래 Non-visible components의 사용 이유를 알려드립니다.

 

화면구성

 

1. BluetoothLE1: BLE 기기와 연결하기 위한 확장프로그램입니다. [Connectivity] 팔레트 안에 있는 BluetoothClient나 BluetoothServer컴포넌트가 아니라 직접 내려받아 [Extensions]에 추가해주셔야 합니다.

첨부된 소스에는 이미 확장프로그램으로 추가되어 있으나 다른 프로젝트에서 사용하기 위해서 또는 더 자세한 내용을 알아보기 위해서는 다음 링크로 들어가시면 됩니다.

 

 

MIT App Inventor + Internet of Things

 

iot.appinventor.mit.edu

 

2. Notifier1: 사용자에게 BLE기기와 연결 또는 해제되었다는 알림을 주기위한 컴포넌트입니다.

 

3. LocationSensor1: 사용자의 휴대폰에 위치사용서비스가 사용할 수 있도록 설정되어 있는지 확인하기 위해 추가한 컴포넌트입니다.

 

4. ActivityStarter1: 사용자의 휴대폰에 위치기반서비스 또는 블루투스가 활성화되어 있지 않을 때, 이를 활성화시키도록 설정화면에 진입할 수 있도록 추가한 컴포넌트입니다.

 

5. BloothClient1: 앱인벤터에서 기본으로 제공하는 블루투스 컴포넌트로 블루투스가 활성화되어 있는지를 체크하기 위한 컴포넌트입니다.

 

이상 화면구성에 대한 설명이었고, 상세한 부분은 첨부해드린 소스코드를 참고하시기 바랍니다.

 

 

    블록코딩

 

다음은 BLE 기기와 연결하기 위한 전체 블록코딩입니다.

조금 많긴 하지만, 실제 앱에서 기기로 데이터를 보내고 받는 예까지 포함하여 조금 더 길어졌습니다.

 

※ 서두에 언급한 것 처럼 본 포스팅은 코코아팹사의 오렌지보드(스마트홈에 사용된 보드)와 연결하는 예입니다. 다른 기기로는 테스트해보실 수 없으며, 본 포스팅을 참고하여 기기에 맞게 내용을 수정하셔서 테스트해보셔야 합니다.

 

전체 블록코딩

 

 

이제 요소별로 하나씩 설명드리도록 하겠습니다.

 

 


 

다음은 앱이 처음 시작되었을 때 실행되는 블록입니다.

 

앱이 처음 시작되었을 때 실행되는 블록

 

① 사용자 휴대폰에 블루투스기능이 활성화되어 있다면

 

② 만약 위치정보서비스의 서비스제공자에 "gps" 또는 "network"가 포함되어 있다면,

→ 보통 휴대폰에 위치기반 서비스는 gps나 network를 사용합니다. 이것이 서비스제공자에 포함이 되어있다면 사용자의 휴대폰의 위치정보서비스가 활성화되어 있는 것입니다.

 

③ 연결할 수 있는 주변의 BLE 기기를 찾습니다.

 

④ (②이 아니라면) ActivityStarter1의 Action을 위치정보 서비스 설정창으로 들어가도록 설정하고, ActivityStarter를 시작합니다.

 

⑤ (① 이 아니라면) ActivityStarter1의 Action을 블루투스 사용요청 알림을 뜨게 하도록 설정하고, ActivityStarter를 시작합니다.

 

⑥ (③의 scan을 통해 ble 기기가 발견되었을 때 실행되는 블록으로) [연결하기] 리스트피커 버튼을 사용가능하게 설정합니다.

→ 화면구성(디자이너창)에서 리스트피커 버튼을 비활성화 해두었습니다.

 

⑦ [연결하기]버튼을 클릭했을 때 나타나는 기기의 목록을 BluetoothLE1 컴포넌트를 통해 scan된 기기의 목록으로 설정합니다.

 

 


 

다음은 [연결하기] 리스트피커 버튼을 클릭하고, 연결할 기기를 선택한 후 실행되는 블록과 이때 사용된 변수 블록입니다.

 

기기 선택 후 실행되는 블록과 변수

 

① 기기의 MAC주소를 저장해둘 변수로 일단 공백으로 설정합니다.

 

② (연결할 기기를 선택한 후에 실행되는 블록으로) 변수 deviceAddress의 값을 리스트피커에서 선택한 기기의 텍스트의 1번째 문자에서 17번째까자의 문자로 설정합니다. 

 

③ 앱인벤터와 기기를 기기의 MAC 주소를 통해 연력합니다.

 

※ [연결하기] 버튼을 클릭했을 때, 다음과 같은 목록이 나타날 것이고, MAC주소는 콜론(:)을 포함하여 17자로 구성되어 있어 위와 같은 블록을 사용한 것입니다.

 

MAC address

 

 


 

다음은 앱인벤터와 기기가 연결된 직후 실행되는 블록과 이때 사용되는 변수입니다.

 

기기연결 후 실행되는 블록

 

 

① 변수 serviceUuid를 연결할 장치의 serviceUuid로 설정합니다.

→ 사전 준비에서 BLE UUID Explorer로 알아두었던 내용입니다.

 

② 변수 characteristicUuidWrite를 연결할 장치의 속성이 Write~로 되어 있는 부분의 uuid로 설정합니다.

→ 사전 준비에서 BLE UUID Explorer로 알아두었던 내용으로 앱인벤터에서 기기로 메시지를 전송할 때 사용됩니다.

 

③ 변수 characteristicUuidNotify를 연결할 장치의 속성이 Notify로 되어 있는 부분의 uuid로 설정합니다.

→ 사전 준비에서 BLE UUID Explorer로 알아두었던 내용으로 기기에서 앱인벤터로 메시지를 전송할 때 사용됩니다.

 

④ 앱인벤터와 기기가 연결이 되었을 때 아래 블록을 실행합니다.

 

⑤ 알림을 통해 사용자에게 앱인벤터와 기기가 연결되었다는 것을 알려줍니다.

 

⑥ [연결하기] 리스트피커 버튼의 배경색을 회색빛이 나도록 설정하여, 이미 연결이 되어있으니 비활성화되어 있다는 느낌이 들도록 합니다.

 

⑦ [연결하기] 리스트피커를 비활성화합니다.

 

⑧ [연결끊기] 버튼의 배경색을 노란계열로 바꾸어 활성화되어 있다는 느낌을 주도록 합니다.

→ 화면구성(디자이너창)에서 비활성화시켜 두었습니다.

 

⑨ [연결끊기] 버튼을 활성화합니다.

 

⑩ 기기에서 앱인벤터로 문자열 메시지를 전송할 때, 앱인벤터에서 받아들일 수 있도록 이에 맞는 uuid를 등록해두는 것입니다. 이때, utf16을 false로 설정하면, utf8인코딩으로 문자를 출력하게 됩니다.

※ utf8, utf16에 대해서 제가 정확히 이해를 못해 설명을 드릴 수 없습니다. 테스트 결과 utf8로 설정이 되어야 제대로 된 결과를 얻을 수 있어 false로 설정하게 되었습니다.

 

 


 

다음은 [연결끊기] 버튼을 클릭하여 앱인벤터와 기기가 연결이 해제되었을 때 실행되는 블록으로, 앞의 내용과 거의 겹치는 부분이 있어 따로 설명은 하지 않겠습니다.

 

연결을 끊었을 때 실행되는 블록

 

 


 

앱인벤터와 BLE 기기의 연결은 위에서 모두 알아보았습니다.

지금부터는 앱인벤터와 기기 사이에 메시지를 주고 받는 방법에 대해 간략히 보여드리겠습니다.

 

※ BLE기기에도 앱인벤터와 매칭되도록 코딩이 되어 있어야 합니다. 단순히 아무 기기와 테스트해볼 수 없으며, 사용방법에 대해서만 알려드리고자 함을 유의하시기 바랍니다.

 

기기와 메시지 주고받기

 

① [전송하기] 버튼을 클릭했을 때, SendMessage 프로시저를 호출하고, 이 때 매개변수 message에는 사용자가 텍스트상자에 입력한 텍스트로 설정합니다.

→ 앱(인벤터)에서 기기로 메시지를 보낼 상황이 많이 있어 프로시저로 구성해두고, 그때그때 message만 달리하여 사용하기 위해서입니다.

→ 스마트홈을 예로 들어보자면, 앱에서 기기에 airconOn이라는 메시지를 보내면 에어컨이 켜지고, TVOn이라는 메시지를 보내면 TV가 켜지도록 하는 것입니다.

 

② 앱인벤터에서 기기로 메시지를 보낼 때 사용할 SendMessage 프로시저로, characteristicUuid와 utf16설정에 유의하시기 바랍니다. 

 

③ BLE 기기에서 앱(인벤터)이 메시지를 받았을 때 실행되는 블록입니다.

→ 실제로 저의 아두이노 스마트홈의 경우에는 적외선센서로 도난방지시스템을 구현해보았고, 도난방지 경고를 기기로부터 받았을 때, 핸드폰에서 경고음이 울리도록 설정해두었습니다. 위의 예는 그저 기기로부터 받은 메시지를 그대로 표시하도록 해둔것입니다.

 

 


 

이상 앱인벤터와 BLE 기기를 연결하는 방법에 대해 알아보았습니다.

저처럼 헤매는 분이 없도록 도움이 됐으면 좋겠네요 ^^

댓글