gpt4 book ai didi

Android BluetoothDevice 读取新数据

转载 作者:行者123 更新时间:2023-11-29 23:49:55 25 4
gpt4 key购买 nike

我是一名 iOS 开发人员,正在构建我的第一个 Android 蓝牙应用程序。在我的应用程序中,我有两个类,一个调用第二个类的主类是我的 BluetoothGattCallback

扫描设备后,我找到了我想要的设备,然后连接到它。这一切都有效。我的蓝牙设备每 5 秒传输一次数据,到目前为止我只能获得第一个 byteArray 传输。这是我在主课中调用的内容。

val gatt = device?.connectGatt(context, true, callBack)

然后在 onConnectionStateChange 中,我检查它是否已建立连接并调用 gatt?.discoverServices()。从那里我可以过滤 onServicesDiscovered 中的 UUID 并调用 gatt.readCharacteristic(characteristic)。我终于能够在 onCharacteristicRead 中读取我的字节数据。我的问题是,在连接设备后每次传输时我错过了哪一步来获取新数据?

奖金问题:我将如何管理多个设备回叫?如果我尝试连接多个设备,我是否需要保留对该设备的回调或 BluetoothGatt 的每个实例的引用?

最佳答案

蓝牙 GATT 要求中心订阅以接收特性更改的“通知”。连接到外围设备后(发现服务后),您需要订阅该特性。当 Android 中心接收到通知(来自外围设备)时,调用 BluetoothGattCallback 的 onCharacteristicChanged 函数(与在 iOS 上不同,在 iOS 上调用 characteristicRead 用于通知和手动请求的读取)。不幸的是,在 Android 上订阅一个特性比在 iOS 上更复杂。在 iOS 上,CBPeripheral 具有 setNotifyValue 函数。 android BluetoothDevice 对象没有这样的功能。我在我的 Android 应用程序中使用此功能,它与 iOS 的 setNotifyValue 功能相同。

/**
* Subscribe to a characteristic to receive notifications when is's value is changed
* @param gattConnection Which gattConnection to subscribe to characteristic on
* @param characteristic The characteristic to subscribe to
* @param subscribe Whether not to subscribe to the characteristic (false to unsubscribe)
*/
fun subscribeToCharacteristic(gattConnection: BluetoothGatt, characteristic: BluetoothGattCharacteristic, subscribe: Boolean = true) {
gattConnection.setCharacteristicNotification(char, subscribe) // Tell the connection we intend to subscribe or unsubscribe
// Now write the correct value to the client characteristic config descriptor
val descriptor = char.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb")) // Client characteristic config UUID
if(descriptor != null){
descriptor.value = if(subscribe) BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE else BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE
gattConnection?.writeDescriptor(descriptor)
}
}

只需使用上述函数订阅onServicesDiscovered中的characteristic即可。

响应处理多个连接:

不需要多个 BluetoothGattCallback。您需要跟踪的只是从 connectGatt 函数返回的 BluetoothGatt 对象。 BluetoothGattCallback 中的每个函数都有一个 BluetoothGatt 对象作为其第一个参数。只需将传递给函数的 BluetoothGatt 对象与从 connectGatt 返回的 BluetoothGatt 对象进行比较,即可确定事件来自哪个连接。

例如:

// This is in the BluetoothGattCallback
override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
if(gatt === gattConnection1){
// This event came from the first connection
}else if(gatt === gattConnection2){
// This event came from the second connection
}
}

关于Android BluetoothDevice 读取新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50974504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com