Android BluetoothDevice读取新数据

时间:2018-06-21 17:33:09

标签: android bluetooth kotlin bluetooth-gatt

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

扫描设备后,找到所需的设备,然后连接到它。所有这一切。我的蓝牙设备每5秒钟传输一次数据,到目前为止,我只能进行第一次byteArray传输。这是我在主班上所说的。

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

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

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

1 个答案:

答案 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
    }
}