当前位置:   article > 正文

Android 蓝牙写入无回调问题_android ble 数据写入成功不回调

android ble 数据写入成功不回调

最近在用FastBle写一个关于蓝牙的项目,遇到了以下几个问题:

问题一:写入数据无回调

解决:使用蓝牙数据嗅探器来检查写入数据的类型,发现是Write Command,在树莓派中用gatttool 命令写入有回调类型的数据时,嗅探器显示写入数据的类型是Write Request,这两个类型的区别就是一个是无回调数据,一个是有回调数据。在Android中如果需要有回调的数据,需要先打开数据回调的通道,FastBle 打开Notification 通道的代码如下

  1. BleManager.getInstance().notify(bleDevice,NOTIFY_UUID_SERVIER,NOTIFY_UUID_CHRA,new BleNotifyCallback() {
  2. @Override
  3. public void onNotifySuccess() {
  4. Log.e("notify","success");
  5. write(bleDevice,handler);//写入数据
  6. }
  7. @Override
  8. public void onNotifyFailure(final BleException exception) {
  9. Log.e("notify","failure");
  10. }
  11. //数据回调的方法
  12. @Override
  13. public void onCharacteristicChanged(final byte[] data) {
  14. if (listData.size()>=4){
  15. listData.clear();
  16. count = 0;
  17. }
  18. listData.add(count,data);
  19. Log.e(" add listdata.size",String.valueOf(listData.size()));
  20. count = count +1;
  21. }
  22. });

 打开通知通道后,想要有回调,还要设置写入数据的类型,代码如下:

  1. public void write(){
  2. BluetoothGattService service= gatt.getService(UUID.fromString(WRITE_UUID_SERVIER));
  3. BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID.fromString(WRITE_UUID_CHRA));
  4. //设置写入类型,WRITE_TYPE_DEFAULT:需要设备回应 WRITE_TYPE_NO_RESPONSE 不需要设备回应
  5. characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
  6. }

经过以上的设置后,不出意外的话应该就有回调了。不过,在本项目中,意外总是不期而遇,因项目的特殊性,连续写入三条数据,于是用for循环来解决,三条数据成功写入,嗅探器显示的是Write Request,看到这里,似乎一切都在往好的方向发展,当你正在幻想美好的一切时,生活总会无情的给你当头棒喝,让你认清现实的残酷。依然没有数据回调,心如死灰。心想是不是不能连续的写入数据,于是乎只写一条数据,不出意外,确实是有数据返回了,但为什么连续写的时候就没有呢,这就奇卵怪了。是不是写入太快,蓝牙装置没来得急反应? 那就加Thread.sleep(),每循环一次,睡眠1秒,果不其然三条数据写入后,一一返回了数据。一种拨开云雾见青天的感觉。

记录一下坑,避免以后再入坑。

总结下来就是:

1、打开通知通道。

2、设置写入数据类型

3、循环写入数据要用sleep

 

如有不对的地方,欢迎交流

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/956161
推荐阅读
相关标签
  

闽ICP备14008679号