了解BLE中的GATT协议

6 bluetooth-lowenergy gatt bluegiga

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

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

问题:

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

Tim*_*all 8

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

所以......问题:

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

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

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

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

  3. 对,那是正确的.