windows蓝牙驱动开发-蓝牙 LE 邻近感应配置文件

邻近感应检测是蓝牙低功耗 (LE) 的常见用途。 本部分提供了创建可用于开发 UWP 设备应用的邻近感应配置文件的设备实现的指南。

在开发此应用之前,应熟悉蓝牙 LE 函数和蓝牙 LE 邻近感应配置文件规范。

示例服务声明

蓝牙低功耗引入了一个新的物理层,该层与蓝牙基本速率共享相同的频率空间。 低功耗配置文件整理成所谓的泛型属性配置文件(或 GATT)。

GATT 配置文件声明了定义用例或场景的一个或多个服务。 若要开发合规的服务实现,必须对特征进行整理,使其符合在蓝牙特别兴趣组 (SIG) 开发人员网站上定义的已建立架构。

下图演示了特征在典型 GATT 服务内的结构方式。

蓝牙邻近感应配置文件

邻近感应配置文件定义了两个角色,旨在允许设备检测其邻近度。

这两个角色称为:

  • 邻近报告器
  • 邻近监视器

邻近报告器

邻近报告器必须是通用 ATTribute (GATT) 服务器。

邻近报告器支持以下 GATT 服务:

  • 链接中断服务(必需)
  • 即时警报服务(可选)
  • Tx 电源服务(可选)
邻近监视器

邻近监视器是 GATT 客户端。 它应创建和维护与邻近报告器的连接,并监视连接的无线电信号强度信息(或 RSSI),以计算信号的路径损失。 如果邻近报告器上提供了可选的 Tx 电源服务,它还可以通过从 Tx 电源级别减去 RSSI 来规范化 RSSI 值。

Windows 中对 GATT 的支持

当 GATT 设备与 Windows 配对时,该设备将成为系统的一部分。 Windows 提供设备对象来表示设备所报告的设备和主要服务。

Windows.Devices.Bluetooth.GenericAttributeProfile 命名空间描述了应用开发人员可在 Windows 中使用的通用属性配置文件 API。

开发设备应用时的第一步是确定该应用需要哪些蓝牙服务才能完成用户关心的场景。 对于邻近配置文件,设备应用需要使用链接中断服务,并根据需要使用即时警报服务和 Tx 电源服务。

设备应用应使用 Windows.Devices.Enumeration 命名空间中可用的 API 来确定与 Windows 配对的所有设备是否实现链接中断服务。 具体而言,请使用 DeviceInformation.FindAllAsync 方法。

DeviceInformation.FindAllAsync 方法采用 AQS(高级查询语法)设备选择器作为参数,以便仅筛选包含链接中断服务的设备。 设备应用开发人员还可以使用 GattDeviceService 类的 GetDeviceSelectorFromUuid 或 GetDeviceSelectorFromShortId 方法,因此无需手动构造 AQS 筛选器。

链接中断服务是由蓝牙 SIG 定义的蓝牙 GATT 服务,因此可以使用短 ID 而非完全限定的 UUID。

为邻近配置文件服务分配的短 ID 服务 ID 为:

服务名称短 ID
链接中断0x1803
即时警报0x1802
Tx 电源0x1804

蓝牙 SIG 会维护分配号码文档中服务的最新列表。

确定要使用的服务后,调用 GattDeviceService.FromIdAsync 以获取该服务的实例。

获取有效的 GattDeviceService 对象后,使用该对象通过 Windows.Devices.Bluetooth.GenericAttributeProfile API 与设备通信。

这些 API 允许访问特定服务及其对象(例如包含的服务、特征和描述符),以及读取和写入功能。

高效使用电源

Windows 中对蓝牙低功耗的支持非常注重高效地使用电源。 这包括减少本地蓝牙无线电适配器的功耗,以及尽可能降低 CPU 使用率。

因此,若要建立蓝牙 LE 连接,应用需要为 GattCharacteristic.ValueChanged 事件注册处理程序。 或者,应用必须调用 GattCharacteristic.ReadValueAsync、GattCharacteristic.WriteValueAsync 或 GattCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync 中的任何方法,而无需指定 BluetoothCacheMode.Cached 选项。

为了最大程度地减少能耗,Windows 不会通过轮询本地蓝牙无线电控制器来主动监视链接的 RSSI 值。

配置文件实现详细信息

若要实现节能设计,设备实现必须遵守特定要求,以确保它们与 Windows 保持兼容。

以下子主题介绍了可高效使用电源的设备端要求,并描述一种可以监视连接状态的技术。

建立连接

当应用程序具有为 GattCharacteristic.ValueChanged 事件注册的处理程序时,Windows 会自动连接到设备。 但是,邻近感应配置文件中所含服务的基本定义不包含任何指示性或可识别的特征。 设备可以将包含指示性或可识别特征的服务添加到邻近感应配置文件中包含的服务。 这意味着邻近设备必须至少支持一个指示性或可识别的特征值,并且应用程序必须将至少一个处理程序注册到 GattCharacteristic.ValueChanged 事件,以便自动建立连接。

检测连接中断

与蓝牙邻近感应配置文件中的提及一样,Windows 8.1 不会公开蓝牙连接的 RSSI 值。 因此,应用无法使用 RSSI 值来计算连接路径损失。 相反,我们建议设备将其邻近感应绑定到链接中断事件。

监视连接状态

应用可以使用 PnpObjectWatcher 监视 GATT 设备的连接状态,以及监视服务设备对象的 PnP“Connected”属性。

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

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

相关文章

模型 冗余系统(系统科学)

系列文章分享模型,了解更多👉 模型_思维模型目录。为防故障、保运行的备份机制。 1 冗余系统的应用 1.1 冗余系统在企业管理中的应用-金融行业信息安全的二倍冗余技术 在金融行业,信息安全是保障业务连续性和客户资产安全的关键。随着数字化…

AI绘画社区:解锁艺术共创的无限可能(9/10)

AI 绘画:不只是技术,更是社交新潮流 在科技飞速发展的今天,AI 绘画早已不再仅仅是一项孤立的技术,它正以惊人的速度融入我们的社交生活,成为艺术爱好者们交流互动的全新方式,构建起一个充满活力与创意的社…

DeepSeek使用技巧大全(含本地部署教程)

在人工智能技术日新月异的今天,DeepSeek 作为一款极具创新性和实用性的 AI,在众多同类产品中崭露头角,凭借其卓越的性能和丰富的功能,吸引了大量用户的关注。 DeepSeek 是一款由国内顶尖团队研发的人工智能,它基于先进…

IDEA - 一个启动类多次启动方法

More Run/Debug -> Modify Run Configuration -> modify options -> Allow mutiple instances

Android Studio 配置 Gerrit Code Review

很多大厂(华为、荣耀)的大型项目都有gerrit代码审查流程,那么我们如何实现不手动敲命令行,就在Android Studio中像平常开发一样,只需要用鼠标点点点,就能将代码推送到gerrit审查仓呢,现在就来跟…

TypeScript 中的对象类型:深入理解接口和类型别名

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Java基础】序列化、反序列化和不可变类

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:Java基础面经 📚本系列文章为个…

吴恩达深度学习——卷积神经网络的特殊应用

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习使用。 文章目录 人脸识别相关定义Similarity函数使用Siamese网络实现函数d使用Triplet损失学习参数 神经风格迁移深度卷积网络可视化神经风格迁移的代价函数内容损失函数风格损失函数 人脸识别 …

搭建linux qt5.6环境

文章目录 准备工作步骤测试 准备工作 1、linux虚拟机环境 2、linux qt安装包相关文件,本文采用压缩包方式 步骤 1)启动虚拟机并登入 2)打开linux终端命令行,ifconfig获取当前linux环境的ip 3)使用WinSCP设置好ip、…

C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输

CURL开源库介绍 CURL 是一个功能强大的开源库,用于在各种平台上进行网络数据传输。它支持众多的网络协议,像 HTTP、HTTPS、FTP、SMTP 等,能让开发者方便地在程序里实现与远程服务器的通信。 CURL 可以在 Windows、Linux、macOS 等多种操作系…

【产品小白】用户调研的需求是否都采纳?

在用户调研中,并非所有需求都应被直接采纳,而应通过系统分析转化为符合产品战略的有效决策。以下是关键思考框架: 1. 用户需求 ≠ 产品需求 矛盾性:用户个体需求可能相互冲突(如A功能的去留),需…

如何导入第三方sdk | 引入第三方jar 包

0. 背景1. 上传私有仓库2. 使用本地文件系统 0. 背景 对接一些第三方功能,会拿到第三方的sdk,也就是jar包,如何导入呢 1. 上传私有仓库 最好的方式就是将第三方jar包,上传到私有的仓库,这样直接正常在pom引用即可如果只…

基础入门-网站协议身份鉴权OAuth2安全Token令牌JWT值Authirization标头

知识点: 1、网站协议-http/https安全差异(抓包) 2、身份鉴权-HTTP头&OAuth2&JWT&Token 一、演示案例-网站协议-http&https-安全测试差异性 1、加密方式 HTTP:使用明文传输,数据在传输过程中可以被…

07苍穹外卖之redis缓存商品、购物车(redis案例缓存实现)

课程内容 缓存菜品 缓存套餐 添加购物车 查看购物车 清空购物车 功能实现:缓存商品、购物车 效果图: 1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压…

DeepSeek-R1 本地大模型搭建对接API

DeepSeek-R1 在这里将学到很多知识 欢迎使用使用DeepSeek-R1本地大模型DeepSeek 的模型基础说明DeepSeek的本地 API 说明DeepSeek 本地模型搭建1、执行命令安装及测试 DeepSeek-R1 API接口调用当然,我们为了让用户更加便捷,我们把API 接口全部放到上面截…

【0404】Postgres内 实现分配一个新的 Object ID (OID)

文章目录 1. 分配一个新 Object ID (OID)1.1 ShmemVariableCache 中 nextOid1.2 写一个 NEXTOID log record1. 分配一个新 Object ID (OID) Postgres内核中分配一个新的 Oid 是由函数 GetNewObjectId() 实现。该函数声明于 transam.h,实现于 varsup.c 源文件。 对于 GetNewO…

250207-MacOS修改Ollama模型下载及运行的路径

在 macOS 上,Ollama 默认将模型存储在 ~/.ollama/models 目录。如果您希望更改模型的存储路径,可以通过设置环境变量 OLLAMA_MODELS 来实现。具体步骤如下: 选择新的模型存储目录:首先,确定您希望存储模型的目标目录路…

Ubuntu20.4软件应用打不开

安装 snap-store: 确保 Snap 已安装: Snap 是一个包管理系统,需要先确保 snapd 已经安装。如果系统中没有安装,可以通过以下命令来安装 Snap: sudo apt update sudo apt install snapd安装 snap-store: 使…

深入解析:React 事件处理的秘密与高效实践

在 React 中,事件处理是构建交互式应用的核心。本文将带你深入探索 React 事件处理的机制、最佳实践以及如何避免常见陷阱,助你写出更高效、更健壮的代码。 1. React 事件处理的独特之处 合成事件(SyntheticEvent) React 使用合…

单片机之基本元器件的工作原理

一、二极管 二极管的工作原理 二极管是一种由P型半导体和N型半导体结合形成的PN结器件,具有单向导电性。 1. PN结形成 P型半导体:掺入三价元素,形成空穴作为多数载流子。N型半导体:掺入五价元素,形成自由电子作为多…