首页 > 其他分享 >【HarmonyOS】鸿蒙应用蓝牙功能实现 (一)

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

时间:2024-08-15 18:25:59浏览次数:12  
标签:BlueToothMgr 鸿蒙 btStateMessage 蓝牙 access HarmonyOS STATE let

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

前言

蓝牙技术是一种无线通信技术,可以在短距离内传输数据。它是由爱立信公司于1994年提出的,使用2.4 GHz的ISM频段,可以在10米左右的距离内进行通信。可以用于连接手机、耳机、音箱、键盘、鼠标、打印机等各种设备。

特点是低功耗、低成本、简单易用。目前已经发展到了第五代,支持更高的数据传输速率和更广的覆盖范围。

蓝牙实现原理

蓝牙的实现原理是基于无线电技术的短距离通信协议,使用2.4GHz频段的无线电波进行通信,使用频率跳跃技术(Frequency Hopping Spread Spectrum,FHSS)来避免与其他无线设备的干扰。
在通信过程中,蓝牙设备会发送和接收数据包,并且使用不同的蓝牙协议来控制通信流程和数据传输。

在这里插入图片描述
蓝牙跳频技术的原理

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

DEMO示例

以下为蓝牙开关和状态控制

import { access } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';

export class BlueToothMgr {

  private static mBlueToothMgr: BlueToothMgr | undefined = undefined;

  public Ins(){
    if(BlueToothMgr.mBlueToothMgr){
      BlueToothMgr.mBlueToothMgr = new BlueToothMgr();
    }
    return BlueToothMgr.mBlueToothMgr;
  }

  // STATE_OFF	0	表示蓝牙已关闭。
  // STATE_TURNING_ON	1	表示蓝牙正在打开。
  // STATE_ON	2	表示蓝牙已打开。
  // STATE_TURNING_OFF	3	表示蓝牙正在关闭。
  // STATE_BLE_TURNING_ON	4	表示蓝牙正在打开LE-only模式。
  // STATE_BLE_ON	5	表示蓝牙正处于LE-only模式。
  // STATE_BLE_TURNING_OFF	6	表示蓝牙正在关闭LE-only模式。

  /**
   * 设置蓝牙访问(开关状态)
   * @param isAccess true: 打开蓝牙
   */
  setBlueToothAccess(isAccess: boolean){
    try {
      if(isAccess){
        access.enableBluetooth();
        access.on('stateChange', (data: access.BluetoothState) => {
          let btStateMessage = this.switchState(data);
          if (btStateMessage == 'STATE_ON') {
            access.off('stateChange');
          }
          console.info('bluetooth statues: ' + btStateMessage);
        })
      }else{
        access.disableBluetooth();
        access.on('stateChange', (data: access.BluetoothState) => {
          let btStateMessage = this.switchState(data);
          if (btStateMessage == 'STATE_OFF') {
            access.off('stateChange');
          }
          console.info("bluetooth statues: " + btStateMessage);
        })
      }
    } catch (err) {
      console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
  }

  private switchState(data: access.BluetoothState){
    let btStateMessage = '';
    switch (data) {
      case 0:
        btStateMessage += 'STATE_OFF';
        break;
      case 1:
        btStateMessage += 'STATE_TURNING_ON';
        break;
      case 2:
        btStateMessage += 'STATE_ON';
        break;
      case 3:
        btStateMessage += 'STATE_TURNING_OFF';
        break;
      case 4:
        btStateMessage += 'STATE_BLE_TURNING_ON';
        break;
      case 5:
        btStateMessage += 'STATE_BLE_ON';
        break;
      case 6:
        btStateMessage += 'STATE_BLE_TURNING_OFF';
        break;
      default:
        btStateMessage += 'unknown status';
        break;
    }
    return btStateMessage;
  }
}

import { access } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { BlueToothMgr } from '../manager/BlueToothMgr';
import { abilityAccessCtrl, common } from '@kit.AbilityKit';

@Entry
@Component
struct Index {

  private TAG: string = "BlueToothTest";

  // 蓝牙状态
  @State isStartBlueTooth: boolean = false;
  @State userGrant: boolean = false;

  async aboutToAppear() {
    await this.requestBlueToothPermission();

    let state = access.getState();
    console.log(this.TAG, "getState state: " + state);
    if(state == 2){
      this.isStartBlueTooth = true;
    }else{
      this.isStartBlueTooth = false;
    }
  }

  // 用户申请权限
  async reqPermissionsFromUser(): Promise<number[]> {
    let context = getContext() as common.UIAbilityContext;
    let atManager = abilityAccessCtrl.createAtManager();
    let grantStatus = await atManager.requestPermissionsFromUser(context, ['ohos.permission.ACCESS_BLUETOOTH']);
    return grantStatus.authResults;
  }

  // 用户申请蓝牙权限
  async requestBlueToothPermission() {
    let grantStatus = await this.reqPermissionsFromUser();
    for (let i = 0; i < grantStatus.length; i++) {
      if (grantStatus[i] === 0) {
        // 用户授权,可以继续访问目标操作
        this.userGrant = true;
      }
    }
  }

  setBlueToothState =()=>{
    try {
      if(!this.isStartBlueTooth){
        BlueToothMgr.Ins().setBlueToothAccess(true);
      }else{
        BlueToothMgr.Ins().setBlueToothAccess(false);
      }
      let state = access.getState();
      if(state == 2){
        this.isStartBlueTooth = true;
      }else{
        this.isStartBlueTooth = false;
      }
      console.log(this.TAG, "getState state: " + state);
    } catch (err) {
      console.error(this.TAG,'errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
  }

  build() {
    RelativeContainer() {
      if(this.userGrant){
        Text("蓝牙状态:" + this.isStartBlueTooth ? "开启" : "关闭")
          .id('HelloWorld')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .alignRules({
            center: { anchor: '__container__', align: VerticalAlign.Center },
            middle: { anchor: '__container__', align: HorizontalAlign.Center }
          })
          .onClick(this.setBlueToothState)
      }
    }
    .height('100%')
    .width('100%')
  }
}

加权限配置:在这里插入图片描述

    "requestPermissions": [
      {
        "name" : "ohos.permission.ACCESS_BLUETOOTH",
        "reason": "$string:permission_name",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when":"inuse"
        }
      }
    ]

操作日志:
在这里插入图片描述

标签:BlueToothMgr,鸿蒙,btStateMessage,蓝牙,access,HarmonyOS,STATE,let
From: https://blog.csdn.net/u010949451/article/details/141170173

相关文章

  • 【HarmonyOS Next】Unity(团结引擎)对接HarmonyOS
    一、环境UnityTuanjieV1.2.3DevEcoStudioNEXTDeveloperBeta1-BuildVersion:5.0.3.402二、官方资料参考Unity鸿蒙:https://docs.unity.cn/cn/tuanjiemanual/Manual/openharmony.htmlC#调用鸿蒙ArkTS:https://docs.unity.cn/cn/tuanjiemanual/Manual/openharmon......
  • 鸿蒙HarmonyOS NEXT:使用axios方法请求实时天气数据
    通过axios方法请求高德天气查询api,实现获取实时天气数据,接下来是实现步骤:模块导入与数据准备:通过以下语句导入了必要的模块和数据:importaxios,{AxiosResponse,AxiosError}from'@ohos/axios'//导入axiosimport{cities}from'./tools/citys';//调用事先存好的城......
  • 零基础STM32单片机编程入门(三十四) JDY-31蓝牙模块实战含源码
    文章目录一.概要二.JDY-31蓝牙模块主要性能参数三.JDY-31蓝牙模块主芯片BK3432内部框图四.BK3432参考设计五.JDY-31蓝牙模块与单片机通讯方法1.与STM32F103板子硬件连接2.JDY-31蓝牙模块AT指令介绍六.STM32单片机与JDY-31蓝牙模块通讯实验1.硬件准备2.软件工程3.软......
  • 在鸿蒙中如何实现pdf预览功能?
    在开发鸿蒙App时,你是否做过pdf预览功能,是否也和我一样碰壁了,那么来看看我是如何解决的吧,废话少说,直接上代码。在鸿蒙中如何实现pdf预览功能?一、预览本地pdf文件二、预览线上的pdf文件三、预览沙箱目录中pdf的文件(重点)四、建议一、预览本地pdf文件预览本地的pdf文......
  • HarmonyOS应用开发者高级认证(一)
    1、依次点击A、B、C、D四个按钮,其中不会触发UI刷新的是:答案: Button("C").onClick(()=>{this.nameList[0].name="Jim"})分析:直接更新非一级数据不会触发UI刷新2、如果要实现Row组件内的子元素均匀排列,且第一个元素与行首对齐,最后一个......
  • 【鸿蒙学习】HarmonyOS应用开发者基础 - 应用程序框架基础
    从第一节的学习到现在,学习的人数越来越少,要相信,坚持学习下去的将会获得相应的收获。加油少年!!!一、应用框架基础1.应用  用户应用程序泛指运行在设备的操作系统之上,为用户提供特定服务的程序,简称“应用”。一个应用所对应的软件包文件,称为“应用程序包”。2.Module......
  • HarmonyOS NEXT 学习笔记6--prop装饰器-单向传递
    1.代码:@Entry@ComponentstructComponentQuestionCase{@Statemoney:number=999999;build(){Column(){Text('father:'+this.money)Button('存100块').onClick(()=>{this.money+=100})......
  • 鸿蒙-JS-第二周day01
    数组1什么是数组1)数组是值的有序集合。2)每个值叫做一个元素。3)每个元素在数组中有一个位置,以数字表示,称为索引(有时也称为下标)。4)数组的元素可以是任何类型。5)数组索引从0开始,数组最大能容纳4294967295个元素。2创建数组2.1使用数组直接量//......
  • 鸿蒙开发Core Speech Kit(基础语音服务)
    CoreSpeechKit是鸿蒙操作系统(HarmonyOS)提供的一个强大的开发工具包,主要用于语音识别、语音合成等语音相关的功能开发。这个工具包为开发者提供了多种语音处理能力,可以用来开发语音助手、智能家居、车载系统等需要语音交互的应用。以下是CoreSpeechKit的一些主要功......
  • HarmonyOS Developer之手势事件
    概述手势表示由单个或多个事件识别的语义动作(例如:点击、拖动和长按)。一个完整的手势也可能由多个事件组成,对应手势的生命周期。支持的事件有:触摸touchstart:手指触摸动作开始。touchmove:手指触摸后移动。touchcancel:手指触摸动作被打断,如来电提醒、弹窗。touchend:手指......