Android Make a Bluetooth Low Energy(BLE) GATT server 1

사용 언어: Kotlin 1.6.10
사용 버전: Android Studio 2020.3.1 Patch 4

안드로이드 Make a Bluetooth Low Energy(BLE) GATT server 1을 알아보겠습니다.


안드로이드로 BLE Server를 만들 일은 별로 없습니다. 보통 IoT 장비들이 Server 역할을 하니까요. 그렇지만 누군가는 필요할 수 있으니 만드는 법을 알아보겠습니다.
참고로 저는 실험 용으로 만들었기 때문에 이 코드는 버그가 존재합니다. 그냥 대략적인 틀만 보시길 추천드립니다.


먼저 권한을 설정해 줍니다.
서버는 이 정도 권한만 있으면 됩니다.
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BLUETOOTH_CONNECT
android.permission.BLUETOOTH_ADVERTISE



위의 권한은 Runtime permission이 아니기 때문에 사용자에게 확인받을 필요가 없습니다.


코드로 옵니다. bluetoothManager와 bluetoothAdapter를 만듭니다.



저는 2 개의 Service를 만들어보았습니다.

Service 변수를 정의해 줍니다.





아래에 BluetoothGattService() 함수를 사용해서 Service를 만들어줍니다.

UUID는 Service가 사용할 UUID를 넣고 싶은 대로 넣어주시면 됩니다.

타입은 BluetoothGattService.SERVICE_TYPE_PRIMARY로 설정해 줍니다.








각 서비스에 들어갈 Characteristic을 만들어 봅시다.

servicePrimary에 들어갈 read와 write를 만들어줍니다.






read 값에는 초깃값을 설정해 줍니다.






그리고 descriptor가 필요하면 만들어줍니다.

BluetoothGattDescriptor()로 만듭니다.

UUID와 Descriptor의 Permission이 들어갑니다.






저는 기존에 있는 UUID를 사용했습니다. 0x2902는 Client Characteristic Configuration 용으로 사용됩니다.





이렇게 만든 descriptor를 characteristic에 넣어줍니다.

addDescriptor()를 사용합니다.






그다음에 service에 characteristic을 넣어줍니다.

addCharacteristic()을 사용합니다.






이와 같은 방식으로 serviceSecondary에도 characteristic을 넣어줍니다.






service 2 개를 만들었습니다. 이제는 advertise라는 자기 자신을 알리는 걸 해볼 겁니다. 이걸 해야지 상대방 기기가 이 BLE Server를 검색할 수 있습니다.


BluetoothLeAdvertiser를 정의합니다.






advertiser는 bluetoothAdapter.bluetoothLeAdvertiser로 정의합니다.





startAdvertising()으로 자기 자신을 다른 기기에 알리는데, 여기 필요한 게 AdvertiseSettings, AdvertiseData, AdvertiseCallback() 함수가 필요합니다.


AdvertiseSettings에는 AdvertiseMode와 Timeout을 설정할 수 있으며, Timeout에 0을 넣으면 계속 알리고 있는 상태가 됩니다.





AdvertiseSettings에서 모드를 정할 수 있습니다. 여기 사용된 ADVERTISE_MODE_LOW_POWER는 에너지 소비를 최소화한 방식입니다.


구글 문서를 보면 아래와 같이 여러 모드가 존재함을 알 수 있습니다.







데이터는 아래와 같이 만듭니다.

ServiceUuid는 자신을 알릴 때 어떤 UUID로 알릴 건지를 정하는 겁니다. 스캔하는 쪽에서 해당 UUID를 알면 이 Service  UUID로 필터를 설정하여 해당 server만 보이게 할 수 있습니다.

IncludeDeviceName은 이름을 보이게 할 건지, IncludeTxPowerLevel은 Tx의 세기를 나타낼 것인지를 설정합니다.





AdvertiseCallback 변수를 만들어 줍니다.





callback 함수는 아래와 같이 만들며, 여기서는 비웠는데 원한다면 자기 자신을 알리는 게 성공했는지 실패했는지 onStartSuccess 함수와 onStartFailure 함수 Callback을 통해 알 수 있습니다.





이제 startAdvertising에 필요한 정보를 다 만들었으니 이제 자신을 알려봅니다.






앱이 비활성화될 때 자신을 알리는 행위를 그만두려면 다음과 같이 onStop에 설정합니다.

stopAdvertising()을 사용합니다.





자신을 알리는 것까지 해보았습니다.

다음 시간에 이어서 Android GATT Server 만들기를 하겠습니다.



끝.


카테고리: Android

댓글

이 블로그의 인기 게시물

Python urllib.parse.quote()

Python OpenCV 빈 화면 만들기

tensorflow tf.random.uniform()

Android Notification with Full Screen

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

Android Minimum touch target size

Python bs4.SoupStrainer()

KiCad 시작하기 4 (기존 회로도 수정 및 추가)

음악 총보(Score), 파트보(Part)

tensorflow tf.expand_dims()