关于BLE的MTU
MTU(Maximum Transmission Unit): 即数据的最大传输单元。具体是指一个Chracteristic一次性可传输的数据大小。
蓝牙核心规范(core spec)中定义了ATT的默认MTU为23byte,除去ATT的opcode一个字节以及ATT的handle2个字节之后,剩下的20个字节便是留给GATT的了。由于ATT的最大长度为512byte,故一般认为MTU的最大长度为512个byte。
注:core spec规定每一个设备都必须支持MTU为23。
安卓BLE通信开发
Gradle依赖
在项目根gradle中添加
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
在具体module的gradle中添加
dependencies {
implementation 'com.github.Ficat:EasyBle:v1.0.3'
}
使用
以下是BLE开发常用到的一些基础api
//是否支持BLE
BleManager.supportBle(context);
//蓝牙是否打开
BleManager.isBluetoothOn();
//打开或关闭蓝牙,不显示请求用户授权dialog(一些特殊设备如大部分国产手机除外)
BleManager.toggleBluetooth(true);
//显示dialog请求用户打开蓝牙,需在传入的activity的onActivityResult中处理请求结果
BleManager.enableBluetooth(activity,requestCode);
获取BleManager对象
//获取管理器对象
BleManager bleManager = BleManager.getInstance(this.getApplication());
//设置ble选项,可多次设置,EasyBle将使用最新的options。比如本次扫描周期
//为10s,但你想要下一次扫描周期更长一些,则再次调用本方法去设置即可
BleManager.Options options = new BleManager.Options();
options.loggable = true; //是否打印日志
options.connectTimeout = 10000; //连接超时时间
options.scanPeriod = 12000; //扫描周期
options.scanDeviceName = "targetDeviceName"; //扫描的目标设备名
options.scanDeviceAddress = "targetDeviceAddress"; //扫描目标设备地址如"DD:0D:30:00:0D:9B"
options.scanServiceUuids = serviceUuidArray; //扫描含该服务UUID的目标设备
bleManager.option(options);
扫描
安卓版本不小于6.0的,扫描必须要有定位权限
bleManager.startScan(new BleScanCallback() {
@Override
public void onLeScan(BleDevice device, int rssi, byte[] scanRecord) {
String name = device.name;
String address = device.address;
}
@Override
public void onStart(boolean startScanSuccess, String info) {
if (startScanSuccess) {
//开始扫描成功
} else {
//未能成功开始扫描,可通过info查看详情
String failReason = info;
}
}
@Override
public void onFinish() {
}
});
当需要结束扫描时用以下方法结束扫描,建议在扫描到目标设备后停止扫描
bleManager.stopScan();
连接
BleConnectCallback bleConnectCallback = new BleConnectCallback() {
@Override
public void onStart(boolean startConnectSuccess, String info, BleDevice device) {
if (startConnectSuccess) {
//开始连接
} else {
//未能成功开始连接,可通过info查看详情
String failReason = info;
}
}
@Override
public void onTimeout(BleDevice device) {
}
@Override
public void onConnected(BleDevice device) {
}
@Override
public void onDisconnected(BleDevice device) {
}
};
//通过BleDevice对象连接设备
bleManager.connect(bleDevice, bleConnectCallback);
//直接通过mac地址连接
bleManager.connect(address, bleConnectCallback)
当需要断开与设备的连接时可使用以下任一方法断开设备连接
//断开与指定设备的连接
bleManager.disconnect(bleDevice);
//传入目标的mac地址断开与该设备的连接
bleManager.disconnect(address);
//断开所有已连接设备
bleManager.disconnectAll(); |