- 内部集成了多种蓝牙芯片的操作,能兼容几乎市面上所有的蓝牙设备;
- 支持低功耗蓝牙和传统蓝牙;
- 支持设置低功耗蓝牙的高速传输模式;
- 实现了蓝牙的重发机制;
- 实现了蓝牙的同异步发送数据;
- 实现了协议基类封装,开发者可以快速扩展自己的协议;
注意:部分Android6.0以上的手机需要定位权限才能正常使用蓝牙功能
implementation 'com.stag:bluetooth:1.0.2'
项目中增加了蓝牙搜素的自定义View,方便你快速的实现项目
- 根据蓝牙的信号强度排序和显示;
- 有搜素或连接的历史记录功能(做小部分配置即可实现);
调用的类为com.stag.bluetooth.BluetoothControl.java
BluetoothController mController = BluetoothController.getController(this);
mController.registerBluetoothStateChangeListener(new OnBluetoothStateChangeListener() {
@Override
public void onBluetoothOpen() {
LogUtils.i(TAG + "lpq", "onBluetoothOpen: 蓝牙打开");
}
@Override
public void onBluetoothClose() {
LogUtils.i(TAG + "lpq", "onBluetoothClose: 蓝牙关闭");
}
});
mController.registerConnectStateChangeListener(new OnBluetoothConnectStateChangeListener() {
@Override
public void onBluetoothConnect(BluetoothDevice device, boolean isSuccess) {
if (isSuccess) {
LogUtils.i(TAG + "lpq", "onBluetoothConnect: 蓝牙已连接");
} else {
LogUtils.i(TAG + "lpq", "onBluetoothConnect: 蓝牙连接失败");
}
}
@Override
public void onBluetoothDisconnect(BluetoothDevice device) {
LogUtils.i(TAG + "lpq", "onBluetoothDisconnect: 蓝牙已断开");
}
});
mController.setBluetoothType(BluetoothType.BLE); // 低功耗蓝牙
mController.setBluetoothType(BluetoothType.TRADITION); // 传统蓝牙
mController.startScan(new OnBluetoothScanListener() {
@Override
public void onBluetoothScanFindDevice(BluetoothDevice device, int rssi) {
LogUtils.i(TAG + "lpq", "onBluetoothScanFindDevice: " + device.getAddress());
}
@Override
public void onBluetoothScanFinish() {
LogUtils.i(TAG + "lpq", "onBluetoothScanFinish: ");
}
});
mController.stopScan();
mController.connect("0C:B2:B7:3E:23:60"); //连接蓝牙,参数为蓝牙MAC地址
mController.disconnect(); //断开连接
mController.setBleHighSpeedMode(true);
不一定100%成功,由蓝牙设备与App设备蓝牙的最低MTU决定。
@Override
protected void onDestroy() {
super.onDestroy();
if (mController != null) {
mController.unregisterBluetoothStateChangeListener();
mController.unregisterConnectStateChangeListener();
}
}
public abstract class Protocol<E extends Packet, T extends OnEventListener> {
public final static int BLE_MAX_SEND_INTERVAL = 500;
protected Context mContext;
private T mEventListener;
private Object mData;
private int mMaxBleSendInterval = BLE_MAX_SEND_INTERVAL;
/**
* 协议所特有的主动事件监听
*/
protected Protocol(Context context) {
this(context, null);
}
/**
* 协议所特有的主动事件监听
*/
protected Protocol(Context context, T listener) {
mContext = context.getApplicationContext();
mEventListener = listener;
}
/**
* 发送包处理成最终要发送的字节数据
*/
public abstract byte[] packetToBytes(E packet);
/**
* 解析收到的字节处理成结果
*/
public abstract ParseResult parse(byte[] data);
/**
* 获取协议类型
* */
public abstract int getType();
/**
* 是否设置了主动事件监听
* */
protected boolean haveSetEventListener(){
return mEventListener!=null;
}
······
}
上述抽象类中屏蔽了部分内容,我们主要看几个重点:
- packetToBytes 和 parse是用户层面发送数据的最终端和接收数据的最初端,您可以根据自己蓝牙协议的需要来重写方法,创建自己的协议类;
- getType是用来支持App需要同时支持多个蓝牙协议的情况的;
- mEventListener用于接收蓝牙设备主动上报的一些状态;
该方法是与蓝牙设备操作相关的方法,而且必须在连接蓝牙设备之前设置
mController.setProtocol(new Protocol(this, this));
BluetoothTask task = new BluetoothTask(new Packet(cmd, data), new BluetoothTask.OnDataResultListener() {
@Override
public void onResult(boolean isTimeout, byte[] data) {
//数据接收回调,异步时使用
}
});
task.setTimeout(2000); //设置超时时间
task.setTryCount(1); //设置重发次数
task.send(); //异步发送数据
BluetoothTask task = new BluetoothTask(new Packet(cmd, data));
task.setTimeout(2000); //设置超时时间
task.setTryCount(1); //设置重发次数
byte[] result = task.sendBySync2(); //同步发送数据
如果方式一没有办法满足你的要求,那么我也提供方式二来供你选择
mController.registerTransmitListener(new OnBluetoothTransmitListener() {
@Override
public void onBluetoothSendData(byte[] data) {
// 发送数据
}
@Override
public void onBluetoothRecvData(byte[] data) {
// 接收数据
}
});
mController.sendData(new byte[]{});