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

问题一:写入数据无回调

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

        BleManager.getInstance().notify(bleDevice,NOTIFY_UUID_SERVIER,NOTIFY_UUID_CHRA,new BleNotifyCallback() {                    @Override                    public void onNotifySuccess() {                        Log.e("notify","success");                        write(bleDevice,handler);//写入数据                    }                    @Override                    public void onNotifyFailure(final BleException exception) {                        Log.e("notify","failure");                    }                                        //数据回调的方法                    @Override                    public void onCharacteristicChanged(final byte[] data) {                                if (listData.size()>=4){                                    listData.clear();                                    count = 0;                                }                                listData.add(count,data);                                Log.e(" add listdata.size",String.valueOf(listData.size()));                                count = count +1;                    }        });

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

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

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

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

总结下来就是:

1、打开通知通道。

2、设置写入数据类型

3、循环写入数据要用sleep

 

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

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. 【译】在Android中保护数据-加密大数据
  3. Android为什么要设计出Bundle而不是直接使用HashMap来进行数据传
  4. ESP8266 WIFI模块学习之路(7)——自写Android手机APP接受单片机数
  5. Android序列化详解及最佳实践(Serialize&Parcel)
  6. Android(安卓)Sqlite 数据的存储
  7. Android(安卓)直接显示yuv数据 通过Awesomeplayer方式直接显示(一
  8. 打好Android基础,实战中运用基础
  9. android远程控制(一)---从PC端写数据到android系统驱动让android系

随机推荐

  1. 优化你的代码结构 --- MVP
  2. Android之动画(Java代码实现)1
  3. Android之LayoutInflater探索
  4. WebView加入动画后白屏卡顿的现象
  5. 【Android】远程服务(Remote Service)的
  6. Android白眉鹰王之BroadcastReceiver
  7. Android简单调用相机Camera功能,实现打开
  8. Android(安卓)eclipse 没有Annotation Pr
  9. Eclipse开发Android应用程序入门:重装上
  10. android的selector背景选择器