Как происходит инициализация соединения при обмене через блютуз

Обновлено: 21.11.2024

В BLE существует множество событий и операций, которыми можно обмениваться между периферийным и центральным устройствами. Понимание этих событий обязательно для любого разработчика BLE, и для достижения этого есть два аспекта:

  • Изучите теоретические понятия.
  • Узнайте, проанализировав их с помощью анализатора Bluetooth (сниффера).

Я считаю, что эти два метода идут рука об руку и помогают лучше понять BLE.

Первый аспект мы рассмотрим в моей книге Intro to Bluetooth Low Energy (которую можно бесплатно скачать здесь или приобрести в мягкой обложке).

В этом посте мы рассмотрим ряд событий и лучше поймем их, проанализировав записи, полученные с помощью анализатора Bluetooth (Ellisys Bluetooth Tracker).

Вот список событий/операций, которые мы рассмотрим:

  • Реклама:
    • Типы: подключаемый сканируемый ненаправленный и неподключаемый сканируемый ненаправленный
    • Интервал рекламы
    • Используемые радиочастотные каналы
    • Использовано физическое состояние
    • Поля рекламных данных
    • Адрес и тип Bluetooth
    • Сообщение об обмене версиями
    • Сообщение об обмене функциями
    • Обмен MTU на бирже
    • Обнаружение атрибутов, включая службы GATT, характеристики, дескрипторы и другие.

    Реклама

    В этом разделе мы рассмотрим несколько различных типов рекламных пакетов, в том числе:

    • Неподключаемая сканируемая ненаправленная реклама: этот тип чаще всего используется в приложениях Beacon, где устройство передает данные для обнаружения несколькими другими устройствами BLE и не принимает подключения.
    • Подключаемые сканируемые ненаправленные рекламные объявления: этот тип чаще всего используется устройством, которое хочет принимать подключения от других устройств BLE, которые обнаруживают рекламные объявления.

    Для каждого из этих типов мы рассмотрим:

    • Различные поля данных рекламы
    • Используется радиочастотный канал
    • Использовано физическое состояние
    • Адрес и тип Bluetooth

    Прежде чем мы перейдем к конкретным примерам, давайте сначала рассмотрим формат незакодированного (1M PHY, 2M PHY) рекламного пакета (рисунок взят из документа спецификации Bluetooth 5.1):

    Вы заметите, что PDU состоит из двух основных частей: заголовка и полезной нагрузки.

    Заголовок является стандартным для всех рекламных пакетов, а полезная нагрузка зависит от типа рекламы (PDU).

    Неподключаемая сканируемая ненаправленная реклама

    Вот подробности, показанные программой-сниффером. На первом снимке экрана показана подробная информация о канальном уровне:

    Несколько замечаний о полях выше:

    • РЧ-канал, по которому был отправлен этот выбранный пакет, — это канал 37 (который является основным рекламным каналом)
    • Используется физический размер 1 М (без кодирования).
    • Адрес Bluetooth — CD:54:DD:CD:90:6A, и это статический адрес.

    Остальные сведения показывают содержимое самого пакета канального уровня. Я пошел дальше и выделил наиболее важные поля:

    Тип объявления (PDU): ADV_SCAN_IND. Это относится к неподключаемому сканируемому типу ненаправленной рекламы. Значение в шестнадцатеричном формате показано справа: 0x6 и определено в официальной спецификации:

    Длина полезной нагрузки: 28 (байт).
    Внешнее значение: Неизвестно (0x0000).
    Рекламные флаги:
    LE Limited Режим обнаружения: Нет
    Общий режим обнаружения LE: Да
    Одновременное использование LE и BR/EDR (контроллер): Нет
    Одновременное использование LE и BR/EDR (хост): Нет
    Имя устройства (локальное имя): «Nordic_Blinky»
    Необработанные данные:

    Давайте посмотрим, как необработанные данные соотносятся со значениями, перечисленными на снимке экрана "Подробности".

    Реклама заголовка PDU физического канала:

    Полезная нагрузка
    Полезная нагрузка для пакета ADV_SCAN_IND определяется в спецификации следующим образом:

    Итак, у нас есть AdvA (адрес Bluetooth рекламного устройства) и рекламные данные:

    Адрес Bluetooth: CD:54:DD:CD:90:6A

    AdvData (рекламные данные):
    рекламные данные имеют следующий формат (из спецификации Bluetooth):

    Это соответствует известному формату LTV (длина-тип-значение). В нашем примере у нас есть следующие поля:

    Теперь давайте посмотрим, что представляет собой каждое из этих полей.

    Для этого нам нужно обратиться к:

    Из этих ссылок мы теперь можем анализировать поля:

    В нашем примере поле «Флаги» имеет значение 0x06 (или 00000110 в двоичном формате), что означает:

    Бит 1 установлен –> LE General Discoverable Mode включен
    Бит 2 установлен –> Br/EDR Not Support включен

    Последние байты — это CRC полезной нагрузки:

    Подключаемая сканируемая ненаправленная реклама

    Теперь давайте рассмотрим другой тип рекламного пакета: подключаемую сканируемую ненаправленную рекламу. Мы не будем вдаваться в подробности, как в предыдущем примере с рекламным типом.

    В этом примере мы замечаем много общего с предыдущим примером. Мы изменили только тип рекламы.

    Вот подробная информация о выбранном пакете:

    Запросы на подключение

    Одним из самых важных пакетов в BLE является пакет Connection Request. Это пакет, который центральный сервер отправляет рекламному периферийному устройству (отправляя подключаемый рекламный пакет), чтобы инициировать соединение.

    Этот тип пакета очень важен из-за важной информации, которую он содержит (которую центральный сервер должен передать периферийному устройству).

    Давайте взглянем на содержимое пакета запроса на подключение (взято из официального документа спецификации Bluetooth):

    Важная информация содержится в части пакета LLData:

    • AA: адрес доступа
    • CRCInit: содержит инициализацию для вычисления CRC.
    • WinSize и WinOffset: оба используются для установки transmitWindowSize (WinSize * 1,25 мс) и transmitWindowOffset (WinOffset * 1,25 мс), которые обеспечивают центральному серверу некоторую гибкость в время передачи первой точки привязки события подключения.
    • Интервал: используется для расчета connectionInterval (интервал * 1,25 мс), который представляет собой частоту, с которой центральный и периферийный серверы обмениваются данными.
    • Задержка: используется для установки connSlaveLatency (= задержка), которая позволяет ведомому/периферийному устройству пропускать ряд событий подключения для экономии энергии и дольше оставаться в спящем режиме:
      • connSlaveLatency=0–> ведомому устройству не разрешено пропускать какие-либо события соединения.
      • connSlaveLatency=n — подчиненному устройству разрешено пропускать n событий соединения.

      Пример пакета запроса на подключение (захват анализатора)

      Вот пример пакета запроса на подключение, перехваченного сниффером Ellisys Bluetooth Tracker:

      А вот подробности пакета:

      Давайте посмотрим на необработанные данные и посмотрим, как они соотносятся с этими деталями:

      Теперь давайте посмотрим на поля LLData:

      Имейте в виду, что данные, отображаемые здесь, представляют собой данные от LSB до MSB (по мере их приема получателем, слева направо).

      Вот и все. Теперь вы знаете о каждом бите в пакете запроса на подключение!

      Запросы и операции после подключения

      После того как два устройства BLE подключены, они выполняют несколько операций и обменов пакетами данных, которые необходимы, прежде чем между ними произойдет обмен данными, инициированными пользователем.

      Давайте рассмотрим следующие операции:

      • Обмен версиями
      • Обмен функциями
      • Обмен MTU на бирже
      • Обнаружение атрибутов (включая службы GATT, характеристики, дескрипторы и др.)
      • Читать имя устройства (для пользовательского интерфейса, чтобы отобразить осмысленное имя обнаруженного устройства)

      Обмен версиями

      Этот пакет отправляется с каждого из устройств, чтобы сообщить одноранговому узлу об используемой версии Bluetooth и производителе набора микросхем.

      Давайте рассмотрим обмен пакетами в следующем примере (iPhone Xs MAX Nordic nRF52840 DK):

      Как видите, пакет отправляется с каждого из устройств. Каждый содержит четыре поля:

      • Код операции: LL_VERSION_IND, определяющий тип PDU
      • Версия Bluetooth: указывает версию используемой спецификации Bluetooth.
      • Идентификатор компании: содержит идентификатор компании производителя контроллера Bluetooth.
      • Редакция реализации: указывает версию реализации контроллера Bluetooth.

      Ниже показано, что отправляет каждое из устройств (первое — iPhone, второе — Nordic DK):

      Обмен функциями

      Поскольку не все функции версии спецификации Bluetooth являются обязательными (некоторые из них необязательны), устройства должны сообщать друг другу, какие именно функции действительно поддерживаются.

      Это делается с помощью пакета Feature Exchange.

      Одно из устройств отправляет LL_FEATURE_REQ со списком всех поддерживаемых им функций, а другое устройство отвечает LL_FEATURE_RSP со списком поддерживаемых функций.

      Начиная с версии 5.1 спецификации Bluetooth существует 28 определенных битов, которые указывают, поддерживается функция или нет.

      Давайте взглянем на список функций, поддерживаемых каждым из устройств в нашем примере.

      Обмен MTU

      Во-первых, давайте определим, что такое MTU:

      MTU означает максимальную единицу передачи и определяет максимальный объем данных, которые могут быть обработаны передатчиком и приемником и которые они могут хранить в своих буферах.

      В спецификации нет ограничения на то, насколько большим может быть значение MTU, но конкретный используемый стек может иметь свои собственные ограничения.

      Действующий MTU определяется минимальным значением ATT MTU, поддерживаемым клиентом и сервером.

      Например, если клиент поддерживает MTU ATT, равный 100 байтам, а сервер отвечает, что он поддерживает MTU ATT, равный 150 байтам, тогда клиент решит, что MTU ATT, который будет использоваться для соединения, будет равен 100 байтам. .

      Вот посмотрите на пакет Exchange MTU в нашем примере. Клиент (iPhone) отправляет пакет запроса MTU Exchange, а сервер (Nordic DK) отправляет обратно пакет ответа Exchange MTU.

      Обмен пакетом MTU, отправленным iPhone, со значением MTU 293 байта:

      Обмен пакетом MTU, отправленным Nordic Dev Kit, со значением MTU 23:

      Обнаружение атрибутов

      Процесс обнаружения атрибутов происходит всякий раз, когда два устройства подключаются друг к другу в первый раз.

      После этого клиент может кэшировать все атрибуты (включая сервисы, характеристики, дескрипторы и т. д.), чтобы избежать выполнения процесса обнаружения при следующем подключении двух устройств.

      Если клиент не кэширует атрибуты, он должен выполнять процесс обнаружения при каждом подключении к серверу.

      Список атрибутов будет содержать пару "ключ-значение" для каждого из атрибутов, где дескриптор атрибута является ключом, а тип атрибута (UUID) является значением.

      Если сервер хочет поддерживать изменения в дескрипторах атрибутов (например, из-за обновления микропрограммы или сброса настроек), он должен включать характеристику Service Changed, чтобы уведомить клиента о том, что дескриптор атрибута изменилось, что, в свою очередь, инициирует обнаружение службы.

      Вот как выглядит процесс обнаружения:

      Как видите, для этого обычно требуется несколько пакетов, особенно если на стороне сервера имеется много определенных служб и характеристик.

      Клиент продолжает запрашивать чтение атрибутов, пока не получит сообщение об ошибке «Атрибут не найден», указывающее на завершение процесса обнаружения:

      Чтение имени устройства

      Еще один запрос, который обычно отправляет клиент (особенно в приложениях с элементом пользовательского интерфейса), — чтение имени устройства.

      Это простая операция запроса чтения GATT:

      Поднимите свои знания BLE на новый уровень!

      Если вы хотите узнать больше о других событиях и пакетах BLE, посетите Академию разработчиков Bluetooth. Я не только рассказываю о других пакетах BLE, но также предоставляю образцы файлов захвата Ellisys, которые вы можете загрузить и просмотреть на своем компьютере без самого анализатора (необходимо только программное обеспечение анализатора).

      В специальном курсе я расскажу о следующих дополнительных пакетах BLE:

      • Операции ГАТТ
        • Читать
        • Написать
        • Написать без ответа
        • Уведомления
        • Показания
        • Запрос на обновление параметров подключения
        • Запрос на обновление PHY
        • DLE (расширение длины данных)

        Присоединившись к Академии разработчиков Bluetooth, вы получите доступ к растущей библиотеке курсов и руководств.

        Вот что говорит один член Академии:

        Если вы разрабатываете проект BLE, вам нужны две вещи: хороший анализатор BLE и Академия разработчиков Bluetooth. Я очень рад быть частью этого сообщества и с нетерпением жду того, что будет дальше.

        – Кристофер Гейтс, главный архитектор системы безопасности – Velentium

        Текущие курсы включают:

        • Основы Bluetooth с низким энергопотреблением
        • Анализ событий BLE с помощью анализатора BLE
        • Режим дальнего действия (кодированный физический уровень) с использованием Bluetooth 5.0
        • Разработка приложений nRF52 с использованием Visual Studio Code
        • Обновление встроенного ПО устройств по беспроводной сети (OTA DFU) — пример использования nRF52
        • Начало работы с Zephyr (включая добавление пользовательских сервисов и характеристик GATT)
        • Руководство разработчика по новым возможностям Bluetooth 5.2
        • SweynTooth: сводка для разработчиков BLE
        • Введение в безопасность BLE
        • Начало разработки BlueZ
        • Введение в разработку BLE для iOS
        • …и новые курсы добавляются каждый месяц!

        В Академии также активно работает сообщество экспертов, разработчиков и новаторов в области Bluetooth. Вы сможете общаться и взаимодействовать с другими экспертами в области Bluetooth, учиться на чужом опыте и знаниях и делиться своими.

        В Академию также включен доступ к личной поддержке от меня лично.

        Узнайте об истории Bluetooth®, о том, как работает Bluetooth® Low Energy и как подключить два устройства Nano BLE через Bluetooth®.

        АВТОР: Хосе Багур

        ПОСЛЕДНЯЯ РЕДАКЦИЯ: 24 февраля 2022 г., 10:51

        Введение

        В этом руководстве мы узнаем, как обмениваться информацией между двумя платами Arduino, Nano 33 BLE и Nano 33 BLE Sense, через Bluetooth® Low Energy. Для этого мы будем использовать библиотеку ArduinoBLE.

        Цели

        • Изучите основы Bluetooth® с низким энергопотреблением.
        • Используйте библиотеку ArduinoBLE.
        • Обмен информацией между двумя платами Arduino через Bluetooth® Low Energy.

        Необходимое оборудование и программное обеспечение

        • Arduino IDE (онлайн или офлайн). . . .
        • Кабель Micro USB (2 шт.).

        История Bluetooth®

        Стандарт Bluetooth® изначально был разработан доктором Яарпом Хаартсеном из Ericsson в 1994 году, более 20 лет назад.Он был назван в честь известного викинга и короля, объединившего Данию и Норвегию в 10 веке, короля Харальда Гормссона. Доктору Хаартсену было поручено разработать стандарт беспроводной связи малого радиуса действия, который мог бы заменить стандарт проводной связи RS-232, который был разработан в 60-х годах и используется до сих пор.

        Bluetooth® использует так называемую технологию короткой связи. Он работает в нелицензируемом, но регулируемом диапазоне частот от 2,4 до 2,485 ГГц и использует радио для связи и установления соединений между двумя или более устройствами. Bluetooth® основан на методе расширения спектра со скачкообразной перестройкой частоты. Этот метод был впервые описан в 1940-х годах актрисой Хеди Ламарр и композитором Джорджем Антейлом. Ламарр и Антейл хотели создать способ предотвратить глушение торпед, управляемых по радио. Bluetooth® — это, по сути, беспроводная сеть малого радиуса действия, называемая пиконетью.

        В 1994 году, помимо Ericsson, такие компании, как Intel, Nokia, IBM и Toshiba, также придумали беспроводную связь ближнего действия между электронными устройствами. В то время эти компании понимали, что для создания беспроводной связи ближнего действия, которую можно было бы использовать между различными электронными устройствами, необходимо было стандартизировать протокол, чтобы его можно было применять повсеместно. В 1996 году эти компании сформировали Bluetooth® Special Interest Group (SIG), которая была окончательно учреждена в 1998 году. SIG начиналась всего с 5 членов, к концу первого года существования она достигла 4000 членов, а в настоящее время насчитывает более 30 000 человек.< /p>

        Цель Bluetooth® – объединить устройства так же, как король Харальд Гормссон объединил племена Дании в единое королевство.

        Bluetooth® 1.0 был выпущен примерно в 1999 г., версия 2.0 — в 2004 г., версия 2.1 — в 2007 г., версия 3.0 — в 2009 г., версия 4.0 — в 2010 г., версия 4.1 — в 2013 г., версия 4.2 — в 2014 г., версия 5.0 — в 2016 г. и версия 5.1 — в 2019 г. (это много работы!).

        Если вы посмотрите спецификацию Bluetooth® 3.0, вы обнаружите, что эта спецификация включает три режима работы: BR, EDR и HS (AMP). Эти три режима работы обычно для удобства называют классическим Bluetooth®. В 2010 году SIG объединилась с Wibree, беспроводной технологией, разработанной Nokia, Nordic Semiconductor и другими компаниями, целью которых было найти технологию беспроводной связи с низким энергопотреблением для электронных устройств. SIG переименовала Wibree в Bluetooth® Low Energy. Технология Bluetooth® Low Energy была разработана для значительного снижения энергопотребления за счет сокращения времени, в течение которого Bluetooth®-радио работает. Классический Bluetooth® и Bluetooth® с низким энергопотреблением включены в спецификацию Bluetooth® 4.0, но вот в чем дело: классический Bluetooth® и Bluetooth® с низким энергопотреблением работают по-разному и несовместимы.

        Каждый режим, классический Bluetooth® и Bluetooth® с низким энергопотреблением, имеют разные методы модуляции и демодуляции физического уровня. Это означает, что классический Bluetooth® и Bluetooth® Low Energy не могут работать друг с другом. Вообще говоря, классический Bluetooth® в основном используется для аудиоприложений (например, для беспроводных наушников), тогда как Bluetooth® Low Energy чаще используется в приложениях с ограниченным энергопотреблением (например, в носимых устройствах и устройствах IoT).

        Как работает Bluetooth® с низким энергопотреблением?

        Чтобы понять, как работает Bluetooth® Low Energy, нам нужно поговорить о ролях и обязанностях двух устройств, подключенных через Bluetooth®. В любом соединении Bluetooth® играют две роли: центральную и периферийную. Устройства с центральной ролью также являются серверами вызовов, а устройства с периферийной ролью также называются клиентами.

        Центральная и периферийная роли в приложениях Bluetooth®.

        Когда соединение Bluetooth® установлено, одно устройство, периферийное устройство, будет рекламировать или транслировать информацию о себе на любые близлежащие устройства. В то же время другое устройство, центральное, будет выполнять сканирование и прослушивать любое устройство или устройства, передающие информацию. Как только центральное устройство заберет рекламную информацию с периферийного устройства, будет предпринята попытка подключения периферийного устройства. Как только соединение будет установлено, центральное устройство будет взаимодействовать с доступной информацией, которая есть у периферийного устройства. Этот обмен информацией осуществляется с помощью так называемых сервисов.

        Услуги и характеристики

        В рамках каждой услуги будет существовать список характеристик. Каждая из этих характеристик представляет уникальную возможность центрального устройства. В предыдущем примере служба здравоохранения будет иметь три характеристики (частота сердечных сокращений, физическая активность и характер сна).Как только периферийное устройство обнаруживает эти характеристики, оно может записывать информацию, запрашивать информацию и подписываться на обновления этих характеристик. Любая характеристика, например службы, имеет UUID длиной 16 или 128 бит.

        Пример медицинского обслуживания.

        Обмен информацией в Bluetooth® Low Energy

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

        На данный момент это то, что нам нужно знать о технологии Bluetooth® Low Energy. Спецификации Bluetooth® довольно обширны, но их интересно читать и изучать. Если вы хотите узнать больше о Bluetooth® Low Energy, прочтите книгу «Начало работы с Bluetooth® Low Energy», написанную Кевином Таунсендом, Карлесом Куфи, Акибой и Робертом Дэвидсоном.

        Использование Bluetooth® Low Energy и Arduino

        Теперь давайте воспользуемся Bluetooth® Low Energy с Arduino. В этом примере мы собираемся использовать две платы Arduino, Nano 33 BLE и Nano 33 BLE Sense для обмена информацией между ними. Одна из плат, Nano 33 BLE Sense, будет настроена как центральное устройство, а другая плата, Nano 33 BLE, будет настроена как периферийное устройство. Информация, которой мы собираемся поделиться между досками, будет поступать от встроенного датчика жестов платы Nano 33 BLE Sense. Для этого мы собираемся создать службу с именемgestService, которая будет иметь одну характеристику, называемуюgest_type.

        Пример архитектуры жестов.

        Центральное устройство, Nano 33 BLE Sense, подключается к периферийному устройству, Nano 33 BLE, и ищет службу с именемgesterService. После установления соединения между центральным и периферийным устройством, если центральное устройство обнаружит жест своим датчиком жестов, оно запишет тип обнаруженного жеста в характеристике жест_тип службы жестов. Затем на основе значения, хранящегося в характеристикеgest_type, встроенный RGB-светодиод периферийного устройства Nano 33 BLE загорится определенным цветом в зависимости от сохраненного значения в характеристикеgest_type.

        Программирование досок

        <р>1. Во-первых, давайте удостоверимся, что у нас установлены драйверы для плат Nano 33 BLE. Если мы используем онлайн-IDE, ничего устанавливать не нужно, если вы используете автономную IDE, нам нужно установить ее вручную. Это можно сделать, перейдя в Tools > Board > Board Manager. , найдите Arduino Mbed OS Nano Boards и установите его.

        <р>2. Также давайте удостоверимся, что у нас установлены все необходимые библиотеки. Если мы используем онлайн-IDE, ничего устанавливать не нужно. Если мы используем автономную IDE, это можно сделать, перейдя в Инструменты > Управление библиотеками. , найдите ArduinoBLE и Arduino_APDS9960 и установите их оба.

        Программирование центрального устройства

        Полный код центрального устройства можно найти ниже:

        Программирование периферийного устройства

        Полный код периферийного устройства можно найти ниже:

        Тестирование кода

        После того, как мы закончим кодирование, мы можем загрузить оба скетча на наши доски. Сначала мы можем убедиться, что центральное устройство (Arduino Nano 33 BLE Sense) работает должным образом, выбрав правильный порт центрального устройства и открыв Serial Monitor. В Serial Monitor мы должны увидеть следующее:

        Последовательный выход монитора центрального устройства.

        После включения центральное устройство начинает поиск периферийного устройства с заданным сервисом и характеристикой. Как только периферийное устройство с указанным сервисом и характеристиками будет найдено, в Serial Monitor мы должны увидеть следующее:

        Последовательный выход монитора периферийного устройства.

        Центральное устройство дает вам обратную связь о:

        • MAC-адрес периферийного устройства.
        • Локальное имя периферийного устройства.
        • UUID службы, объявленной периферийным устройством.

        Затем центральное устройство пытается установить соединение с периферийным устройством, а также пытается обнаружить сервис и характеристики, которые мы указали ранее. Если обе вещи выполнены успешно, мы можем начать активировать встроенный датчик жестов платы Nano 33 BLE Sense. Начнем с того, что стабилизируем нашу плату Nano 33 BLE Sense в положении стоя спереди, при этом USB-порт платы должен быть направлен вниз. Затем мы продолжаем делать жесты рук ВВЕРХ-ВНИЗ-ВПРАВО-ВЛЕВО. Когда жест определяется датчиком жестов, в Serial Monitor мы должны увидеть следующее:

        Последовательный выход монитора

        Центральное устройство предоставляет нам обратную связь о:

        • Тип обнаруженного жеста (ВВЕРХ, ВНИЗ, ВПРАВО или ВЛЕВО).
        • Значение, записываемое в характеристикуgest_type службы жестов на периферийном устройстве.
        • Обнаружен жест ВВЕРХ: горит красный индикатор.
        • Обнаружен жест ВНИЗ: горит зеленый индикатор.
        • Обнаружен ПРАВЫЙ жест: встроенный светодиод горит.
        • Обнаружен жест ВЛЕВО: горит синий индикатор.

        Периферийное устройство также может передавать нам данные через последовательный порт. С помощью этой обратной связи мы можем убедиться, что периферийное устройство (Arduino Nano 33 BLE) работает должным образом, выбрав правильный порт периферийного устройства и открыв Serial Monitor. В Serial Monitor мы должны увидеть следующее:

        Последовательный выход монитора

        Периферийное устройство сообщает нам о:

        • MAC-адрес центрального устройства.
        • Локальное имя центрального устройства.
        • Фактическое значение характеристики жеста_типа и включенный встроенный светодиод.

        Устранение неполадок

        Иногда возникают ошибки, если один из кодов не работает, мы можем устранить некоторые распространенные проблемы:

        • Не хватает скобки или точки с запятой.
        • Плата Arduino подключена к неправильному порту.
        • Случайное прерывание кабельного соединения.
        • Мы не открывали Serial Monitor для инициализации программы.

        Заключение

        В этом руководстве мы узнали, как обмениваться информацией между двумя платами Arduino, Nano 33 BLE и Nano 33 BLE Sense, через Bluetooth® Low Energy. Мы также изучили основы технологии Bluetooth® Low Energy, как она работает, какие есть сервисы и характеристики, а также как происходит обмен информацией в Bluetooth® Low Energy. Наконец, мы включаем различные цвета встроенного RGB-светодиода платы Nano 33 BLE на основе значений, отправленных Nano 33 BLE Sense, эти значения были определены с помощью встроенного датчика жестов.

        ESP32 поставляется с Wi-Fi, Bluetooth Low Energy и Bluetooth Classic. В этом руководстве вы узнаете, как использовать ESP32 Bluetooth Classic с Arduino IDE для обмена данными между ESP32 и смартфоном Android.

        Мы будем управлять выходом ESP32 и отправлять показания датчиков на смартфон Android с помощью Bluetooth Classic.

        Примечание: этот проект только совместим со смартфонами Android.

        Посмотрите видеоруководство

        Вы можете посмотреть обучающее видео или продолжать читать эту страницу для получения письменных инструкций.

        Классический Bluetooth с ESP32

        На данный момент использовать Bluetooth Classic намного проще, чем Bluetooth Low Energy. Если вы уже запрограммировали Arduino с модулем Bluetooth, таким как HC-06, это очень похоже. Он использует стандартный последовательный протокол и функции.

        В этом руководстве мы начнем с примера, который поставляется с Arduino IDE. Затем мы создадим простой проект для обмена данными между ESP32 и вашим Android-смартфоном.

        Необходимые детали

        Чтобы следовать этому руководству, вам понадобятся следующие компоненты:

          (читать Лучшие платы для разработки ESP32)
        • Смартфон Android с Bluetooth

        Приложение Bluetooth-терминала

        Чтобы продолжить работу с этим учебным пособием, на вашем смартфоне должно быть установлено приложение Bluetooth Terminal.

        Мы рекомендуем использовать Android-приложение Serial Bluetooth Terminal, доступное в Play Маркете.

        Последовательный Bluetooth

        Мы будем программировать ESP32 с помощью Arduino IDE, поэтому перед продолжением убедитесь, что у вас установлено дополнение ESP32:

        Откройте IDE Arduino и выберите «Файл» > «Примеры» > BluetoothSerial > SerialtoSerialBT.

        Должен загрузиться следующий код.

        Как работает код

        Этот код устанавливает двустороннюю последовательную связь Bluetooth между двумя устройствами.

        Код начинается с включения библиотеки BluetoothSerial.

        Следующие три строки проверяют, правильно ли включен Bluetooth.

        Затем создайте экземпляр BluetoothSerial с именем SerialBT :

        настройка()

        В setup() инициализируйте последовательную связь со скоростью 115 200 бод.

        Инициализируйте последовательное устройство Bluetooth и передайте в качестве аргумента имя устройства Bluetooth. По умолчанию он называется ESP32test, но вы можете переименовать его и присвоить ему уникальное имя.

        В цикле() отправляйте и получайте данные через Bluetooth Serial.

        В первом операторе if мы проверяем, получены ли байты через последовательный порт. Если есть, отправьте эту информацию через Bluetooth на подключенное устройство.

        SerialBT.write() отправляет данные, используя последовательный порт Bluetooth.

        Serial.read() возвращает данные, полученные через последовательный порт.

        Следующий оператор if проверяет, есть ли байты, доступные для чтения в последовательном порту Bluetooth. Если они есть, мы запишем эти байты в Serial Monitor.

        На демонстрации будет легче понять, как именно работает этот скетч.

        Тестирование кода

        Загрузите предыдущий код в ESP32. Убедитесь, что вы выбрали правильную плату и COM-порт.

        После загрузки кода откройте Serial Monitor со скоростью 115 200 бод. Нажмите кнопку включения ESP32.

        Через несколько секунд вы должны получить сообщение: "Устройство запущено, теперь вы можете подключить его к Bluetooth!".

        Подойдите к своему смартфону и откройте приложение "Последовательный Bluetooth-терминал". Убедитесь, что на вашем смартфоне включен Bluetooth.

        Чтобы подключиться к ESP32 в первый раз, необходимо выполнить сопряжение нового устройства.
        Перейдите в раздел "Устройства".

        Нажмите значок настроек и выберите Подключить новое устройство. Вы должны получить список доступных устройств Bluetooth, включая ESP32test. Выполните сопряжение с ESP32test.

        Затем вернитесь к последовательному терминалу Bluetooth. Нажмите значок вверху, чтобы подключиться к ESP32. Вы должны получить сообщение «Подключено».

        После этого введите что-нибудь в приложении Serial Bluetooth Terminal. Например, «Здравствуйте».

        Вы должны немедленно получить это сообщение в последовательном мониторе Arduino IDE.

        Вы также можете обмениваться данными между серийным монитором и смартфоном. Введите что-нибудь в верхней строке Serial Monitor и нажмите кнопку «Отправить».

        Вы должны немедленно получить это сообщение в приложении Serial Bluetooth Terminal.

        Обмен данными с помощью Bluetooth Serial

        Теперь, когда вы знаете, как обмениваться данными с помощью Bluetooth Serial, вы можете изменить предыдущий эскиз, чтобы сделать что-то полезное. Например, управляйте выходами ESP32 при получении определенного сообщения или отправляйте данные на свой смартфон, например показания датчиков.

        Проект, который мы создадим, отправляет показания температуры каждые 10 секунд на ваш смартфон. Мы будем использовать датчик температуры DS18B20.

        Через приложение для Android мы будем отправлять сообщения для управления выводом ESP32. Когда ESP32 получит сообщение led_on, мы включим GPIO, когда он получит сообщение led_off, мы выключим GPIO.

        Схема

        Прежде чем приступить к этому проекту, соберите схему, следуя следующей принципиальной схеме.

        Подключите светодиод к GPIO25 и подключите контакт данных DS18B20 к GPIO32.

        Для работы с датчиком температуры DS18B20 необходимо установить библиотеку One Wire от Paul Stoffregen и библиотеку Dallas Temperature. Следуйте следующим инструкциям, чтобы установить эти библиотеки, если вы еще этого не сделали.

        Библиотека One Wire

          . У вас должна быть ZIP-папка в папке «Загрузки».
        1. Разархивируйте папку .zip, и вы должны получить папку OneWire-master
        2. Переименуйте папку с OneWire-master на OneWire.
        3. Переместите папку OneWire в папку установочных библиотек Arduino IDE
        4. Наконец, повторно откройте среду разработки Arduino.

        Библиотека температуры Далласа

          . У вас должна быть ZIP-папка в папке «Загрузки».
        1. Разархивируйте папку .zip, и вы должны получить папку Arduino-Temperature-Control-Library-master
        2. Переименуйте папку с Arduino-Temperature-Control-Library-master в DallasTemperature.
        3. Переместите папку DallasTemperature в папку установочных библиотек Arduino IDE
        4. Наконец, повторно откройте среду разработки Arduino.

        После сборки схемы и установки необходимых библиотек скопируйте следующий скетч в вашу Arduino IDE.

        Как работает код

        Давайте быстро взглянем на код и посмотрим, как он работает.

        Начните с включения необходимых библиотек. Библиотека BluetoothSerial для Bluetooth и OneWire и DallasTemperature для датчика температуры DS18B20.

        Создайте экземпляр BluetoothSerial с именем SerialBT .

        Создайте переменную с именем ledPin для хранения GPIO, которым вы хотите управлять. В этом случае к GPIO25 подключен светодиод.

        Определите вывод датчика DS18B20 и создайте объекты, чтобы заставить его работать. Датчик температуры подключен к GPIO32.

        Создайте пустую строку с именем message для хранения полученных сообщений.

        Создайте символьную переменную с именем incomingChar, чтобы сохранять символы, поступающие через Bluetooth Serial.

        Переменная TemperatureString содержит данные о температуре, которые необходимо отправить по Bluetooth.

        Создайте дополнительные переменные таймера для отправки показаний каждые 10 секунд.

        настройка()

        В setup() установите ledPin в качестве выхода.

        Инициализируйте ESP32 как Bluetooth-устройство с именем «ESP32».

        В цикле() отправьте показания температуры, прочитайте полученные сообщения и выполните соответствующие действия.

        Следующий фрагмент кода проверяет, прошло ли 10 секунд с момента последнего чтения. Если пришло время отправить новое значение, мы получаем последнюю температуру и сохраняем ее в градусах Цельсия и Фаренгейта в переменной TemperatureString.

        Затем, чтобы отправить строку TemperatureString через Bluetooth, используйте SerialBT.println() .

        Следующий оператор if считывает входящие сообщения. Когда вы получаете сообщения через серийный номер, вы получаете символ за раз. Вы знаете, что сообщение закончилось, когда вы получаете \n .

        Итак, мы проверяем, есть ли данные в последовательном порту Bluetooth.

        Если есть, мы сохраним символы в переменной incomingChar.

        Если incomingChar отличается от \n , мы соединим этот символ char с нашим сообщением.

        Когда мы закончим читать символы, мы очищаем переменную сообщения. В противном случае все полученные сообщения будут добавляться друг к другу.

        После этого у нас есть два оператора if для проверки содержимого сообщения. Если отображается сообщение led_on , светодиод загорается.

        Если отображается сообщение led_off , светодиод выключается.

        Тестирование проекта

        Загрузите предыдущий скетч на плату ESP32. Затем откройте Serial Monitor и нажмите кнопку ESP32 Enable. Когда вы получите следующее сообщение, вы можете перейти к своему смартфону и подключиться к ESP32.

        Затем вы можете написать сообщения "led_on" и "led_off" для управления светодиодом.

        В приложении есть несколько кнопок, с помощью которых вы можете сохранять сообщения по умолчанию. Например, вы можете связать M1 с сообщением «led_on», а M2 — с сообщением «led_off».

        Теперь вы можете управлять GPIO ESP32.

        В то же время вы должны получать показания температуры каждые 10 секунд.

        Подведение итогов

        Подводя итог, можно сказать, что ESP32 поддерживает BLE и Bluetooth Classic. Использовать Bluetooth Classic так же просто, как использовать последовательную связь и ее функции.

        Если вы хотите узнать, как использовать BLE с ESP32, вы можете прочитать наше руководство:

        Мы надеемся, что это руководство оказалось для вас полезным. Чтобы узнать больше о проектах с ESP32, вы можете посмотреть подборку наших проектов: 20+ проектов и руководств по ESP32.

        Это руководство является предварительным просмотром курса «Изучение ESP32 с Arduino IDE». Если вам нравится этот проект, обязательно загляните на страницу курса ESP32, где мы рассмотрим эту и многие другие темы, связанные с ESP32.

        Протокол Bluetooth состоит из нескольких протоколов, которые можно разделить на четыре категории. Каждый из этих протоколов отвечает за определенный тип задачи и стоит сам по себе. В предыдущей статье Bluetooth мы говорили об основных терминах, конкретных значениях мощности, частоты, диапазона и многом другом. Концепция ведущих, ведомых, сетей Пико и сетей рассеяния, образующих специальную сеть. Эта часть Bluetooth будет иметь дело с протоколами, отвечающими за работу технологии Bluetooth. Четыре категории, на которые делятся эти протоколы, показаны ниже:

        Рис. 1: Блок-схема, поясняющая протоколы Bluetooth

        Основные протоколы Bluetooth

        Основная полоса частот

        Основной диапазон обеспечивает радиочастотную связь между устройствами Bluetooth для формирования пикосети. Обмен информацией происходит пакетами в Bluetooth. Пакет представляет собой двоичную единицу данных, содержащую требуемую пользователем информацию, которая может быть направлена ​​через компьютерную сеть. И коммутация каналов, и коммутация пакетов используются для передачи пакетов в сети. Сети с коммутацией пакетов перемещают данные отдельными небольшими блоками — пакетами — в зависимости от адреса назначения в каждом пакете. При получении пакеты собираются в правильной последовательности, чтобы составить сообщение.Сети с коммутацией каналов требуют выделенных двухточечных соединений во время вызовов и обычно используются в телефонных линиях для обмена данными.

        Протокол диспетчера ссылок

        Протокол диспетчера ссылок отвечает за установку соединения между двумя устройствами Bluetooth. Этот уровень протокола отвечает за вопросы безопасности, такие как аутентификация, шифрование, обмен и проверка ссылки и ключей шифрования.

        Управление логическими связями и адаптация — уровень (L2CAP)

        Уровень управления и адаптации логической связи Bluetooth поддерживает мультиплексирование более высокого уровня, сегментацию и повторную сборку пакетов, а также качество связи и групп обслуживания. Этот уровень не отвечает за надежность и использует ARQ для ее обеспечения.

        Протокол обнаружения служб (SDP)

        SDP — это основа для обнаружения служб на всех устройствах Bluetooth. Это важно для всех моделей Bluetooth, поскольку с помощью информации об устройстве SDP можно запрашивать службы и характеристики служб, после чего может быть установлено соединение между двумя или более устройствами Bluetooth. Могут использоваться другие протоколы обнаружения служб, такие как Jini, UpnP и т. д. в сочетании с протоколом Bluetooth SDP.

        Категории протокола Bluetooth

        Протокол замены кабеля

        RFCOMM

        Протокол RFCOMM используется для замены кабеля в Bluetooth. Это простой транспортный протокол с дополнительными возможностями для эмуляции девяти цепей последовательных портов RS232 через L2CAP, часть стека протоколов Bluetooth. Он поддерживает большую базу приложений, использующих последовательную связь. Он обеспечивает надежный поток данных, несколько подключений, управление потоком и настройку последовательного кабеля.

        Протокол управления телефонией

        Спецификация (двоичный файл TCS)

        Двоичный протокол TCS определяет сигнализацию управления вызовом для установления вызовов речи и данных между двумя устройствами Bluetooth. Это бит-ориентированный протокол.

        Интерфейс хост-контроллера (HCI)

        HCI обеспечивает командный интерфейс для контроллера основной полосы частот, диспетчера каналов и доступ к состоянию оборудования и регистрам управления. Интерфейс обеспечивает единый метод доступа к возможностям основной полосы частот Bluetooth. Транспортный уровень управления хостом удаляет транспортные зависимости и предоставляет общий интерфейс драйвера. В основной спецификации определены три интерфейса: USB, RS-232 и UART.

        ПРИНЯТЫЕ ПРОТОКОЛЫ

        PPP, TCP/IP

        PPP, TCP, UDP и IP — это стандартные интернет-протоколы, определенные IETF. Они используются в качестве протоколов нижнего уровня для транспортировки пакетов или дейтаграмм по указанным IP-адресам. ОБЕКС

        OBEX — это протокол сеанса, определяемый IrDA. Этот протокол также используется Bluetooth, что позволяет приложению использовать либо радио Bluetooth, либо технологии IrDA.

        WAP/WAE

        Bluetooth может использоваться в качестве технологии передачи данных между клиентом WAP и ближайшим сервером WAP. WAP работает поверх стека Bluetooth, используя PPP и набор протоколов TCP/IP.

        Каждый из этих протоколов аккуратно организован в виде уровней один над другим, образуя стек протоколов. Стопка – это аккуратно сложенная стопка предметов или вещей.

        Следовательно, Bluetooth определяется как многоуровневая архитектура протокола, поскольку каждый уровень поддерживает уровни выше и ниже него. Полный стек протоколов состоит как из протоколов, специфичных для Bluetooth, которые четко определены или разработаны для Bluetooth, таких как LMP, так и не специфичных для Bluetooth, которые были разработаны для повторного использования существующих протоколов для различных функций. Неспецифические протоколы могут использоваться со многими другими платформами, такими как WAP, UDP и OBEX. Они использовались для ускорения разработки протокола Bluetooth на более высоких уровнях при одновременной адаптации для работы с устройствами Bluetooth и обеспечения совместимости. Схема уровней Bluetooth и связанных с ними протоколов показана ниже.

        Рис. 2 : Обзор различных уровней Bluetooth и связанных протоколов

        Рис. 3: Блок-схема, показывающая различные уровни и функции Bluetooth

        Каждый из указанных выше уровней важен для связи Bluetooth и имеет внутреннюю схему для выполнения требуемой задачи. В этом разделе мы рассмотрим внутренние детали всех слоев.

        Внутренние сведения о протоколах Bluetooth

        Bluetooth-радио

        Радиомодуль Bluetooth предоставляет электрический интерфейс для передачи пакетов на модулированной несущей частоте с использованием таких беспроводных сервисов, как CDMA, GSM. Радио работает в диапазоне 2,4 ГГц. Для этого требуется эффективная антенна для передачи и приема, входной ВЧ-интерфейс, включающий повышающий преобразователь, понижающий преобразователь, контроллер мощности, модулятор GFSK и переключатель передатчика/приемника.

        Микросхема радиомодема Bluetooth

        Радиомодем выполняет модуляцию и демодуляцию GFSK, восстановление символа и времени кадра. Он имеет полностью интегрированный радиопередатчик и синтезатор со скачкообразной перестройкой частоты на одном кристалле. В реальной системе сигналы, которые проходят между антеннами, имеют гораздо более высокую частоту, и они известны как радиочастоты. Таким образом, для уменьшения частотного диапазона аналоговые схемы обычно используются для преобразования с понижением частоты на стороне приемника и аналогичного преобразования с повышением частоты на стороне передачи. Аналого-цифровой преобразователь присутствует на стороне приемника, чтобы перевести сигнал в цифровую область. Затем он передается демодулятору GFSK. Схема модуляции Bluetooth — GFSK (гауссова частотная манипуляция). Гауссова частотная манипуляция (GFSK) — это метод модуляции для цифровой связи, используемый во многих стандартах, таких как Bluetooth, DECT и Wavenis. Он минимизирует сложность приемопередатчика, используя единицу для положительной девиации частоты и ноль для отрицательной девиации частоты. Микросхема также содержит синтезатор со скачкообразной перестройкой частоты на том же чипе.

        Рис. 4: Блок-схема различных функций радиомодема Bluetooth

        РАДИОДИАПАЗОНЫ И КАНАЛЫ

        Радиомодуль Bluetooth работает в диапазоне ISM 2,4 ГГц. В США и Европе доступен диапазон 83,5 МГц. Имеется 79 каналов, разнесенных на 1 МГц. Япония, Испания и Франция используют только 23 канала с интервалом в 1 МГц.

        Это самая важная часть протокола Bluetooth. Baseband — это физический уровень Bluetooth, который управляет физическими каналами и ссылками. Основная полоса лежит поверх Bluetooth-радио. ИС контроллера связи Bluetooth используется для реализации протокола и функций основной полосы частот и взаимодействует с ИС радиомодема Bluetooth. Контроллер ссылок разумно выбирает используемые ссылки и каналы и повышает производительность приложений. Он синхронизируется с вышележащим уровнем, т. е. диспетчером ссылок, для выполнения процедур на уровне канала, таких как соединения каналов и управление питанием. На стороне получателя он выполняет обнаружение ошибок, отбеливание данных, выбор перехода и безопасность Bluetooth. Аппаратное обеспечение контроллера выполняет основные функции, такие как повторяющиеся действия пейджинга, запроса и сканирования страницы и запроса. Он также обеспечивает интерфейс USB и аудио для хост-системы.

        Рис. 5: Диаграмма, показывающая различные функции слоя основной полосы частот в Bluetooth

        Baseband также управляет ссылками, обрабатывает пакеты и выполняет пейджинг и запросы для доступа и запроса устройств Bluetooth. Передатчик применяет мультиплексирование с временным разделением, помимо разделения по частоте (скачкообразная перестройка частоты). В обычном режиме соединения ведущий начинает с четных слотов, а ведомый использует слоты с нечетными номерами. Существует два типа ссылок ACL и SCO. Канал — это двухточечный сквозной канал, который соединяет конечных пользователей и позволяет им обмениваться данными, даже если используются два отдельных физических пути. Давайте перейдем к ссылкам ACL и SCO, используемым на уровне основной полосы частот.

        Ссылки ACL — асинхронные без установления соединения

        Ссылки ACL — это многоточечные каналы между главным устройством и всеми подчиненными устройствами, участвующими в пикосети. Ссылки ACL несут информацию о данных, и может существовать только одна ссылка. Повторная передача пакетов данных разрешена в ссылках ACL.

        Ссылки SCO – ссылка для синхронного подключения

        Связь SCO – это симметричная двухточечная связь между ведущим устройством и одним подчиненным устройством. Он может передавать как данные, так и голосовую информацию, но в основном передает голосовую информацию. Мастер может поддерживать от двух до трех каналов SCO. Пакеты SCO никогда не передаются повторно.

        ЛОГИЧЕСКИЕ КАНАЛЫ

        Канал – это высокоскоростная двусторонняя связь между двумя устройствами. Например, компьютер и его периферийное устройство. В Bluetooth имеется пять различных типов каналов, которые можно использовать для передачи различных типов информации. Каналы LC (канал управления) и LM (менеджер связи) используются в части связи на уровне ссылки. UA, UI и US используются для передачи асинхронной, изосинхронной и синхронной пользовательской информации.

        АДРЕСАЦИЯ BLUETOOTH

        Адрес – это имя или токен, идентифицирующий компонент в сети. В основном существует четыре адреса устройств, как показано ниже.

        48-битный адрес устройства Bluetooth (стандарт IEEE802). Он делится на LAP (младшая часть адреса из 24 бит), UAP (верхняя часть адреса из 8 бит) и NAP (незначащая часть адреса из 16 бит).

        3-битный адрес активного члена. Нулевой AM_ADDR предназначен для широковещательных сообщений.

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

        Читайте также: