Android 蓝牙写入无回调问题

最近在用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

 

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

你可能感兴趣的:(Android,蓝牙开发)