BLE扫描和广播
场景介绍
通过BLE扫描和广播提供的开放能力,可以根据指定状态获取外围设备、启动或停止BLE扫描、广播。
接口说明
表1 BLE中心设备管理类BleCentralManager的主要接口
表2 中心设备管理回调类BleCentralManagerCallback的主要接口
表3 BLE广播相关的BleAdvertiser类和BleAdvertiseCallback类的主要接口
中心设备进行BLE扫描
1.进行BLE扫描之前先要继承BleCentralManagerCallback类实现scanResultEvent和scanFailedEvent回调函数,用于接收扫描结果。
2,调用BleCentralManager(BleCentralManagerCallback callback)接口获取中心设备管理对象。
3.获取扫描过滤器,过滤器为空时为不使用过滤器扫描,然后调用startScan()开始扫描BLE设备,在回调中获取扫描到的BLE设备。
// 实现扫描回调 public class ScanCallback implements BleCentralManagerCallback{ List<BleScanResult> results = new ArrayList<BleScanResult>(); @Override public void scanResultEvent(BleScanResult resultCode) { // 对扫描结果进行处理 results.add(resultCode); } @Override public void scanFailedEvent(int resultCode) { HiLog.warn(TAG,"Start Scan failed, Code: %{public}d", resultCode); } @Override public void groupScanResultsEvent(final List<BleScanResult> scanResults){ // 对扫描结果进行处理 } } // 获取中心设备管理对象 private ScanCallback centralManagerCallback = new ScanCallback(); private BleCentralManager centralManager = new BleCentralManager(context, centralManagerCallback); // 创建扫描过滤器然后开始扫描 List<BleScanFilter> filters = new ArrayList<BleScanFilter>(); centralManager.startScan(filters);
外围设备进行BLE广播
1.进行BLE广播前需要先继承advertiseCallback类实现startResultEvent回调,用于获取广播结果。
2.调用接口BleAdvertiser(Context context, BleAdvertiseCallback callback)获取广播对象,构造广播参数和广播数据。
3.调用startAdvertising(BleAdvertiseSettings settings, BleAdvertiseData advData, BleAdvertiseData scanResponse)接口开始BLE广播。
// 实现BLE广播回调 private BleAdvertiseCallback advertiseCallback = new BleAdvertiseCallback() { @Override public void startResultEvent(int result) { if(result == BleAdvertiseCallback.RESULT_SUCC){ // 开始BLE广播成功 }else { // 开始BLE广播失败 } } }; // 获取BLE广播对象 private BleAdvertiser advertiser = new BleAdvertiser(this,advertiseCallback); // 创建BLE广播参数和数据 private BleAdvertiseData data = new BleAdvertiseData.Builder() .addServiceUuid(SequenceUuid.uuidFromString(Server_UUID)) // 添加服务的UUID .addServiceData(SequenceUuid.uuidFromString(Server_UUID), new byte[]{0x11}) // 添加广播数据内容 .build(); private BleAdvertiseSettings advertiseSettings = new BleAdvertiseSettings.Builder() .setConnectable(true) // 设置是否可连接广播 .setInterval(BleAdvertiseSettings.INTERVAL_SLOT_DEFAULT) // 设置广播间隔 .setTxPower(BleAdvertiseSettings.TX_POWER_DEFAULT) // 设置广播功率 .build(); // 开始广播 advertiser.startAdvertising(advertiseSettings, data, null);
BLE中心设备与外围设备进行数据交互
场景介绍
BLE外围设备和中心设备建立GATT连接,通过该连接中心设备可以获取外围设备支持的Service、Characteristic、Descriptor、RSSI等数据。同时,中心设备可以向外围设备进行数据请求,并向外围设备写入Characteristic、Descriptor等特征值数据。
接口说明
低功耗蓝牙外围设备操作类BlePeripheralDevice的接口说明如下。
表1 低功耗蓝牙外围设备操作API介绍
低功耗蓝牙外围设备操作回调类BlePeripheralCallback的接口说明如下。
表2 低功耗蓝牙外围设备操作回调API介绍
开发步骤
1.调用startScan()接口启动BLE扫描来获取外围设备。
2.获取到外围设备后,调用connect(boolean isAutoConnect, BlePeripheraCallback callback)建立与外围BLE设备的GATT连接,boolean参数isAutoConnect用于设置是否允许设备在可发现距离内自动建立GATT连接。
3.启动GATT连接后,会触发connectionStateChangeEvent(int connectionState)回调,根据回调结果判断是否连接GATT成功。
4.在GATT连接成功时,中心设备可以调用discoverServices()接口,获取外围设备支持的Services、Characteristics等特征值,在回调servicesDiscoveredEvent(int status)中获取外围设备支持的服务和特征值,并根据UUID判断是什么服务。
5.根据获取到的服务和特征值,调用read和write方法可以读取或者写入对应特征值数据。
private List<GattService> services; // 创建扫描过滤器然后开始扫描 List<BleScanFilter> filters = new ArrayList<BleScanFilter>(); centralManager.startScan(filters); // 与外围设备建立连接,允许自动回连,连接会触发connectionStateChangeEvent回调 private BlePeripheralDevice peripheralDevice = BlePeripheralDevice.createInstance(address); // address为远端设备地址 MyBlePeripheralCallback callback = new MyBlePeripheralCallback(); peripheralDevice.connect(true, callback); // 连接后读取外围设备RSSI值,获取后触发readRemoteRssiEvent()回调 peripheralDevice.readRemoteRssiValue(); // 实现外围设备操作回调 private class MyBlePeripheralCallback extends BlePeripheralCallback { @Override public void connectionStateChangeEvent(int connectionState) { // GATT连接状态变化回调 if (connectionState == ProfileBase.STATE_CONNECTED){ peripheralDevice.discoverServices(); // 连接成功获取外围设备的Service } } @Override public void servicesDiscoveredEvent(int status) { // 获取外围设备Service的回调 if (status == BlePeripheralDevice.OPERATION_SUCC){ services = peripheralDevice.getServices(); // 获取Service成功后获服务列表 for (GattService service : services){ // 对每个服务进行相应操作 } } } @Override public void characteristicChangedEvent(GattCharacteristic charecteristic) { // 外围设备主动向中心设备发送特征值通知时触发回调 // 根据通知的charecteristic获取特征值携带的数据 } @Override public void characteristicWriteEvent(GattCharacteristic charecteristic, int ret) { if (ret == BlePeripheralDevice.OPERATION_SUCC){ // 向外围设备写特征值数据成功后的操作 } } @Override public void characteristicReadEvent(GattCharacteristic charecteristic, int ret) { if (ret == BlePeripheralDevice.OPERATION_SUCC){ // 向外围设备读特征值数据成功后的操作 } } @Override public void descriptorReadEvent(GattDescriptor descriptor, int ret) { // 向外围设备读描述值数据成功后的操作 } @Override public void descriptorWriteEvent(GattDescriptor descriptor, int ret) { // 向外围设备写描述值数据成功后的操作 } @Override public void readRemoteRssiEvent(int rssi, int ret) { if (ret == BlePeripheralDevice.OPERATION_SUCC){ // 读取外围设备RSSI值成功后的操作,对端RSSI值为rssi } } }
BLE外围设备数据管理
场景介绍
BLE外围设备作为服务端,可以接收来自中心设备(客户端)的GATT连接请求,应答来自中心设备的特征值内容读取和写入请求,并向中心设备提供数据,从而实现信息交互和消息同步。同时外围设备还可以主动向中心设备发送数据。
接口说明
低功耗蓝牙外围设备操作类BlePeripheralManager的接口说明如下。
表1 外围设备管理API介绍
低功耗蓝牙外围设备管理回调类BlePeripheralManagerCallback的接口说明如下。
表2 外围设备管理回调API介绍
开发步骤
1.调用BlePeripheralManager(Context context, BlePeripheralManagerCallback callback, int transport)接口创建外围设备服务端并开启服务。
2.调用GattService(UUID uuid, boolean isPrimary)接口创建服务对象,向外围设备添加服务。
3.从回调接口onCharacteristicWriteRequest中获取中心设备发送来的消息,调用notifyCharacteristicChanged接口向中心设备发送通知。
private BlePeripheralDevice blePeripheralDevice; private MyBlePeripheralManagerCallback peripheralManagerCallback = new MyBlePeripheralManagerCallback(); // 创建外围设备服务端并开启服务 private BlePeripheralManager peripheralManager = new BlePeripheralManager(this, peripheralManagerCallback, 0); // 创建服务对象,向外围设备添加服务 private GattService service = new GattService(UUID.fromString(Service_UUID), true); private GattCharacteristic writeCharacteristic = new GattCharacteristic(Character_UUID, GattCharacteristic.PROPERTY_WRITE, GattCharacteristic.PROPERTY_WRITE); service.addCharacteristic(writeCharacteristic); peripheralManager.addServerService(service); // 向中心设备发送通知 writeCharacteristic.setValue(data); peripheralManager.notifyCharacteristicChanged(blePeripheralDevice, writeCharacteristic, false); // 外围设备管理回调 public class MyBlePeripheralManagerCallback extends BlePeripheralManagerCallback { // 中心设备向外围设备写入数据回调 @Override public void receiveCharacteristicWriteEvent(BlePeripheralDevice device, int requestId, GattCharacteristic characteristic, boolean isPrep, boolean needRsp, int offset, byte[] value){ // 中心设备写入外围设备的数据为value,对数据进行处理 } // 外围设备连接状态变化回调 @Override public void connectionStateChangeEvent(BlePeripheralDevice device, int interval, int latency, int timeout, int status){ if (status == ProfileBase.STATE_CONNECTED) { // 中心设备连接服务端成功 blePeripheralDevice = device; } } // 向中心设备发送通知回调 @Override public void notificationSentEvent(BlePeripheralDevice device, int status){ if (status == BlePeripheralDevice.OPERATION_SUCC) { // 向对中心设备发送通知成功回调 } } }