【鸿蒙实战开发】基于短距离通讯的BLE蓝牙扫描

打印 上一主题 下一主题

主题 492|帖子 492|积分 1476

往期知识点整理



  • 【鸿蒙UI实战开发】基于List和Scroller由简单到复杂列表布局开发实践
  • 【鸿蒙ArkUI实战开发】基于ArkUI的透明页面效果
  • 【鸿蒙ArkUI实战开发】基于Search组件实现搜刮栏
  • 【鸿蒙ArkUI实战开发】基于Swiper的页面布局
  • 【鸿蒙ArkUI实战开发】基于promptAction全局弹窗
  • 【鸿蒙ArkUI实战开发】基于OpenGL渲染视频画面帧
  • 【鸿蒙实战开发】基于Navigation的路由拦截管理
  • 【鸿蒙实战开发】基于组件嵌套的滑动
  • 【鸿蒙实战开发】基于Text的自定义字体
  • 【鸿蒙实战开发】基于Grid实现混淆布局
  • 【鸿蒙实战开发】基于ArkUI实现雷同Toast弹窗
  • 【鸿蒙实战开发】基于短距离通讯的BLE蓝牙扫描
  • 连续更新中……
场景描述

蓝牙是一种短距的无线通讯技术,可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的BLE蓝牙称为低功耗蓝牙。BLE模块提供了对蓝牙操作和管理的方法。
场景一:申请蓝牙权限

方案:
ACCESS_BLUETOOTH 权限是许多蓝牙接口需要申请的,比如:ble.getConnectedBLEDevices(获取和当前设备连接的BLE设备)、ble.startBLEScan(发起BLE扫描流程)。这个权限是需要用户授权的,可以通过调用requestPermissionsFromUser()方法来实现。
不鼓励频仍弹窗打搅用户,假如用户拒绝授权,将无法再次拉起弹窗。需要应用引导用户在系统应用“设置”的界面中手动授予权限。
焦点代码
  1. requestPermissionsFromUser() {
  2.   let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  3.   try {
  4.     let context = getContext(this);
  5.     atManager.requestPermissionsFromUser(context, ['ohos.permission.ACCESS_BLUETOOTH'], (err: BusinessError, data: PermissionRequestResult) => {
  6.       console.info('data:' + JSON.stringify(data));
  7.       console.info('data permissions:' + data.permissions);
  8.       console.info('data authResults:' + data.authResults);
  9.     });
  10.   } catch (err) {
  11.     console.log(`catch err->${JSON.stringify(err)}`);
  12.   }
  13. }
复制代码
配置文件
module.json文件中申请相干权限,相干权限阐明可参考文档:
  1. "requestPermissions":[
  2.   {
  3.     "name" : "ohos.permission.ACCESS_BLUETOOTH",
  4.     "reason": "$string:module_desc",
  5.     "usedScene": {
  6.       "abilities": [
  7.         "FormAbility"
  8.       ],
  9.       "when":"always"
  10.     }
  11.   },
  12.   {
  13.     "name" : "ohos.permission.DISCOVER_BLUETOOTH",
  14.     "usedScene": {
  15.       "abilities": [
  16.         "FormAbility"
  17.       ],
  18.       "when":"always"
  19.     }
  20.   },
  21.   {
  22.     "name" : "ohos.permission.USE_BLUETOOTH",
  23.     "usedScene": {
  24.       "abilities": [
  25.         "bluetouth"
  26.       ],
  27.       "when":"always"
  28.     }
  29.   },
  30. ]
复制代码
场景二:BLE蓝牙扫描和系统设置蓝牙扫描

BLE为低功耗蓝牙,只能扫描到低功耗的蓝牙设备。
connection是经典蓝牙,假如想扫描到系统设置中的所有设备,可以调用此接口。
方案:
ble扫描的是低功耗蓝牙,相比于connection扫描效果偏少,假如想要扫描到系统设置中的所有设备,需要去调用@ohos.bluetooth.connection模块中的connection.startbluetoothdiscovery。
焦点代码
低功耗蓝牙扫描:ble.startBLEScan
  1. import { BusinessError } from '@kit.BasicServicesKit';
  2. import { ble } from '@kit.ConnectivityKit';
  3. @Entry
  4. @Component
  5. struct Index {
  6.   @State onReceiveEventData: string = ''
  7.   @State isScan: boolean = false
  8.   // ...
  9.   build() {
  10.     Row() {
  11.       Column() {
  12.         // 蓝牙扫描
  13.         Button("startBLEScan")
  14.           .onClick(() => {
  15.             this.isScan = !this.isScan
  16.             let onReceiveEvent = (data: Array<ble.ScanResult>) => {
  17.               console.info('BLE scan device find result = ' + JSON.stringify(data));
  18.               let dataString = JSON.stringify(data)
  19.               this.onReceiveEventData = dataString
  20.             }
  21.             try {
  22.               ble.on("BLEDeviceFind", onReceiveEvent);
  23.               let scanFilter: ble.ScanFilter = {
  24.                 // deviceId:"xxxx",
  25.                 // name:"test",
  26.                 // serviceUuid:"xxxx"
  27.               };
  28.               console.info('scanFilter' + JSON.stringify(scanFilter))
  29.               let scanOptions: ble.ScanOptions = {
  30.                 interval: 50,
  31.                 dutyMode: ble.ScanDuty.SCAN_MODE_LOW_POWER,
  32.                 matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE,
  33.               }
  34.               ble.startBLEScan(null, scanOptions);
  35.             } catch (err) {
  36.               console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' +
  37.               (err as BusinessError).message);
  38.             }
  39.           })
  40.           .type(ButtonType.Capsule)
  41.           .margin({ top: 4 })
  42.           .backgroundColor('#ff1198ee')
  43.           .width('67%')
  44.           .height('4%')
  45.         // ...
  46.         Text(this.isScan ? this.onReceiveEventData : '蓝牙未开启扫描')
  47.           .textAlign(TextAlign.Center)
  48.           .fontSize(12)
  49.           .border({ width: 1 })
  50.           .padding(10)
  51.           .margin(10)
  52.           .width('80%')
  53.           .height(200)
  54.       }
  55.       .width('100%')
  56.     }
  57.     .height('100%')
  58.   }
  59. }
复制代码
经典蓝牙扫描:connection.startBluetoothDiscovery。
  1. import { BusinessError } from '@kit.BasicServicesKit';
  2. import connection from '@ohos.bluetooth.connection';
  3. @Entry
  4. @Component
  5. struct Index {
  6.   @State onReceiveEventData: string = ''
  7.   @State isScan: boolean = false
  8.   // ...
  9.   build() {
  10.     Row() {
  11.       Column() {
  12.         // 蓝牙扫描
  13.         Button("startBluetoothDiscovery")
  14.           .onClick(() => {
  15.             this.isScan = !this.isScan
  16.             let onReceiveEvent = (data: Array<string>) => {
  17.               console.log('data length' + JSON.stringify(data));
  18.               let dataString = JSON.stringify(data)
  19.               this.onReceiveEventData = dataString
  20.             }
  21.             try {
  22.               connection.on('bluetoothDeviceFind', onReceiveEvent);
  23.               connection.startBluetoothDiscovery();
  24.             } catch (err) {
  25.               console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' +
  26.               (err as BusinessError).message);
  27.             }
  28.           })
  29.           .type(ButtonType.Capsule)
  30.           .margin({ top: 4 })
  31.           .backgroundColor('#ff1198ee')
  32.           .width('67%')
  33.           .height('4%')
  34.         Text(this.isScan ? this.onReceiveEventData : '蓝牙未开启扫描')
  35.           .textAlign(TextAlign.Center)
  36.           .fontSize(12)
  37.           .border({ width: 1 })
  38.           .padding(10)
  39.           .margin(10)
  40.           .width('80%')
  41.           .height(200)
  42.       }
  43.       .width('100%')
  44.     }
  45.     .height('100%')
  46.   }
  47. }
复制代码
场景三:蓝牙模块能力展示

效果图

方案:
相干接口能力:
⦁    开启蓝牙:access.enableBluetooth。
⦁    关闭蓝牙:access.disableBluetooth。
⦁    获取蓝牙配对列表:connection.getPairedDevices。
⦁    获取蓝牙配对状态:connection.getPairState。
⦁    订阅蓝牙设备发现上报变乱:connection.on(‘bluetoothDeviceFind’)。
⦁    取消订阅蓝牙设备发现上报变乱:connection.off(‘bluetoothDeviceFind’)。
⦁    开启蓝牙扫描,可以发现远端设备:connection.startBluetoothDiscovery。
⦁    关闭蓝牙扫描:connection.stopBluetoothDiscovery。
⦁    发起蓝牙配对:connection.pairDevice。
⦁    创建一个服务端监听Socket:socket.sppListen。
焦点代码
  1. GridItem(){
  2.   Button('打开权限').onClick(() => {
  3.     hilog.info(0x00000, TAG, '打开权限');
  4.     this.requestPermissionsFromUser();
  5.   })
  6. }
  7. .columnStart(0)
  8. .columnEnd(1)
  9. .rowStart(0)
  10. .rowEnd(0)
  11. GridItem() {
  12.   Button('蓝牙-开启').onClick(() => {
  13.     hilog.info(0x00000, TAG, '蓝牙-开启');
  14.     try {
  15.       access.enableBluetooth();
  16.     } catch (err) {
  17.       hilog.info(0x00000, TAG, 'errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
  18.     }
  19.   })
  20. }
  21. GridItem() {
  22.   Button('蓝牙-关闭').onClick(() => {
  23.     hilog.info(0x00000, TAG, '蓝牙-关闭');
  24.     try {
  25.       access.disableBluetooth();
  26.     } catch (err) {
  27.       hilog.info(0x00000, TAG, 'errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
  28.     }
  29.   })
  30. }
  31. GridItem() {
  32.   Button('获取蓝牙配对列表&状态').onClick(() => {
  33.     hilog.info(0x00000, TAG, '获取蓝牙配对列表');
  34.     try {
  35.       let result: Array<string> = connection.getPairedDevices();
  36.       let index = 1;
  37.       result.forEach(s => {
  38.         let state = connection.getPairState(s)
  39.         hilog.info(0x00000, TAG, '第%{public}s台设备,id-> %{public}s,状态为->%{public}s', index++, s, bluetoothBondStateMap.get(state));
  40.       })
  41.     } catch (err) {
  42.       hilog.info(0x00000, TAG, 'errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
  43.     }
  44.   })
  45. }
  46. .columnStart(0)
  47. .columnEnd(1)
  48. .rowStart(1)
  49. .rowEnd(1)
  50. GridItem() {
  51.   Button('订阅蓝牙设备发现上报事件').onClick(() => {
  52.     hilog.info(0x00000, TAG, '订阅蓝牙设备发现上报事件。');
  53.     try {
  54.       connection.on('bluetoothDeviceFind', onReceiveEvent);
  55.     } catch (err) {
  56.       hilog.info(0x00000, TAG, 'errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
  57.     }
  58.   })
  59. }
  60. .columnStart(0)
  61. .columnEnd(1)
  62. .rowStart(2)
  63. .rowEnd(2)
  64. GridItem() {
  65.   Button('取消订阅设备发现上报事件').onClick(() => {
  66.     hilog.info(0x00000, TAG, '取消订阅设备发现上报事件');
  67.     try {
  68.       hilog.info(0x00000, TAG, '共发现了设备数量为-1#' + deviceSet.size);
  69.       connection.off('bluetoothDeviceFind', onReceiveEvent);
  70.       index = 1;
  71.     } catch (err) {
  72.       hilog.info(0x00000, TAG, 'errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
  73.     }
  74.   })
  75. }
  76. .columnStart(0)
  77. .columnEnd(1)
  78. .rowStart(3)
  79. .rowEnd(3)
  80. GridItem() {
  81.   Button('蓝牙-开启扫描').onClick(() => {
  82.     hilog.info(0x00000, TAG, '蓝牙-开启扫描');
  83.     try {
  84.       connection.startBluetoothDiscovery()
  85.     } catch (err) {
  86.       hilog.info(0x00000, TAG, 'errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
  87.     }
  88.   })
  89. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表