Android Bluetooth Low Energy(BLE) communication 2

사용 언어: Kotlin 1.6.0
사용 버전: Android Studio 2020.3.1 Patch 3

안드로이드 Bluetooth Low Energy(BLE) communication 2를 알아보겠습니다.


저번 시간에 이어서 계속 진행해 보겠습니다.
우선 기본적인 흐름은 다음과 같습니다.




권한(Permission)을 획득한 다음 BluetoothAdapter를 이용해서 휴대폰의 Bluetooth 기능을 켜는 것입니다. 켜져 있으면 스캔을 시작합니다. BLE 기기를 찾게 되면 GATT server를 이용하여 연결을 합니다. 연결이 다 되면, 데이터를 전송할 수 있게 됩니다.


1 편에서 권한 설정을 다 했으니, 이제 Bluetooth가 켜져 있는지 확인하는 과정을 해보겠습니다.

BluetoothAdapter는 앱에 하나만 존재합니다.





null을 반환하면 휴대폰이 블루투스를 지원하지 않는다는 뜻입니다.

Android 12에서는 아래와 같은 방식으로 Adapter를 불러옵니다.





아래와 같은 방식으로 꺼져있는 블루투스 기능을 켤 수 있습니다.


하지만 위의 방법은 오래된 방법입니다. startActivityForResult가 Deprecated 되었기 때문입니다. 그래서 다른 방식으로 코드를 짜야 합니다.


registerForActivityResult()를 사용합니다.









블루투스 기능을 끄고 실행하면 아래와 같은 화면이 나타납니다.




여기서 잠깐 BLE의 중요한 용어와 개념을 알아보겠습니다. 영어를 제가 번역한 거라 잘못된 내용이 있을 수 있습니다.



- Generic Attribute Profile (GATT)

속성(Attributes)라는 것을 주고받는데 사용됩니다. 모든 BLE application profiles는 GATT 기반입니다.


- Profiles

프로파일은 앱에서 해당 기능을 사용하려면 어떻게 해야 하는지 미리 정의된 사양 같은 겁니다. 프로파일은 여러 개를 만족할 수 있는데, 한 기기가 심박수 측정과 건전지 부족 탐지 등의 프로파일을 만족할 수 있습니다.


- Attribute Protocol (ATT)

GATT는 ATT 가장 위에 자리하고 있습니다. 그래서 GATT/ATT라고도 알려져 있습니다. ATT는 BLE 장치에 사용되도록 만들어졌습니다. 그래서 최대한 작은 바이트를 보냅니다. 각각의 속성은 ID를 위한 128 비트 Universally Unique Identifier(UUID)로 구분됩니다. ATT로 전송되는 속성(attributes)는 characteristic과 service 형식입니다.


- Characteristic

Characteristic은 하나의 문자와 이를 설명하는 0-n 개의 설명자료 구성됩니다. characteristic은 클래스 type이나 analogous로 생각해도 무방합니다.


- Descriptor

Characteristic 값을 설명하기 위한 속성입니다. 사람이 읽을 수 있는 설명이나 사용 가능한 범위 또는 단위 값 등을 나타냅니다.


- Service

서비스는 characteristics의 집합입니다. 예를 들어 심박수 측정기 서비스에 heart rate measurement라는 characteristics가 포함되어 있다면 bluetooth.org에서 GATT-based profiles와 서비스에서 찾을 수 있습니다.



무슨 소린지 모르겠네요... 아무튼 이런 것들로 구성되어 있습니다.

제가 이해한 것을 설명드리자면, Service 안에 Characteristics가 존재하고 이 Characteristic이 통신에 사용되는 값을 저장하고 있는 버퍼 같은 역할을 한다고 이해했습니다.




다시 본론으로 돌아와서 Bletooth 기능을 켰으니 BLE 장비를 찾는 것을 알아보겠습니다.

BLE 장비를 찾기 위해서는 startScan() 함수를 사용합니다. ScanCallback 콜백 함수를 인자로 받습니다. 콜백 함수로 스캔 결괏값을 알 수 있습니다.

스캔은 건전지 소모량이 크기 때문에 두 가지 권장 사항이 있습니다.

1. 원하는 장치를 찾으면 더 이상 스캔을 진행하지 않는 것이 좋습니다.

2. 반복문에 스캔을 넣지 않습니다. 그리고 반드시 스캔 종료 시간을 설정합니다. 연결되었던 장치가 범위를 벗어나면 다시 연결하기 위해 계속 시도하며 건전지를 소비합니다.


실제로 한 번 사용해 보겠습니다.


블루투스 스캔 함수를 따로 만들어줍니다.






저는 Fragment라서 OnCreateView에 setOnClickListener를 정의했습니다.

버튼을 누르면 위에 만든 함수가 실행되도록 만들었습니다.





실행하면 이런 정보들이 로그에 찍히는 것을 볼 수 있습니다.





특정 장치만 찾고 싶을 때에는 ScanFilter를 사용할 수 있습니다.





ScanFilter에는 이러한 것들이 들어갑니다.




서비스 UUID 또는 장치 이름 또는 Mac 주소 또는 서비스 데이터 또는 제조사 데이터가 들어갈 수 있습니다.


필터를 사용해서 찾는 코드를 보여드리겠습니다.





로그를 보면, 하나만 찾아지는 것을 볼 수 있습니다.






이외에도 여러 옵션으로 세팅과 필터를 설정할 수 있습니다. 개발자 문서를 참고해 주세요.






지금까지 BLE 스캔하는 방법을 알아보았습니다.

다음 시간에 계속해서 BLE 통신을 알아보겠습니다.



끝.


카테고리: Android

댓글

이 블로그의 인기 게시물

Python OpenCV 빈 화면 만들기

Python urllib.parse.quote()

Python bytes.fromhex()

Android AVD Ram size change

Forensics .pyc 파일 .py로 복구하기

Android Minimum touch target size

KiCad 시작하기 7 (FreeRoute 사용하기 2)

Android Notification with Full Screen

C++ OpenCV 모폴로지 침식, 팽창

KiCad 시작하기 2 (PCB 만들기)