Код: Выделить всё
package com.example.androidcounterapp
import android.annotation.SuppressLint
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothGattDescriptor
import android.content.ContentValues.TAG
import android.content.Context
import android.util.Log
import com.polidea.rxandroidble3.RxBleClient
import com.polidea.rxandroidble3.RxBleDevice
import io.reactivex.rxjava3.disposables.Disposable
import java.util.UUID
class BluetoothConnection {
val serviceUuidUUID = UUID.fromString("00001812-0000-1000-8000-00805f9b34fb")
val characteristicUUID = UUID.fromString("00002a4d-0000-1000-8000-00805f9b34fb")
val cccdUUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb")
inner class ConnectThread(
private val context: Context,
private val macAddress: String,
private val bluetoothAdapter: BluetoothAdapter
) : Thread() {
private val rxBleClient: RxBleClient by lazy(LazyThreadSafetyMode.NONE) {
RxBleClient.create(context)
}
private var connectionDisposable: Disposable? = null
@SuppressLint("MissingPermission")
private fun connectAndSetupNotification(
device: RxBleDevice,
characteristicUUID: UUID,
cccdUUID: UUID,
) {
Log.i(TAG, "Entered connectAndSetupNotification")
connectionDisposable = device.establishConnection(false)
.flatMap { rxBleConnection ->
Log.i(TAG, "GATT connection established")
rxBleConnection.setupNotification(characteristicUUID)
.flatMap { notificationObservable ->
val enableNotificationValue = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
val descriptor = BluetoothGattDescriptor(
cccdUUID,
BluetoothGattDescriptor.PERMISSION_WRITE
).apply {
value = enableNotificationValue
}
rxBleConnection.writeDescriptor(descriptor, enableNotificationValue)
.andThen(notificationObservable)
}
}
.subscribe(
{ notificationData ->
Log.i(TAG, "Notification data: ${notificationData.joinToString(", ")}")
val readableValue = CharacteristicConverter.convert(notificationData)
Log.i(TAG, "Readable value: $readableValue")
},
{ throwable ->
Log.e(TAG, "Error occurred while setting up notification", throwable)
}
)
}
@SuppressLint("MissingPermission")
override fun run() {
bluetoothAdapter.cancelDiscovery()
Log.i(TAG, "Trying to connect")
val device = rxBleClient.getBleDevice(macAddress)
connectAndSetupNotification(device, characteristicUUID, cccdUUID)
}
fun cancel() {
connectionDisposable?.dispose()
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... etooth-ble