6

我最近开始学习开发基于微控制器的设备,该设备将具有 BLE 模块。该设备应该将从传感器获取的模拟读数发送到我要开发的 android 应用程序。
我对 GATT 工作方式的研究是:

  1. 基于微控制器的设备将是 GATT 服务器。
  2. android 应用程序将是 GATT 客户端。
  3. 从通信的角度来看,基于微控制器的设备是从属设备,而安卓应用程序是主控设备。

问题:

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

我正在使用这个 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>

4

1 回答 1

8

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

所以......问题:

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

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

    1. 你不能用 GATT 定义你自己的命令。您仅限于“从句柄读取”或“写入到句柄”之类的操作,类似于操作一大块内存。底层实现可能依赖于硬件,但通常您可以在操作句柄时触发某种事件。

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

  3. 对,那是正确的。

于 2014-05-20T13:25:30.687 回答