【HarmonyOS】鸿蒙应用蓝牙功能实现 (一)

打印 上一主题 下一主题

主题 935|帖子 935|积分 2805

【HarmonyOS】鸿蒙应用蓝牙功能实现
媒介

蓝牙技能是一种无线通信技能,可以在短距离内传输数据。它是由爱立信公司于1994年提出的,利用2.4 GHz的ISM频段,可以在10米左右的距离内举行通信。可以用于毗连手机、耳机、音箱、键盘、鼠标、打印机等各种装备。
特点是低功耗、低本钱、简单易用。目前已经发展到了第五代,支持更高的数据传输速率和更广的覆盖范围。
蓝牙实现原理
蓝牙的实现原理是基于无线电技能的短距离通信协议,利用2.4GHz频段的无线电波举行通信,利用频率跳跃技能(Frequency Hopping Spread Spectrum,FHSS)来避免与其他无线装备的干扰。
在通信过程中,蓝牙装备会发送和接收数据包,而且利用差别的蓝牙协议来控制通信流程和数据传输。

蓝牙跳频技能的原理
蓝牙跳频技能重要基于频率跳跃技能,即通过在差别频率上快速跳跃来发送数据。这种技能可以防止干扰和噪声影响数据传输,提高数据传输的可靠性。具体来说,当某条频率受到干扰或噪声时,体系会主动切换到其他频率上举行传输,从而确保数据的完整性和稳定性。
DEMO示例

以下为蓝牙开关和状态控制
  1. import { access } from '@kit.ConnectivityKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. export class BlueToothMgr {
  4.   private static mBlueToothMgr: BlueToothMgr | undefined = undefined;
  5.   public Ins(){
  6.     if(BlueToothMgr.mBlueToothMgr){
  7.       BlueToothMgr.mBlueToothMgr = new BlueToothMgr();
  8.     }
  9.     return BlueToothMgr.mBlueToothMgr;
  10.   }
  11.   // STATE_OFF        0        表示蓝牙已关闭。
  12.   // STATE_TURNING_ON        1        表示蓝牙正在打开。
  13.   // STATE_ON        2        表示蓝牙已打开。
  14.   // STATE_TURNING_OFF        3        表示蓝牙正在关闭。
  15.   // STATE_BLE_TURNING_ON        4        表示蓝牙正在打开LE-only模式。
  16.   // STATE_BLE_ON        5        表示蓝牙正处于LE-only模式。
  17.   // STATE_BLE_TURNING_OFF        6        表示蓝牙正在关闭LE-only模式。
  18.   /**
  19.    * 设置蓝牙访问(开关状态)
  20.    * @param isAccess true: 打开蓝牙
  21.    */
  22.   setBlueToothAccess(isAccess: boolean){
  23.     try {
  24.       if(isAccess){
  25.         access.enableBluetooth();
  26.         access.on('stateChange', (data: access.BluetoothState) => {
  27.           let btStateMessage = this.switchState(data);
  28.           if (btStateMessage == 'STATE_ON') {
  29.             access.off('stateChange');
  30.           }
  31.           console.info('bluetooth statues: ' + btStateMessage);
  32.         })
  33.       }else{
  34.         access.disableBluetooth();
  35.         access.on('stateChange', (data: access.BluetoothState) => {
  36.           let btStateMessage = this.switchState(data);
  37.           if (btStateMessage == 'STATE_OFF') {
  38.             access.off('stateChange');
  39.           }
  40.           console.info("bluetooth statues: " + btStateMessage);
  41.         })
  42.       }
  43.     } catch (err) {
  44.       console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
  45.     }
  46.   }
  47.   private switchState(data: access.BluetoothState){
  48.     let btStateMessage = '';
  49.     switch (data) {
  50.       case 0:
  51.         btStateMessage += 'STATE_OFF';
  52.         break;
  53.       case 1:
  54.         btStateMessage += 'STATE_TURNING_ON';
  55.         break;
  56.       case 2:
  57.         btStateMessage += 'STATE_ON';
  58.         break;
  59.       case 3:
  60.         btStateMessage += 'STATE_TURNING_OFF';
  61.         break;
  62.       case 4:
  63.         btStateMessage += 'STATE_BLE_TURNING_ON';
  64.         break;
  65.       case 5:
  66.         btStateMessage += 'STATE_BLE_ON';
  67.         break;
  68.       case 6:
  69.         btStateMessage += 'STATE_BLE_TURNING_OFF';
  70.         break;
  71.       default:
  72.         btStateMessage += 'unknown status';
  73.         break;
  74.     }
  75.     return btStateMessage;
  76.   }
  77. }
复制代码
  1. import { access } from '@kit.ConnectivityKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. import { BlueToothMgr } from '../manager/BlueToothMgr';
  4. import { abilityAccessCtrl, common } from '@kit.AbilityKit';
  5. @Entry
  6. @Component
  7. struct Index {
  8.   private TAG: string = "BlueToothTest";
  9.   // 蓝牙状态
  10.   @State isStartBlueTooth: boolean = false;
  11.   @State userGrant: boolean = false;
  12.   async aboutToAppear() {
  13.     await this.requestBlueToothPermission();
  14.     let state = access.getState();
  15.     console.log(this.TAG, "getState state: " + state);
  16.     if(state == 2){
  17.       this.isStartBlueTooth = true;
  18.     }else{
  19.       this.isStartBlueTooth = false;
  20.     }
  21.   }
  22.   // 用户申请权限
  23.   async reqPermissionsFromUser(): Promise<number[]> {
  24.     let context = getContext() as common.UIAbilityContext;
  25.     let atManager = abilityAccessCtrl.createAtManager();
  26.     let grantStatus = await atManager.requestPermissionsFromUser(context, ['ohos.permission.ACCESS_BLUETOOTH']);
  27.     return grantStatus.authResults;
  28.   }
  29.   // 用户申请蓝牙权限
  30.   async requestBlueToothPermission() {
  31.     let grantStatus = await this.reqPermissionsFromUser();
  32.     for (let i = 0; i < grantStatus.length; i++) {
  33.       if (grantStatus[i] === 0) {
  34.         // 用户授权,可以继续访问目标操作
  35.         this.userGrant = true;
  36.       }
  37.     }
  38.   }
  39.   setBlueToothState =()=>{
  40.     try {
  41.       if(!this.isStartBlueTooth){
  42.         BlueToothMgr.Ins().setBlueToothAccess(true);
  43.       }else{
  44.         BlueToothMgr.Ins().setBlueToothAccess(false);
  45.       }
  46.       let state = access.getState();
  47.       if(state == 2){
  48.         this.isStartBlueTooth = true;
  49.       }else{
  50.         this.isStartBlueTooth = false;
  51.       }
  52.       console.log(this.TAG, "getState state: " + state);
  53.     } catch (err) {
  54.       console.error(this.TAG,'errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
  55.     }
  56.   }
  57.   build() {
  58.     RelativeContainer() {
  59.       if(this.userGrant){
  60.         Text("蓝牙状态:" + this.isStartBlueTooth ? "开启" : "关闭")
  61.           .id('HelloWorld')
  62.           .fontSize(50)
  63.           .fontWeight(FontWeight.Bold)
  64.           .alignRules({
  65.             center: { anchor: '__container__', align: VerticalAlign.Center },
  66.             middle: { anchor: '__container__', align: HorizontalAlign.Center }
  67.           })
  68.           .onClick(this.setBlueToothState)
  69.       }
  70.     }
  71.     .height('100%')
  72.     .width('100%')
  73.   }
  74. }
复制代码
加权限设置:

  1.     "requestPermissions": [
  2.       {
  3.         "name" : "ohos.permission.ACCESS_BLUETOOTH",
  4.         "reason": "$string:permission_name",
  5.         "usedScene": {
  6.           "abilities": [
  7.             "EntryAbility"
  8.           ],
  9.           "when":"inuse"
  10.         }
  11.       }
  12.     ]
复制代码
操纵日志:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

数据人与超自然意识

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

标签云

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