了解BLE中的GATT协议

时间:2014-05-19 10:23:17

标签: bluetooth-lowenergy gatt bluegiga

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

  1. 基于微控制器的设备将是GATT服务器。
  2. Android应用程序将是GATT客户端。
  3. 从通信的角度来看,基于微控制器的设备是Slave,android应用程序是Master。
  4. 问题:

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

      我到目前为止编写的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 个答案:

答案 0 :(得分:8)

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

所以......问题:

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

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

    1. 您无法使用GATT真正定义自己的命令。你只能使用“从句柄读取”或“写入处理”之类的东西,类似于操作一块内存。底层实现可能依赖于硬件,但通常可以在操作句柄时触发某种事件。

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

  3. 是的,这是正确的。