AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77674630
Accepted
Charles Nicholson
Charles Nicholson
Asked: 2023-12-17 21:46:09 +0800 CST2023-12-17 21:46:09 +0800 CST 2023-12-17 21:46:09 +0800 CST

BLE 协议是否保证服务中多个特征的写入顺序?

  • 772

如果BLE服务包含GATT客户端表示兴趣的多个通知特征,那么BLE协议是否对GATT客户端收到更新值的订单有很大的保证?另外,对GATT客户端将新接收的数据提供到应用程序的顺序是否有任何协议级别的要求?

例如:说该应用程序在“安静”期间的连接事件之间快速连续的连续性更改Gatt服务器中两个单独特征的值。在下一个连接事件中,假设Gatt服务器有足够的时间和带宽,可以将两个更新的特征值全部传输到Gatt客户端。

BLE协议是否要求GATT服务器以应用程序更改的顺序传输新变化的值?

此外,BLE协议是否要求GATT客户端将这些新变化值的顺序保留到应用程序中?

我认为所有支持Bluetooth 5.0的BLE堆栈,但是很高兴知道此类版本是否已经改变了以前的版本。协议标准本身的任何特定引用将非常有帮助!

bluetooth-lowenergy
  • 1 1 个回答
  • 51 Views

1 个回答

  • Voted
  1. Best Answer
    Emil
    2023-12-18T02:00:43+08:002023-12-18T02:00:43+08:00

    另外,对GATT客户端将新接收的数据提供到应用程序的顺序是否有任何协议级别的要求?

    BLE协议是否要求GATT服务器以应用程序更改的顺序传输新变化的值?

    此外,BLE协议是否要求GATT客户端将这些新变化值的顺序保留到应用程序中?

    上述所有这些问题的答案也许令人惊讶的是“不适用”。当您阅读该标准时,软件库/sdk/api 实现由一个人编写的 GATT“核心”部分,然后由另一个人利用该库/sdk/api 编写单独的应用程序的整个概念根本不存在。蓝牙标准只是一个协议标准,即规定了两个设备如何相互通信的要求,而不是应用程序内部如何构造和实现的要求。请参阅蓝牙核心规范(当前版本为 5.4)中 GATT 章节第 2.1 节的协议栈图:

    GATT 协议栈

    如您所见,GATT是“应用程序”配置文件,ATT是您的应用程序所说的协议。如果您有一个内部管理队列的软件库,请派遣命令/通知到正确的线程等,以使您的工作更容易,那么这不是蓝牙标准的一部分,并且在此库中的任何愚蠢的设计错误都限制了协议的使用。 /最终应用程序开发人员的个人资料应该被视为“缺失功能”,而不是协议漏洞。

    然而,在某些情况下,该标准会建议一些允许的实施细节。在 ATT 章节中,您可以阅读“在非增强型 ATT 承载上,收到但由于缓冲区溢出而无法处理的通知应被丢弃。因此,这些 PDU 必须被视为不可靠”。

    如果 BLE 服务包含 GATT 客户端表示感兴趣的多个通知特征,那么 BLE 协议是否对 GATT 客户端接收更新值的顺序做出强有力的保证?

    为了回答这个问题,我将做出与标准相同的假设,即应用程序可以直接访问将 GATT 通知作为 ATT 数据包发送到下层 (L2CAP),并且 GATT 客户端直接接收 ATT 通知与从下层 (L2CAP) 接收的顺序相同。

    在通知方面,ATT 协议和 GATT 配置文件标准都没有提及任何有关有序交付的内容。相反,在推理有序交付时,通常会考虑底层协议。

    在蓝牙4.0-5.1中,仅存在“Unenhanced ATT bearer”,它是按顺序传递数据的固定L2CAP通道。因此,您至少可以在协议级别上期待有序交付。例如,HID 配置文件或多或少假定有序交付。否则,击键顺序可能会不正确。

    在蓝牙 5.2 中,引入了“增强型 ATT 承载”,以允许多个并发 ATT 事务(每个通信通道一个),这旨在加快同一设备上运行的多个“应用程序”与同一远程设备进行通信的情况。请注意,一次只能执行一个读请求或写请求,并且必须在收到前一个请求或写请求的响应后发送下一个请求。如果两个设备都支持此功能,并且您已向同一设备打开多个 ATT 承载,则如果通知通过单独的 ATT 承载发送,则您不能假定通知将传递到另一台设备的任何特定顺序,因为它们有自己的流量控制。因此,如果您需要有序交付,只需对这些通知使用相同的 ATT 承载即可。

    实际上,据我所知,所有实现 GATT 的软件库都不会重新排序属于同一特征的通知。例如,在 Android 上,Binder 机制用作蓝牙守护程序和每个应用程序之间的 IPC 层。此处,在收到特定 BluetoothGatt 对象的通知时调用的回调将不会再次调用,直到同一 BluetoothGatt 对象的先前方法调用返回。

    然而,在 Windows 上,我上次检查时,每次开始监听通知时,都会启动一个新线程,每当收到通知时,您的事件处理程序就会在该线程上运行。由于在监听通知时只能指定监听一个特征,因此如果有两个特征,则需要设置两个单独的监听器,因此将启动两个线程,每个线程处理每个特征。对于两个线程,不可能同步传送通知的顺序,因为两个线程可以在两个不同的 CPU 核心上同时运行。在我看来,这是限制使用的“愚蠢”设计错误之一。

    因此,作为建议,如果您需要保证通知按照发出的顺序传递和处理,请使用一个特征,通常应该没问题。

    • 1

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve