Android Bluetooth Low Energy(BLE) communication 5

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

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


저번 시간에 이어서 계속 진행해 보겠습니다.
저번 시간에는 읽고 쓰기까지 해봤습니다.
이번에는 notification을 사용하여 데이터가 변경될 때 자동으로 읽도록 해보겠습니다.


notification은 데이터가 변경되었을 때, 서버(보통 IoT 장비)에서 클라이언트(보통 Android 휴대폰)으로 보내주는 신호라고 생각하면 됩니다.
notification은 보통 descriptor UUID 0x2902에 설정을 해줘야 합니다.
0x2902는 Client Characteristic Configuration이라고 하네요.








우리가 연결하는 서버에서 Descriptor를 찾아봅시다.


이전 시간에 만들었던, Service와 Characteristic을 보는 코드에서 descriptor를 찾는 316 줄을 추가해 줍니다.







만약 어느 descriptor를 사용해야 하는지 안다면 이렇게 찾아볼 필요는 없습니다.

우리는 모른다는 가정하에 진행하고 있습니다.



Service 0xfd31 밑에 Characteristic 00001111-0002-1000-8000-786ab22f6579 밑에 Descriptor 0x2902가 있네요.









Notification을 위한 버튼을 하나 만들어줍니다.

위에서 찾은 구조와 UUID를 활용하여 notify를 위한 Descriptor를 getDescriptor()를 사용하여 가져옵니다.









이 notify Descriptor에 value를 BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE로 설정합니다.

여기서는 다루지 않겠지만, notification을 취소하고 싶다면 DISABLE_NOTIFICATION_VALUE를 보내면 됩니다.

writeDescriptor()를 사용해서 서버에 Descriptor 정보를 보냅니다.

이제 서버에 이 휴대폰이 notify 목록에 등록이 되고, Characteristic에 변화가 있으면 변화가 되었다는 신호를 받게 됩니다.








변화가 되었다는 신호는 여기서 처리합니다.

bluetoothGattCallback에서 onCharacteristicChanged를 override 해줍니다.

서버에서 Notification 신호가 발생하면 위의 함수가 작동됩니다.

위의 함수가 작동되게 하기 위해서는 한 가지 작업을 더 해줘야 합니다.








다시 notification 버튼으로 돌아와서 notification을 적용할 Characteristic을 더 추가해 줍니다.

이전 게시글에서 본 Properties에 따르면 Notify 할 Characteristic이 두 개이기 때문이죠.








그다음, 해당 characteristic이 onCharacteristicChanged와 연동되게 하는 코드가 필요합니다.

setCharacteristicNotification()을 해줍니다.





자, 한 번 실행해 보겠습니다.





원래 안녕, 친구야가 있었는데 푸른을 보내니 별로 변경되었다는 신호를 받았습니다. 따뜻한을 사람으로 변했다는 신호를 받았습니다. 다시 읽어보니 별과 사람으로 변경되었습니다.

이번 시간에는 Notification을 활용하여 변경된 사실을 자동으로 알 수 있는 방법을 알아보았습니다.


지금까지 Android BLE GATT Client를 알아보았습니다.

다음 시간에는 Android로 BLE 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()