我是一名iOS开发人员,正在构建我的第一个Android蓝牙应用程序。在我的应用中,我有两个类,一个主类调用第二个类,即我的BluetoothGattCallback
。
扫描设备后,找到所需的设备,然后连接到它。所有这一切。我的蓝牙设备每5秒钟传输一次数据,到目前为止,我只能进行第一次byteArray传输。这是我在主班上所说的。
val gatt = device?.connectGatt(context, true, callBack)
然后在onConnectionStateChange
中检查是否已建立连接并致电gatt?.discoverServices()
。从那里,我可以过滤onServicesDiscovered
中的UUID并调用gatt.readCharacteristic(characteristic)
。我终于可以在onCharacteristicRead
中读取字节数据了。我的问题是,连接设备后,每次传输时我都错过了哪一步来获取新数据?
奖金问题:如何管理多个设备回叫?如果尝试连接多个设备,是否需要对该设备的回调或BluetoothGatt的每个实例进行引用?
答案 0 :(得分:1)
蓝牙GATT要求中央机构订阅以接收特征更改的“通知”。连接到外围设备后(发现服务后),您需要订阅该特征。当Android中心从外围设备收到通知时,将调用BluetoothGattCallback的onCharacteristicChanged
函数(与在iOS上,通知和手动请求的读取均调用特征读取的iOS不同)。不幸的是,在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)
}
}
只需使用以上功能即可订阅characteristic
中的onServicesDiscovered
。
响应于处理多个连接:
不需要多个BluetoothGattCallback
。您只需跟踪从BluetoothGatt
函数返回的connectGatt
对象。 BluetoothGattCallback中的每个函数都有一个BluetoothGatt
对象作为其第一个参数。只需将传递给函数的BluetoothGatt
对象与BluetoothGatt
返回的connectGatt
对象进行比较,即可确定事件来自哪个连接。
例如:
// 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
}
}