阅读(2484) (15)

鸿蒙OS BLE扫描和广播

2020-09-17 09:49:23 更新

场景介绍

通过 BLE 扫描和广播提供的开放能力,可以根据指定状态获取外围设备、启动或停止 BLE 扫描、广播。

接口说明

接口名 功能描述
startScan(List<BleScanFilter> filters) 进行 BLE 蓝牙扫描,并使用 filters 对结果进行过滤。
stopScan() 停止 BLE 蓝牙扫描。
getDevicesByStates(int[] states) 根据状态获取连接的外围设备。
BleCentralManager(BleCentralManagerCallback callback) 获取中心设备管理对象。
接口名 功能描述
onScanCallback(BleScanResult result) 扫描到 BLE 设备的结果回调。
onStartScanFailed(int resultCode) 启动扫描失败的回调。
接口名 功能描述
BleAdvertiser(Context context, BleAdvertiseCallback callback) 用于获取广播操作对象。
startAdvertising(BleAdvertiseSettings settings, BleAdvertiseData advData, BleAdvertiseData scanResponse) 进行 BLE 广播,第一个参数为广播参数,第二个为广播数据,第三个参数是扫描和广播数据参数的响应。
stopAdvertising() 停止 BLE 广播。
startResultEvent(int result) 广播回调结果。

中心设备进行 BLE 扫描

  1. 进行 BLE 扫描之前先要继承 BleCentralManagerCallback 类实现 onScanCallback 和 onStartScanFailed 回调函数,用于接收扫描结果。

  1. 调用BleCentralManager(BleCentralManagerCallback callback)接口获取中设备管理对象。

  1. 获取扫描过滤器,过滤器为空时为不使用过滤器扫描,然后调用 startScan()开始扫描 BLE 设备,在回调中获取扫描到的 BLE 设备。

   // 实现扫描回调
   public class ScanCallback implements BleCentralManagerCallback{
       List<BleScanResult>results = new ArrayList<BleScanResult>();
       @Override
       public void onScanCallback(BleScanResult var1) {
           // 对扫描结果进行处理
           results.add(var1);
       }
       @Override    
       public void onStartScanFailed(int var1) {        
           HiLog.info(TAG,"Start Scan failed,Code:" + var1);    
       }
   }
   // 获取中心设备管理对象
   private ScanCallback centralManagerCallback = new ScanCallback();
   private BleCentralManager centralManager = new BleCentralManager(centralManagerCallback);
   // 创建扫描过滤器然后开始扫描
   List<BleScanFilter> filters = new ArrayList<BleScanFilter>();
   centralManager.startScan(filters);

外围设备进行 BLE 广播

  1. 进行 BLE 广播前需要先继承 advertiseCallback 类实现 startResultEvent 回调,用于获取广播结果。

  1. 调用接口 BleAdvertiser(Context context, BleAdvertiseCallback callback)获取广播对象,构造广播参数和广播数据。

  1. 调用 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);