Android BluetoothDevice 读取新数据
Android BluetoothDevice reading new data
我是一名 iOS 开发人员,正在构建我的第一个 Android 蓝牙应用程序。在我的应用程序中,我有两个 classes,一个主 class 调用第二个是我的 BluetoothGattCallback
.
扫描设备后,我找到了我想要的设备,然后连接到它。这一切都有效。我的蓝牙设备每 5 秒传输一次数据,到目前为止我只能获得第一个 byteArray 传输。这是我在 main class.
中调用的内容
val gatt = device?.connectGatt(context, true, callBack)
然后在 onConnectionStateChange
中,我检查它是否已建立连接并调用 gatt?.discoverServices()
。从那里我可以过滤 onServicesDiscovered
中的 UUID 并调用 gatt.readCharacteristic(characteristic)
。我终于可以在 onCharacteristicRead
中读取我的字节数据了。我的问题是,在连接设备后每次传输时我错过了哪一步来获取新数据?
附加问题:我将如何管理多个设备回叫?如果我尝试连接多个设备,我是否需要保留对该设备的回调或 BluetoothGatt 的每个实例的引用?
蓝牙 GATT 要求中心订阅以接收 "notifications" 特性更改。连接到外围设备后(发现服务后),您需要订阅该特性。当 Android 中心接收到通知(来自外围设备)时,会调用 BluetoothGattCallback 的 onCharacteristicChanged
函数(与 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
}
}
我是一名 iOS 开发人员,正在构建我的第一个 Android 蓝牙应用程序。在我的应用程序中,我有两个 classes,一个主 class 调用第二个是我的 BluetoothGattCallback
.
扫描设备后,我找到了我想要的设备,然后连接到它。这一切都有效。我的蓝牙设备每 5 秒传输一次数据,到目前为止我只能获得第一个 byteArray 传输。这是我在 main class.
中调用的内容val gatt = device?.connectGatt(context, true, callBack)
然后在 onConnectionStateChange
中,我检查它是否已建立连接并调用 gatt?.discoverServices()
。从那里我可以过滤 onServicesDiscovered
中的 UUID 并调用 gatt.readCharacteristic(characteristic)
。我终于可以在 onCharacteristicRead
中读取我的字节数据了。我的问题是,在连接设备后每次传输时我错过了哪一步来获取新数据?
附加问题:我将如何管理多个设备回叫?如果我尝试连接多个设备,我是否需要保留对该设备的回调或 BluetoothGatt 的每个实例的引用?
蓝牙 GATT 要求中心订阅以接收 "notifications" 特性更改。连接到外围设备后(发现服务后),您需要订阅该特性。当 Android 中心接收到通知(来自外围设备)时,会调用 BluetoothGattCallback 的 onCharacteristicChanged
函数(与 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
}
}