Android蓝牙4.0 Ble读写数据详解 -2
上一篇说了如何扫描与链接蓝牙 这篇文章讲讲与蓝牙的数据传输,与一些踩到的坑。
先介绍一款调试工具,专门调试Ble蓝牙的app。名字叫:nRF-Connect 谷歌应用商店也能下载到。
这里我先连接一个蓝牙设备 贴几个截图。
UUID的话 就相当于钥匙,蓝牙设备当中有通道,那么通道是需要UUID进行匹配的
当连接上设备之后,可以看到UUID的通道 接下来,按照设备厂商提供的文档,找到我们需要的UUID通道
比如说我这里需要的是0x6a的Service通道 然后点开最后一个Service通道查看
展开Service后 可以看到有两个Characteristic通道
我们看Properties属性 一个是NOTIFY 一个是WRITE 也有可能会有READ这个属性的通道
可以拿这个app输出写出指令给蓝牙,在不清楚是蓝牙的问题还是自己的问题的时候,这个工具还是挺好使的。
Notify的话,需要注意这个Descriptors的UUID 这个在注册Notify的时候,需要用到,这里虽然看不全,但是之后可以通过打印得到。
简单说一下这三种属性的通道的用途
WRITE:顾名思义,写的意思,该通道是用来向蓝牙设备写出数据的通道
READ:向蓝牙设备进行读取数据的通道 这个通道有一个坑 后续会详细写上
Notify:该通道需要注册监听,这是一个通知的通道,蓝牙向你传输数据的话,就能直接收到监听。
我这边的话 因为一些原因,所以没有使用READ通道获取数据 只用了Notify通道 当然 也会讲讲怎么使用READ
准备工作
先将UUID管理起来,我这里的话 采用静态常量的形式保存起来了。
public class UUIDManager {
/**
* 服务的UUID
*/
public static final String SERVICE_UUID = "00006a00-0000-1000-8000-00805f9b34fb";
/**
* 订阅通知的UUID
*/
public static final String NOTIFY_UUID = "00006a02-0000-1000-8000-00805f9b34fb";
/**
* 写出数据的UUID
*/
public static final String WRITE_UUID = "00006a02-0000-1000-8000-00805f9b34fb";
/**
* NOTIFY里面的Descriptor UUID
*/
public static final String NOTIFY_DESCRIPTOR = "00002902-0000-1000-8000-00805f9b34fb";
}
处理通知回调接口
蓝牙的数据回调,其实并不是回调到主线程当中,所以如果接收到数据之后,就进行视图操作的话,是会失败的。
所以我打算切换到主线程进行回调,当然,也可以使用EventBus,不过我不喜欢这东西就没去用。
回调接口的话,打算使用list集合存储起来,然后回调到各个需要数据的地方。 创建以下三个类
/**
* Created by Pencilso on 2017/4/20.
* 蓝牙数据回调监听接口
*/
public interface BlueNotifyListener {
public void onNotify(Message notify);
}
/**
* Created by Pencilso on 2017/4/25.
* 处理回调所有接口
*/
public class NotifyThread implements Runnable {
private List listeners;
private Message notify;
@Override
public void run() {
if (notify == null || listeners==null)
return;
try {
Iterator iterator = listeners.iterator();
while (iterator.hasNext()) {
BlueNotifyListener next = iterator.next();
if (next == null)
iterator.remove();
else
next.onNotify(notify);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setListeners(List listeners) {
this.listeners = listeners;
}
public void setNotify(Message notify) {
this.notify = notify;
}
}
/**
* Created by Pencilso on 2017/4/26.
* 蓝牙的Code类 用来自定义回调的标识
*/
public class BlueCodeUtils {
/**
* 蓝牙状态 已连接
*/
public static final int BLUETOOTH_STATE_CONNECT = 0x1;
/**
* 蓝牙状态 已断开
*/
public static final int BLUETOOTH_STATE_DISCONNECT