我目前正在开发一个应用程序,需要通过该应用程序在蓝牙按钮(基本上是自拍按钮)和连接的手机之间进行简单的通信。现在,我可以正常与手机连接,并且它确实按预期工作,但是一旦我想通过代码实现这种通信,我就会遇到问题。我发现了设备并且可以通过他们的 mac 地址进行连接。该设备是一个无名品牌,因此没有有关 UUIDS 的文档,但我使用 ble 应用程序来查找我需要的 UUIDS,或者至少是我认为我需要的 UUIDS。这是当设备在设备列表中被“单击”时我当前的代码。我对此很陌生,所以我可能是错的,但我基本上尝试通过写入人机界面 UUID(在按下物理按钮时)来激活通知,这样我以后就可以在按下按钮时收到通知以用于我的应用程序。我正在尝试这个因为到目前为止,仅仅尝试与相应的通知 UUID 进行通信还没有成功。整个设置通知部分尚未起作用。如果有人能够在这里帮助我,那将是一件幸事。提前谢谢小伙子们。
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()
}
}
}
我已经尝试与蓝牙 ble 应用程序绑定到我的按钮设备的基本上每个 UUID 进行通信,但无济于事。所以我最后的希望是通知需要启用才能工作,并且我不会在此过程中监督一些大的事情。
在所有现代操作系统中,蓝牙 HID 和 HID 设备通常由内核本身管理和处理。从这方面来说,你的尝试不会成功。
但是,这也让您更轻松,因为您只需订阅关键事件,然后等待正确的关键代码出现即可。