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

news2024/11/15 5:57:57

【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';



struct Index {

  private TAG: string = "BlueToothTest";

  // 蓝牙状态
   isStartBlueTooth: boolean = false;
   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"
        }
      }
    ]

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工厂流水线MES报工一体机改善生产管理效率

作为智能制造的重要组成部分&#xff0c;MES系统&#xff08;制造执行系统&#xff09;在优化生产流程、提高生产效率、降低生产成本等方面发挥着不可替代的作用。而MES报工一体机作为MES系统的重要组成部分&#xff0c;更是帮助企业实现生产管理效率提升的利器。 一、MES报工一…

为何有了云计算,还需要边缘计算?EasyCVR视频平台助力数据高效汇聚与管理

在当今数字化的时代&#xff0c;云计算可谓是大名鼎鼎&#xff0c;它为我们的生活和工作带来了巨大的便利。但你有没有想过&#xff0c;既然有了强大的云计算&#xff0c;为什么还会出现边缘计算呢&#xff1f; 一、云计算与边缘计算&#xff1a;相辅相成的科技双雄 先来说说…

船员考证题库刷题

1、船舶主配电板系统&#xff0c;设有地气灯、配电板式兆欧表和低绝缘报警装置&#xff0c;及船舶照明分配电箱&#xff0c;当发生单相接地故障时而进行排查时&#xff0c;______设备是不能随意断电的。 A、厨房用电 B、卫星基站 C、起重机用电 答案&#xff1a;B 2、燃油…

修复或更换:螺杆机支撑座磨损后的处理选择

螺杆机后端支撑座磨损&#xff0c;主要是由于长期使用&#xff0c;润滑不足或使用劣质润滑油等原因导致的。当螺杆机支撑座出现磨损时&#xff0c;其承载能力会逐渐下降&#xff0c;加速磨损&#xff0c;导致设备运行不稳定&#xff0c;噪音增大&#xff0c;严重时还会导致设备…

老照片一键修复怎么做?6个软件帮助你快速进行老照片修复

老照片一键修复怎么做&#xff1f;6个软件帮助你快速进行老照片修复 老照片修复可以让陈旧、褪色或损坏的照片恢复到原有的光彩和清晰度。以下是六款方便好用的软件&#xff0c;能够帮助你快速进行老照片修复&#xff0c;且许多都支持一键操作。 智能修复老照片 这是一款专…

【Linux】守护进程:containerd的使用教程

这里写目录标题 前言一. ctr1.1 ctr CLI1.2 ctr 调试 二、 创建 container2.1 进入 NewContainer2.2 ContainerService().Create 前言 介绍了 kubelet 通过 cri 接口和 containerd 交互的过程&#xff0c;containerd 源码分析&#xff1a;启动注册流程 介绍了 containerd 作为…

屏幕防拍照技术:防止屏幕被拍照的方法有哪些?答案超乎想象!

“防身立命&#xff0c;安内攘外。” 在数字化时代&#xff0c;信息安全已成为企业乃至个人不可忽视的重要议题。 屏幕作为信息展示的主要窗口&#xff0c;其安全性尤为关键。 然而&#xff0c;随着拍照技术的日益普及与精进&#xff0c;屏幕内容被轻易捕捉并泄露的风险也随…

暗区突围辅助攻略:VMOS云手机硬核辅助!农场地图攻略大全!

在《暗区突围》中&#xff0c;了解地图和撤离点的分布对于游戏的胜利至关重要。使用VMOS云手机进行游戏辅助&#xff0c;可以为你带来显著的优势。VMOS云手机专门针对《暗区突围》进行了定制&#xff0c;内置游戏安装包&#xff0c;无需重新下载安装游戏。它能够实现24小时云端…

您看这篇就够了:ComfyUI 新手指南

欢迎来到 ComfyUI 的神奇世界&#xff0c;这是 Stable Diffusion 的一个强大而灵活的图形用户界面。无论你是数字艺术的新手&#xff0c;还是希望将你的图像创作提升到新高度的老手&#xff0c;ComfyUI 都能满足你的需求。在这篇全面的指南中&#xff0c;我们将带你穿越 ComfyU…

初识C++ · IO流

前言&#xff1a; IO流&#xff0c;启动&#xff01;因笔者对于IO流的理解不是很深刻&#xff0c;所以这里进行简单的介绍即可。 1 IO流 IO流是我们从学习C开始就一直会使用的东西&#xff0c;我们先了解一下CIO流的一套继承体系&#xff1a; 整个IO体系的基类是ios_base&…

ArkTs基础语法

ArkTs基础语法 声明变量声明常量声明自动类型推断 类型基础类型NumberBooleanString 引用类型VoidObjectArrayEnumUnionAliases 语句if语句switch语句条件表达式 ?:for语句for of语句while语句do while语句breakcontinuethrow和try catch finally语句 函数函数声明可选参数Res…

MySQL中的锁事

一、概述 锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制&#xff0c;MySQL中的锁是在服务器层或者存储引擎层实现的&#xff0c;保证了数据访问的一致性与有效性。 事务的隔离性是由的锁来实现。 二、MySQL并发事务访问的问题 我们已经知道事务并发…

day-39 矩阵中的最大得分

思路 动态规划。利用一个二维数组记录对应位置可以达到的最高得分&#xff08;位置&#xff08;0,0&#xff09;不可能&#xff09;&#xff0c;然后找出最大值即可&#xff08;如果除了&#xff08;0,0&#xff09;上的值其他值都一样&#xff0c;则返回任意一个即可&#xff…

Python 3 入门基础知识 之数据容器及用法【2】 推荐

前面关于python的下载安装、如何定义变量&#xff0c;基本的数据类型&#xff0c;以及if条件语句、for循环语句&#xff0c;部分运算都进行了梳理总结。参考&#xff1a;Python 3 入门基础知识【1】数据类型 安装下载 推荐-CSDN博客 这里回顾一下python的数据容器基础知识&…

智能换热:图扑智慧供热可视化管理平台

图扑搭建智慧供热可视化管理平台&#xff0c;通过实时监控和数据分析提升运营效率&#xff0c;实现智能化管理&#xff0c;保障系统稳定与高效运行。

深挖Redis分布式缓存:你还在为缓存架构感到困惑吗?灵办AI为你揭开文献背后的秘密!

文章目录 1 灵办AI插件2 翻译~外文文献3 解释~文献标题分析4 文档解析~文献总结5 搜索~全网搜索总结6 总体评价~文献代码分析总结 本文将引用 Research and Application of Distributed Cache Based on Redis [1] 外文文献解读为案例进行剥削&#xff0c;进而提高对 Redis的分布…

相机光学(三十五)——三刺激值

0.参考链接 [1]三刺激值 [2]色差仪CIERGB和CIEXYZ光谱三刺激值区别 1.三刺激值的由来 根据杨-亥姆霍兹的三原色理论&#xff0c;色的感觉是由于三种原色光刺激的综合结果。在红、绿&#xff0c;蓝三原色系统中&#xff0c;红。绿、蓝的刺激量分别以R、G、B表示之。由于从实际…

安装开源软件ChatALL(齐叨)来聚合各大人工智能工具

安装开源软件ChatALL&#xff08;齐叨&#xff09;来聚合各大人工智能工具 前言 如果你跟我一样无论遇到什么问题都要询问人工智能&#xff0c;并且至少同时用4-5个公司的人工智能&#xff0c;选择一个最中意的结果 以前我都会用Chrome浏览器打开4个窗口&#xff0c;每个问题…

c语言中比较特殊的输入格式

目录 一.%[ ] 格式说明符 1.基本用法 (1)读取字母字符: (2)读取数字字符: (3)读取所有字符直到遇到空格: (4)读取直到换行符: 2.使用范围和组合: 3.^ 取反操作 4.注意事项 (1). 字符范围的正确表示 (2). 避免字符集中的特殊字符冲突 (3).避免空字符集 (4). 输入长…

C++竞赛初阶L1-11-第五单元-for循环(25~26课)510: T454422 均值

题目内容 给出一组样本数据&#xff0c;计算其均值。 输入格式 输入有两行&#xff0c;第一行包含一个整数&#xff0c;表示样本容量 n。 第二行包含 n 个浮点数 ai​&#xff0c;代表各个样本数据。 输出格式 输出一行&#xff0c;包含一个浮点数&#xff0c;表示均值。 …