需要帮助了解如何通过 UUID 与简单的蓝牙 Ble 按钮成功通信

问题描述 投票:0回答:1

我目前正在开发一个应用程序,需要通过该应用程序在蓝牙按钮(基本上是自拍按钮)和连接的手机之间进行简单的通信。现在,我可以正常与手机连接,并且它确实按预期工作,但是一旦我想通过代码实现这种通信,我就会遇到问题。我发现了设备并且可以通过他们的 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 进行通信,但无济于事。所以我最后的希望是通知需要启用才能工作,并且我不会在此过程中监督一些大的事情。

android kotlin bluetooth bluetooth-lowenergy communication
1个回答
0
投票

在所有现代操作系统中,蓝牙 HID 和 HID 设备通常由内核本身管理和处理。从这方面来说,你的尝试不会成功。

但是,这也让您更轻松,因为您只需订阅关键事件,然后等待正确的关键代码出现即可。

© www.soinside.com 2019 - 2024. All rights reserved.