Android(安卓)蓝牙写入无回调问题
16lz
2021-01-26
最近在用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
如有不对的地方,欢迎交流
更多相关文章
- 一句话锁定MySQL数据占用元凶
- 【译】在Android中保护数据-加密大数据
- Android为什么要设计出Bundle而不是直接使用HashMap来进行数据传
- ESP8266 WIFI模块学习之路(7)——自写Android手机APP接受单片机数
- Android序列化详解及最佳实践(Serialize&Parcel)
- Android(安卓)Sqlite 数据的存储
- Android(安卓)直接显示yuv数据 通过Awesomeplayer方式直接显示(一
- 打好Android基础,实战中运用基础
- android远程控制(一)---从PC端写数据到android系统驱动让android系