当前位置: 首页 > 知识库问答 >
问题:

在BLE中理解GATT议定书

杜俊逸
2023-03-14

我最近开始学习开发一个基于mircoControler-base的设备,它将具有BLE模块。该设备应该发送从传感器获取的模拟读取到我要开发的Android应用程序。

  1. 基于microntroller的设备将是GATT服务器
  2. android应用程序将是GATT客户端
  3. 从通信的角度来看,基于microntroller的设备是从设备,android应用程序是主设备

问题:

  1. 我如何决定我需要定义的属性的数量,以便从GATT客户端接收命令并发送响应(这将是一个浮点值)?我是否需要有两个不同的属性:一个用于Android发送命令,一个用于基于micron控制器的设备向Android发送数据?或者我可以使用单个属性?
  2. GATT似乎是一个事件驱动的系统
    2.1:当android向基于微控制器的设备发送命令时,会产生什么事件:(客户端到服务器)?
    2.2:当数据被写入要被Android应用程序读取的属性时,是否会生成事件:(服务器到客户端)?
  3. android应用程序(GATT客户端)应该使用读/写命令与基于micron控制器的设备(GATT服务器)通信。并且,GATT服务器应该使用通知/指示将数据传递给GATT客户端。我的理解正确吗?

我正在使用BlueGiga BLE112模块进行开发。

到目前为止,我写的gatt.xml文件是:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 1800: org.bluetooth.service.generic_access -->
<service uuid="1800" id="generic_access">
  <description>Generic Access</description>
  <!-- 2A00: org.bluetooth.characteristic.gap.device_name -->
    <characteristic uuid="2A00" id="c_device_name">
      <description>Device Name</description>
      <properties read="true" const="true" />
      <value>MyBLEDev</value>
    </characteristic>
  <!-- 2A01: org.bluetooth.characteristic.gap.appearance -->
    <characteristic uuid="2A01" id="c_appearance">
      <description>Appearance</description>
      <properties read="true" const="true" />
      <value type="hex">0300</value>
    </characteristic>
  </service>

  <!-- custom service -->
  <service uuid="624e957f-cb42-4cd6-bacc-84aeb898f69b" advertise="true">
    <description>Custom Device Service</description>

    <!-- custom write-only characteristic for Client to send commands to fetch reading -->
    <characteristic uuid="a57892fe-4f58-97d4-a5245-78a4125d3e6" id="c_cmd_TxReading">
      <description>Request for Reading</description>
      <properties write="true" />
      <value length="4" />
    </characteristic>

    <characteristic uuid="8fde302a-56ac-b289-65ed-a577ed66b89c" id="c_reading">
      <description>Measurement</description>
      <properties read="true" write="true" />
      <value length="4" type="float32" />
    </characteristic>
</service>

共有1个答案

牧献
2023-03-14

我看到一个GATT服务器就像另一台机器上的一块内存。您可以通过句柄请求特定的块,并获得不同的信息。您可以通过向这些句柄写入值来使另一台机器做不同的事情或以不同的方式响应。与内存空间不同的是,每个句柄可以包含不同大小的信息,并且每个句柄都有一个UUID来标识如何解释您在其中找到的数据。在常规内存空间中,每个“句柄”将是一个地址,每个块将是一个字节,如果没有其他信息,就无法弄清楚如何解释这些数据。

所以问题:

>

  • 和这里的大多数问题一样,答案是“视情况而定”。如果您只想获取值,那么您只需要有一个属性,其中包含客户机可以从中获取的数据。如果您还想将其设置为GATT服务器在该值更改时发送通知,那么您还必须向该属性添加一个客户机特征配置句柄。(例如,我有一个加速计,它有X、Y和Z值的3个属性,另一个设备将所有3个值作为一个属性报告。因为这是一种尚未标准化的值,他们可以通过定义自己的自定义UUID来实现。如果你正在测量已经有标准布局的东西,那么你可能应该用它代替)

    GATT有一些事件驱动的方面和其他连续完成的方面。例如,一次只能协商一个连接请求。但是,您可以随时从任意数量的属性中以任意顺序接收通知。

    >

  • 你不能用GATT定义你自己的命令。你被限制在像“从句柄读”或“写到句柄”这样类似于操纵一块内存的事情上。底层实现可以依赖于硬件,但通常可以在操纵句柄时触发某种事件。

    您可以通过订阅特定属性上的通知或指示来请求事件。

    是的,那是正确的。

  •  类似资料:
    • 我在为我的BLE设备开发Android软件时遇到了麻烦。我的软件可以找到我的设备和GATT服务,但在我的服务中找不到任何特征。 我查看了android-sdk-4.4.2源代码,发现了一些代码。https://android.googlesource.com/platform/external/bluetooth/bluedroid//android-sdk-4.4.2\u r1https://a

    • 我试图通知一个GATT特征,其中外部BLEGATT客户端已注册到(纯BLE/无移动设备库)。我可以通过外部GATT客户端(在微控制器上运行)成功注册通知。但是,在Movesense上更新特性时,似乎没有通知事件到达GATT客户端。当新的传感器数据通过asyncPUT()可用时,特征值被写入通知回调: GATT服务是基于CustomGATTSvcClient示例创建的。特征属性为READ、WRITE

    • 我正在与Bluez一起使用带有USB蓝牙加密狗的TinyCore linux盒。我们使用示例gatt服务器添加电池服务以发送降低的电池电量。使用蓝牙,我们的控制器(USB蓝牙加密狗)的信息显示服务: 我们的目标是在Android应用程序上阅读此内容,但在我们的自定义应用程序和示例BLE扫描应用程序中,我们看到的唯一服务是00001800(通用访问配置文件)和00001801(通用属性配置文件)。

    • 作为第三方,是否有一种可行的方法来正确解释蓝牙低能耗设备的数据,该设备没有发布GATT配置文件规范? BLE设备是一种体重秤,可以测量体重、BMI、体脂和水分水平。我的理解是,目前还没有像血压计或心率监测仪那样,采用GATT标准的体重秤(https://developer.bluetooth.org/gatt/profiles/Pages/ProfilesHome.aspx). 使用以下工具: i

    • 我试图构建一个Android应用程序,作为一个BLE外设,也作为GATT客户端。 以下是我试图实现的步骤: 但是,如何在Android设备上通知我可以建立连接,以便调用函数连接到GATT服务器? 我也通过启动广告后获取远程设备进行了尝试。 我错过了什么?

    • 我尝试了一个示例来了解锁定活动是如何工作的。当我在不使用议程组的情况下取消规则时,一切似乎都很好。但是当我在下面的代码中取消对议程组的评论并将焦点设置为组“组B”时,没有规则被激发。