Понимание протокола GATT в BLE

Недавно я начал изучать разработку устройства на основе микроконтроллера, которое будет иметь модуль BLE. Предполагается, что устройство отправляет аналоговые показания с сенсора в приложение для Android, которое я собираюсь разработать.
То, что я изучил о том, как работает ГАТТ:

  1. Основанным на микронтроллере устройством будет сервер GATT.
  2. Приложение для Android будет клиентом GATT.
  3. Как видно с точки зрения коммуникации, устройство на базе микротроллера - это Slave, а приложение для Android - Master.

Вопросы:

  1. Как мне определить количество атрибутов, которые мне нужно определить, чтобы получать команду от клиента GATT и отправлять ответ (который будет значением с плавающей запятой)? Нужно ли иметь два разных атрибута: один для Android для отправки команд и один для устройства на базе микроконтроллера для отправки данных на Android? Или я могу использовать один атрибут?
  2. ГАТТ представляется системой, управляемой событиями.
    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>

1 ответ

Решение

Я вижу сервер GATT как кусок памяти на другом компьютере. Вы можете запросить отдельные куски ручками и получить различную информацию. Вы можете заставить другую машину делать разные вещи или реагировать по-разному, записывая значения в эти дескрипторы. Отличие от пространства памяти состоит в том, что каждый дескриптор может содержать информацию разного размера, а также каждый UUID, который определяет, как интерпретировать данные, которые вы там находите. В обычном пространстве памяти каждый "дескриптор" будет адресом, каждый кусок будет одним байтом, и нет способа выяснить, как интерпретировать эти данные без какой-либо другой информации.

Итак... вопросы:

  1. Как и большинство вопросов здесь, ответ "это зависит". Если вы просто хотите получить значение, у вас есть только один атрибут с данными, которые клиент может извлечь из него. Если вы также хотите настроить его таким образом, чтобы сервер GATT отправлял уведомления при каждом изменении этого значения, вам также необходимо добавить дескриптор конфигурации характеристик клиента к этому атрибуту. (Например, у меня есть один акселерометр, который имеет 3 атрибута для значений X, Y и Z, и другое устройство, которое сообщает все 3 значения как один атрибут. Поскольку это тип значения, который не был стандартизирован, они могут сделать это путем определения их собственного пользовательского UUID. Если вы измеряете что-то, что уже имеет стандартную компоновку, то вам, вероятно, следует использовать это вместо)

  2. ГАТТ имеет некоторые управляемые событиями аспекты и другие аспекты, которые выполняются последовательно. Например, вы можете согласовывать только один запрос на соединение за раз. Тем не менее, вы можете получать уведомления в любом порядке в любое время с любым количеством атрибутов.

    1. Вы не можете определить свои собственные команды с помощью GATT. Вы ограничены такими вещами, как "чтение из дескриптора" или "запись в дескриптор", аналогично манипулированию частью памяти. Базовая реализация может зависеть от аппаратного обеспечения, но обычно вы можете вызвать какое-то событие, когда манипулируете дескриптором.

    2. Вы можете запрашивать события, подписавшись на уведомления или указания на определенный атрибут.

  3. Да, это правильно.

Другие вопросы по тегам