【鸿蒙蓝牙连接】

news2024/9/20 22:43:52

鸿蒙蓝牙连接

  • ble.startBLEScan

startBLEScan(filters: Array, options?: ScanOptions): void
发起BLE扫描流程。
需要权限:ohos.permission.ACCESS_BLUETOOTH
在这里插入图片描述

import { BusinessError } from '@ohos.base';
function onReceiveEvent(data: Array<ble.ScanResult>) {
    console.info('BLE scan device find result = '+ JSON.stringify(data));
}
try {
    ble.on("BLEDeviceFind", onReceiveEvent);
    let scanFilter: ble.ScanFilter = {
            deviceId:"XX:XX:XX:XX:XX:XX",
            name:"test",
            serviceUuid:"00001888-0000-1000-8000-00805f9b34fb"
        };
    let scanOptions: ble.ScanOptions = {
    interval: 500,
    dutyMode: ble.ScanDuty.SCAN_MODE_LOW_POWER,
    matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE,
    }
    ble.startBLEScan([scanFilter],scanOptions);
} catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
}
  • ble.stopBLEScan

stopBLEScan(): void
停止BLE扫描流程。
需要权限:ohos.permission.ACCESS_BLUETOOTH

import { BusinessError } from '@ohos.base';
try {
    ble.stopBLEScan();
} catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
}
  • connect
    connect(): void
    client端发起连接远端蓝牙低功耗设备。
    需要权限:ohos.permission.ACCESS_BLUETOOTH
import { BusinessError } from '@ohos.base';
try {
    let device: ble.GattClientDevice = ble.createGattClientDevice('XX:XX:XX:XX:XX:XX');
    device.connect();
} catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
}
  • disconnect
    disconnect(): void
    client端断开与远端蓝牙低功耗设备的连接。
    需要权限:ohos.permission.ACCESS_BLUETOOTH
import { BusinessError } from '@ohos.base';
try {
    let device: ble.GattClientDevice = ble.createGattClientDevice('XX:XX:XX:XX:XX:XX');
    device.disconnect();
} catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
}
  • 下面是测试例子:
import { BusinessError } from '@ohos.base';
import ble from '@ohos.bluetooth.ble';
import { TAG } from '@ohos/hypium/src/main/Constant';

@Entry
@Component
struct BluetoothText {
  @State message: string = '蓝牙测试界面';
  @State scanResults: Array<string> = [];  // 存储扫描结果
  private scannedDeviceIds: Set<string> = new Set();  // 存储已经扫描到的设备ID
  private targetDeviceId: string = "7C:87:CE:1D:DF:F2";  // 目标设备的Device ID
  private gattClientDevice: ble.GattClientDevice | null = null;
  mBorder: BorderOptions = { radius: 10, color: '#385E0F', width: 1 };
  fontSize = 16
  mColor: string = '#2E8B57'

  build() {
    Row() {
      Column() {
        // 显示当前状态信息
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Row() {
          Button("连接")
            .fontSize(this.fontSize)
            .height('60%')
            .width('40%')
            .border(this.mBorder)
            .backgroundColor(this.mColor)
            .onClick(() => {
              this.startBLEScan();
            });
          Button("停止")
            .fontSize(this.fontSize)
            .height('60%')
            .width('40%')
            .border(this.mBorder)
            .backgroundColor(this.mColor)
            .onClick(() => {
              this.stopBLEScan();
            });
        }.width('30%').height('10%').padding({ left: 10, right: 10 })

        // 滚动容器,用于显示扫描结果列表
        Scroll() {
          Column() {  // 使用 Column 作为 Scroll 的唯一子组件
            ForEach(this.scanResults, (result: string) => {
              Text(result)
                .fontSize(20)
                .fontColor(Color.Black)
                .padding(10)
            })
          }
        }
        .height('80%')  // 设置滚动区域高度
        .width('100%')
      }
      .width('100%')
    }
    .height('100%')
  }

  startBLEScan() {// 使用箭头函数定义
    try {
      ble.on("BLEDeviceFind", this.onReceiveEvent);  // 直接传递引用
      let scanFilter: ble.ScanFilter = {
        deviceId: this.targetDeviceId,
      };

      let scanOptions: ble.ScanOptions = {
        interval: 500,
        dutyMode: ble.ScanDuty.SCAN_MODE_LOW_POWER,
        matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE,
      };

      ble.startBLEScan([scanFilter], scanOptions);

      this.message = 'Scanning...';
    } catch (err) {
      console.error('errCode: ' + err.code + ', errMessage: ' + err.message);
      this.message = 'Scan failed: ' + err.message;
    }
  }

  onReceiveEvent = (data: Array<ble.ScanResult>) => {
    console.info('BLE scan device find result = ' + JSON.stringify(data));

    let newResults = data.map((device) => {
      if (!this.scannedDeviceIds.has(device.deviceId)) {
        this.scannedDeviceIds.add(device.deviceId);  // 添加设备ID到集合中

        if (device.deviceId === this.targetDeviceId) {
          // 创建并连接到 GATT 客户端设备
          try {
            this.gattClientDevice = ble.createGattClientDevice(device.deviceId);
            this.gattClientDevice.connect();
            console.debug(TAG,"连接成功")
          } catch (err) {
            console.error('创建GATT客户端设备失败,errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
            this.message = '创建GATT客户端设备失败';
          }
        }
        console.debug(TAG,`Device Name: ${device.deviceName || 'Unknown'}, Device ID: ${device.deviceId}`);
        return `Device Name: ${device.deviceName || 'Unknown'}, Device ID: ${device.deviceId}`;
      }
      return null;
    }).filter(result => result !== null);  // 过滤掉 null 值

    this.scanResults = [...this.scanResults, ...newResults as string[]];  // 合并新旧结果
    this.message = 'Scan result received!';
  }

  //停止蓝牙扫描
  stopBLEScan(){
    try {
      ble.stopBLEScan();
      this.gattClientDevice?.disconnect();
    } catch (err) {
      console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
  }
}

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

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

相关文章

【iOS】暑期学习总结

暑期学习总结 前言无限轮播图换头像简单的网络请求UISearchController 前言 暑假在学校完成了五个项目&#xff0c;总的来说学习到了很多新的知识&#xff0c;这里对暑假中学习的内容进行一个小的总结&#xff0c;整理一些个人认为比较重点的内容。 无限轮播图 无限轮播图的…

PDF转换成Excel哪家强?热门工具大比拼

现在咱们周围电脑和手机一大堆&#xff0c;PDF和Excel这两种文件格式特别流行&#xff0c;不管是学习、工作还是平时生活&#xff0c;都能派上用场。但有时候&#xff0c;我们需要把PDF文件里的表格信息转换成Excel格式&#xff0c;这样处理和分析起来更方便。市面上有很多工具…

LabVIEW如何用数字判断布尔数组位置

问&#xff1a;在LabVIEW中&#xff0c;我有一个布尔数组&#xff0c;每次只有一位为True。我想通过判断这个数组对应的数字值来确定哪个位置为True&#xff0c;该如何实现&#xff1f; 答&#xff1a; 你可以将布尔数组转换为一个数字&#xff0c;并通过判断该数字的值来确定…

Java学习中误用 == 比较对象怎么办?

在Java编程中&#xff0c;操作符的误用是一个常见的陷阱&#xff0c;尤其是在比较对象时。理解和正确使用对象的比较机制对编写健壮的、无错误的Java程序至关重要。 一、Java中的操作符 在Java中&#xff0c;操作符用于比较两个变量的值。对于基本数据类型&#xff08;如int、…

element table 表格 span-method 某一列进行相同合并 支持树结构表格

须知 这是 vue2 版本&#xff0c;不过理论上 vue3 也能参考使用 可以直接打开 codepen 查看代码 效果图 代码 打不开 codepen 或者codepen 失效&#xff0c;查看下面代码参考 <script src"//unpkg.com/vue2/dist/vue.js"></script> <script src&…

【加密社】比特币海量数据问题解决方案

加密社 比特币是无敌的存在&#xff0c;刚翻了一遍中本聪的论文&#xff08;其实以前看过一次&#xff0c;那时不明觉厉&#xff09;&#xff0c;发现咱们一直在考虑的问题&#xff0c;基本都能在其论文上找到解决方案了。。 现在出现的这些问题&#xff0c;完全是因为bitcoin…

GS-SLAM论文阅读笔记--GSFusion

介绍 GS-SLAM是最近比较新的方向&#xff0c;由于传统SLAM的研究变得很少&#xff0c;拥抱与新的技术结合的方法也许是个好主意。之前总结了大部分GS-SLAM的文章。但是这个方向在不断发展&#xff0c;而发展初期的很多论文值得参考。所以用博客记录一下比较新的论文阅读笔记。…

代码随想录算法训练营第七天|LeetCode 334.反转字符串、541反转字符串II、151反转字符串中的单词

一、LeetCode 334.反转字符串 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a;编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修…

万字长文浅谈三高系统建设方法论和实践

1 概述 整个软件的发展历程是一部软件复杂性对抗史&#xff0c;软件的复杂性分为技术复杂性和业务复杂性&#xff0c;业务复杂性主要是建模和抽象设计&#xff0c;技术复杂性主要是三高&#xff08;高性能&#xff0c;高并发&#xff0c;高可用&#xff09;的应对&#xff0c;…

高中生护眼台灯哪个牌子好?五款性价比高的护眼台灯测评结果

现在市面上形形色色的打着“护眼”口号的台灯太多了&#xff0c;因为眼睛对于我们来说很重要&#xff0c;我们看到美丽的事物都因为有他&#xff0c;所以大家一听到护眼就会选择购买。很多商家为了赚钱&#xff0c;随便贴个标签就说护眼&#xff0c;其实一点用都没有。高中生护…

九源基因第二大客户是供应商:国内分销商减少250家,押注减肥药

《港湾商业观察》廖紫雯 日前&#xff0c;杭州九源基因工程股份有限公司&#xff08;以下简称&#xff1a;九源基因&#xff09;二闯港交所&#xff0c;保荐机构为华泰国际、中信证券。此前&#xff0c;公司曾于1月向港交所提交过上市申请&#xff0c;但后续未有相关进展。 招…

Vue Element Plus el-select 使用 filterable 搜索下 @blur 事件绑定失效

失效原因 使用 filterable 导致 blur 事件绑定在输入框上&#xff0c;而不是整个选择器上 当点击选项时&#xff0c;输入框失去焦点触发 blur 事件 而点击其她位置收起下拉款的时候&#xff0c;并不会触发输入款的 blur 事件 解决方案 使用 element 提供的 visible-change …

【嵌入式学习笔记】---- 时钟源时钟树 RCC

微观引入时钟源 在芯片内部&#xff0c;布满了各种逻辑电路&#xff0c;通过数字信号进行通信 假设芯片内部存在如下这种逻辑电路&#xff1a; ①状态&#xff1a;当A、B均输入1时&#xff0c;与门输出1&#xff0c;异或门输出0&#xff0c;故此时寄存器的值为0 ②状态&…

文件被误删?找回电脑删除的文件,这4招很好用

在日常使用电脑的过程中&#xff0c;不小心误删重要文件的情况时有发生&#xff0c;让人心急如焚。但别担心&#xff0c;只要掌握了一些实用的方法&#xff0c;你就有可能轻松找回那些看似已经消失的文件。今天&#xff0c;就为大家分享四招非常有效的找回电脑删除文件的方法&a…

Java笔试面试题AI答之正则表达式(2)

文章目录 7. 简述Java正则表达式零宽断言 &#xff1f;8. 简述Java正则表达式贪婪与懒惰 &#xff1f;贪婪匹配&#xff08;Greedy Matching&#xff09;懒惰匹配&#xff08;Lazy Matching&#xff09;区别与应用示例 9. 简述Java正则表达式POSIX 字符类&#xff08;仅 US-ASC…

docker安装prometheus、grafana监控SpringBoot

1. 概述 最新有一个需求&#xff0c; 需要安装一个监控软件&#xff0c;对SpringBoot程序进行监控&#xff0c; 包括机器上cpu, 内存&#xff0c;jvm以及一些日志的统计。 这里需要介绍两款软件&#xff1a; prometheus 和 grafana prometheus: 中文名称&#xff0c; 普罗米…

OpenCV 与 Matplotlib 的结合使用:探索有趣的图像处理与可视化功能

本文将讲述&#xff0c;将 OpenCV 与 Matplotlib 相结合&#xff0c;可以充分利用两者的优势&#xff0c;实现丰富多彩的图像处理和数据可视化功能。本文将介绍几种有趣且实用的结合应用&#xff0c;并通过示例代码展示具体实现方式。在今后的博客中会扩展下面的十个基础实现以…

宝贝甜梦秘籍!康姿百德柔压磁性枕豪华款守护成长每一夜

科学护航童年梦&#xff01;康姿百德豪华柔压磁性枕&#xff0c;给孩子五星级的睡眠享受 孩子的成长过程中&#xff0c;良好的睡眠环境至关重要。而康姿百德柔压磁性枕&#xff08;豪华款&#xff09;&#xff0c;凭借其独特的设计和材料&#xff0c;成为了孩子成长过程中不可…

乐凡三防平板高性能为稳定运行保驾护航

随着科技进步的浪潮&#xff0c;三防工业平板电脑在自动化生产、设备监控及数据收集等场景中日益彰显其关键作用。但在特定环境&#xff0c;比如户外探险、紧急救援或电力供应不稳定的场合&#xff0c;维持设备的持续运行成为了一大挑战。因此&#xff0c;开发一款配备可更换电…

运动耳机怎么选购?解密最值得购买的五大品牌!

​到了2024年&#xff0c;开放式耳机已经成为耳机界的大热门。它们的好处是&#xff0c;既能让你听得健康&#xff0c;戴着又舒服&#xff0c;还能一边听歌一边留意周围的声音&#xff0c;这对于喜欢户外活动的人来说&#xff0c;能提高安全意识&#xff0c;是个很好的优势。作…