赞
踩
最近在用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
如有不对的地方,欢迎交流
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。