搞定Android Bluetooth Low Energy-04

蓝牙读写

蓝牙连接成功之后,可以对services进行读写。由于services是存在蓝牙设备中的,需要调用discoverServices()来发现蓝牙服务。
读写数据主要一下几种,读写和扫描一样都是异步的。

  • writeCharacteristic()
  • writeDescriptor()
  • setCharacteristicNotification()
  • readCharacteristic()
  • readDescriptor()
  • readRemoteRssi()
BluetoothGatt.java
//通过characteristic,把value写给蓝牙设备
characteristic.setValue(byte[] value)
public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic)

BluetoothGattCallback.java
//写完回调方法
public void onCharacteristicWrite (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)


//BluetoothGattDescriptor 和 BluetoothGattCharacteristic操作类似,只是不同类型,descriptor一般属于某个characteristic。
BluetoothGatt.java
//通过descriptor,把value写给蓝牙设备
descriptor.setValue(byte[] value)
public boolean writeDescriptor (BluetoothGattDescriptor descriptor)

BluetoothGattCallback.java
//写完回调方法
public void onDescriptorWrite (BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status)



//开启notification相对麻烦点
//开启notifications需要两步, 首页本地开启监听, 然后远程蓝牙设备也要开启。
private static void enableMagnetometerNotifications(BluetoothGatt bluetoothGatt) {
    BluetoothGattService service = bluetoothGatt.getService(uuid1);
    BluetoothGattCharacteristic c = service.getCharacteristic(uuid2);
    bluetoothGatt.setCharacteristicNotification(c, true); //本地开启

    BluetoothGattDescriptor config = c.getDescriptor(uuid3);
    config.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
    bluetoothGatt.writeDescriptor(config); //远程开启
}

BluetoothGattCallback.java
//notification回调方法
public void onCharacteristicChanged (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)

Services、Characteristics、Descriptors之间的关系

gatt_ccc

  1. BluetoothGatt.discoverServices()发现蓝牙所有服务
  2. BluetoothGatt.getService (UUID uuid) 获取到具体服务
  3. BluetoothGattService.getCharacteristic (UUID uuid) 获取到具体Characteristic
  4. BluetoothGattCharacteristic.getDescriptor (UUID uuid)获取到具体Descriptor

开发建议

  1. 有些手机服务会缓存,再特殊情况蓝牙服务会改变的情况下,需要强制refresh。
  2. 神奇的129(0x81)错误码:Android Issue 156730
  3. 写数据不要并发,最好做个消息队列,写完成了再写下一个:133(0x85)错误码。
  4. BLE默认可以发送最大20字节
  5. Android-4-3-bluetooth-low-energy-unstable

参考文献

搞定Android Bluetooth Low Energy-04》有1个想法

  1. 你好,颜路,

    我是小米电视研发工程师,我们正在找蓝牙方面的大牛加入,有没有兴趣和小米电视的年青人们一起玩耍
    可以加我微信闲聊,也可以发邮件给我
    微信号:willxingxing

    谢谢
    卫星

发表评论

电子邮件地址不会被公开。 必填项已用*标注