最近在进行安卓APP的开发,需要通低功耗蓝牙与设备进行交互,刚刚才可以成功交互数据,在这里记录一些遇到的主要的问题。
之前没有蓝牙开发的经验,所以尝试着用传统蓝牙的方式,用过BluetoothSocket与设备连接,总是报 IOException.
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
低功耗蓝牙与传统蓝牙的连接方式不同,低功耗蓝牙是通过BluetoothGatt,以service和characteristic的方式来交互数据的。
使用Gatt时,想要获取service或者characteristic,都是需要先知道与之对应的Uuid,这个就只能与硬件工程师做好沟通。
在与设备交互时,先要对可接受通知的characteristic a进行setCharacteristicNotification,然后对可写的characteristic b写入数据,设备收到b写入了数据,回调onCharacteristicChanged函数,返回characteristic c给APP,c里包含APP请求的数据。
做好这些事情后,向设备的某一个characteristic写数据时,onCharacteristicWrite函数成功的被回调,但是onCharacteristicChanged函数没有被回掉。这说明虽然成功的在b中写入了数据,但设备并没有调用回调函数。解决办法是在setCharacteristicNotification中订阅这个characteristic的所有descriptor。
for(BluetoothGattDescriptor dp:characteristic.getDescriptors()){
dp.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
bluetoothGatt.writeDescriptor(dp);
}