Это пятая и последняя часть перевода книги Мохаммада Афане “Intro to Bluetooth Low Energy”. Сегодня мы завершим чтение книги ознакомлением с Bluetooth Mesh. Эта технология нашла свое применение в приложениях, требующих распределенной сети малопотребляющих датчиков или иных устройств. Наиболее полно раскрыть возможности Bluetooth Mesh можно, например, при создании ценников с E-Ink дисплеями для торгового зала. Использование ценников как Low-Power Nodes и некоего хаба как Friendly Node не только позволяет с минимальными затратами поддерживать актуальность ценников в течении нескольких лет без их замены и задействования персонала, но и проводить кратковременные "счастливые часы", быстро меняя информацию на дисплее. Предыдущие части перевода: Про архитектуру BLE Про типы устройств, адвертайзинг и сканирование Про соединения и сервисы Про Bluetooth 5 и безопасность Внедрение стандарта BLE в 2010 году привело к быстрому росту вариантов использования устройств интернета вещей, таких как сенсоры, носимые устройства, портативные медицинские инструменты и прочие. В то же время, большим недостатком BLE, существующим с момента его внедрения, была невозможность организации ячеистых сетей, когда множество устройств могут посылать друг другу сообщения и ретранслировать их при необходимости на другие устройства в сети. Ситуация изменилась в июле 2017 года, когда Bluetooth SIG выпустила стандарт Bluetooth Mesh. В этой главе мы рассмотрим наиболее важные основные понятия, чтобы облегчить начало вашего пути в изучении Bluetooth Mesh. Цель Bluetooth Mesh - увеличение дальности связи сетей BLE и добавление поддержки индустриальных приложений, использующих технологию BLE. До выпуска Bluetooth Mesh, BLE поддерживал только две топологии сети: Точка-точка: когда два устройства подключены друг к другу. Точка-многоточка: когда устройства остаются в состоянии адвертайзинга, как маячки. С Bluetooth Mesh была добавлена новая топология для сетей BLE: устройства теперь могут работать в ячеистой топологии “многие к многим”. Топология mesh-сети дает два важных преимущества: Увеличенная дальность связиТак как участники сети могут ретранслировать сообщения для передачи устройствам, находящимся на удалении от передатчика, размер сети и количество устройств в них могут быть значительно увеличены. Способность к самовосстановлениюЕсли один из элементов сети выйдет из строя, остальные останутся в строю и смогут передавать сообщения друг другу. К сожалению, это лишь отчасти применимо к Bluetooth Mesh, так как существуют некоторые типы устройств в сети, от которых могут зависеть другие. Мы рассмотрим их позднее в этой главе. Несколько важных примечаний касательно Bluetooth Mesh: Bluetooth Mesh поддерживает все версии BLE (начиная с 4.0) и не требует изменений в аппаратном обеспечении. Единственное, чего он требует - обновления ПО уже выпущенных устройств для обеспечения совместимости со стандартом. Bluetooth Mesh это отдельный стандарт с отдельной спецификацией, которая находится здесь. Bluetooth Mesh версии 1.0 не поддерживает ни одной особенности Bluetooth 5, например расширений адвертайзинга или кодированного PHY. Скорее всего, ситуация изменится в следующих версиях. Bluetooth Mesh является надстройкой над BLE. Он особым образом использует состояние адвертайзинга устройств с BLE. Устройства в сети Bluetooth Mesh не соединяются с другими так, как это делают классические устройства с BLE. Вместо этого они используют состояния адвертайзинга и сканирования для ретрансляции сообщений от одного устройства к другому. Существует только одно исключение из этого правила, устройство-прокси, которое может быть частью mesh-сети (мы рассмотрим его в секции “типы устройств”). Ниже представлено описание каждого из уровней архитектуры Bluetooth Mesh, в порядке возрастания: Уровень Bluetooth Low EnergyКак мы упоминали ранее, Bluetooth Mesh является надстройкой над BLE, и таким образом, он требует полного стека BLE, работающего на устройстве. Он использует состояния сканирования и адвертайзинга для отправки и получения сообщений между устройствами в mesh-сети. Также он поддерживает подключенное состояние и GATT для специальных устройств, называемых прокси-устройствами. Несущий уровеньНесущий уровень определяет то, как различные mesh-пакеты обрабатываются. Существует два вида передающих сред в Bluetooth Mesh: Передача через адвертайзинг: используются состояния сканирования и адвертайзинга. Передача через GATT: используется подключенное состояние устройств. Оно позволяет устройствам, не поддерживающим работу в mesh-сети, взаимодействовать с составляющими этой сети. Этот режим используется в прокси-устройствах. Нижний транспортный уровеньЭтот уровень решает две основные задачи: сегментация пакетов, пришедших с верхнего транспортного уровня и восстановление пакетов, пришедших с несущего уровня. Верхний транспортный уровеньЭтот уровень отвечает за шифрование и расшифровку данных, аутентификацию устройств и передачу управляющих сообщений (пульс сети, сообщения между дружественными устройствами и прочие). Уровень доступаЭтот уровень определяет, как приложение использует верхний транспортный уровень и решает задачи форматирования данных приложения, шифрование и расшифровку а также проверку данных. Уровень фундаментальных моделейЭтот уровень решает задачу конфигурации сети и модели управления сетью. Уровень моделей сетиЭтот уровень занимается реализацией моделей, включая их поведение, сообщения, состояния и привязки состояний. Рассмотрим основные понятия и термины Bluetooth Mesh. Устройства, являющиеся частью mesh-сети, называются ее узлами. Устройства, ещё не являющиеся частью сети, называются неидентифицированными устройствами. После того, как неидентифицированное устройство становится идентифицированным, оно становится частью сети, т.е. ее узлом. Узел может состоять из нескольких частей, каждая из которых может управляться независимо. Например, светильник может состоять из нескольких лампочек, каждая из которых может включаться и выключаться независимо от других. Эти части одного узла называются его элементами. Элементы могут находиться в различных условиях, описываемых как состояния. Например, “включен” и ”выключен” являются состояниями лампочки светильника. Переход из одного состояния в другое называется сменой состояния. Смена состояния может происходить моментально или занимать некоторое время, называемое временем перехода. Смена состояния зачастую вызывает смену поведения элемента. Некоторые из состояний могут быть привязаны к другим, в том смысле, что смена одного состояния вызывает смену другого. Два или большее количество состояний могут быть привязаны друг к другу. Возьмем в качестве примера диммер светильника: он может иметь состояние уровня и состояние вкл/выкл. Если значение текущего уровня станет равно нулю, это вызовет смену состояния вкл/выкл на “выключено”. Если значение уровня перестанет быть равно нулю, это вызовет смену состояния с “выключено” на “включено”. Свойства содержат дополнительную информацию о текущем состоянии. Например, значение температуры может иметь свойства “в помещении” и “на улице”. Существует два типа свойств: Заданные производителем: предоставляют только права на чтение. Заданные администратором: предоставляют права как на чтение, так и на запись. Bluetooth Mesh - сеть, построенная на концепции сообщений, где узлы посылают сообщения для управления состояниями или передачи информации другим узлам сети. Сообщения – это механизм, вызывающий выполнение операций узлами сети. Если узлу нужно сообщить о своем статусе, то он посылает его, используя сообщение. Тип сообщения отображает операции над состоянием или набор нескольких значений состояний. В Bluetooth Mesh существует три типа сообщений, каждый из которых определен при помощи уникального кода операции: Сообщение запроса (GET): сообщение с запросом на получение состояния одного или нескольких узлов. Сообщение установки (SET): указание изменить значение какого-либо параметра. Сообщение о статусе (STATUS): статусное сообщение используется в нескольких ситуациях: Отправляется в ответ на сообщение запроса и содержит значение требуемого параметра. Отправляется в качестве подтверждения получения сообщения установки. Отправляется независимо от любых сообщений для отображения статуса элемента. Например отправка такого сообщения может быть инициирована таймером, работающим на устройстве. Отправка некоторых сообщений требует от получателя отправки подтверждающего сообщения, решающего следующие задачи: Подтверждение получения сообщения. Передача данных, относящихся к полученному сообщению. В случае, когда ответ на сообщение не получен отправителем, или пришел некорректный ответ, отправитель может переотправить сообщение. Получение множественных подтверждающих сообщений не нарушают работу получателя (такая ситуация расценивается как получение единичного подтверждающего сообщения). Сообщения в mesh-сети должны в обязательном порядке адресовываться. Существует три типа адресов: Индивидуальный адрес: однозначно определяет конкретный узел, которому этот адрес был присвоен в процессе формирования сети (рассмотрим кратко чуть позднее). Групповой адрес: используется при обращении к группе узлов. Групповой адрес обычно отображает физическое группирование узлов по определенному признаку, например, узлы, расположенные в одной комнате. Групповой адрес может быть: Определен Bluetooth SIG и использоваться в случае обращения ко всем без исключения устройствам, принадлежащим к одному типу: прокси-узлам, дружественным устройствам, ретрансляторам или же ко всем устройствам, независимо от их типа. Динамическим групповым адресом, определяемым пользователем в процессе настройки сети. Виртуальные адреса: Адреса, которые могут быть назначены одному или нескольким элементам и могут охватывать один или несколько узлов. Этот адрес действует как метка и принимает форму 128-битного UUID, с которым может быть связан любой элемент. Обычно виртуальные адреса конфигурируются во время производства устройств. Передача сообщений в Bluetooth Mesh сети ведется в соответствии с шаблоном проектирования “издатель-подписчик”. Суть шаблона хорошо описана в Википедии: “Издатель-подписчик (англ. publisher-subscriber или англ. pub/sub) — поведенческий шаблон проектирования передачи сообщений, в котором отправители сообщений, именуемые издателями (англ. publishers), напрямую не привязаны программным кодом отправки сообщений к подписчикам (англ. subscribers). Вместо этого сообщения делятся на классы и не содержат сведений о своих подписчиках, если таковые есть. Аналогичным образом подписчики имеют дело с одним или несколькими классами сообщений, абстрагируясь от конкретных издателей.” Публикация здесь – это акт отправки сообщения. Подписка – это конфигурация, используемая для того, чтобы разрешить некоторым сообщениям быть отправленными на определенные адреса для обработки. Обычно сообщения адресуются группам или виртуальным адресам. На рисунке ниже представлен пример домашней mesh-сети, состоящей из 6 выключателей и 9 светильников. Сеть использует шаблон “издатель-подписчик” для того, чтобы позволить узлам посылать сообщения друг другу. Узлы могут подписываться на несколько адресов. В этом примере светильник №3 подписан на групповые адреса “кухня” и “столовая”. Также множество узлов может публиковать сообщения на один адрес, как выключатели №5 и №6 в этом примере. Два этих выключателя контролируют одну и ту же группу светильников, расположенных в саду. Преимущество использования групповых или виртуальных адресов заключается в том, что добавление или удаление узлов не требует реконфигурации всей сети. Многие mesh-сети используют маршрутизирующие механизмы для передачи сообщений по сети. Другой подход заключается в заполнении сети сообщениями без учета оптимальных маршрутов, которыми следовало бы пользоваться. Bluetooth Mesh использует компромиссный подход, называемый управляемым потоком. Управляемый поток означает широковещательную передачу сообщений всем узлам в пределах видимости отправителя с несколькими оптимизациями: Сообщения имеют присвоенное им “время жизни” (TTL, “time-to-live”)Каждое сообщение может передаваться между узлами ограниченное число раз, ограниченное “временем жизни”. Нулевое значение “времени жизни” указывает, что сообщение не было передано и не должно быть передано. Это означает, что узел может отправить это сообщение другим узлам в пределах его видимости и что принимающие узлы не должны ретранслировать это сообщение.Если сообщение отправляется с TTL ≥ 2, то при каждой последующей передаче значение TTL будет декрементироваться. Значение TTL равное единице означает, что сообщение может быть ретранслировано только один раз. Сообщения кэшируютсяКэширование сообщений обязательно для всех узлов. Оно требуется для того, чтобы один узел не ретранслировал многократно одно и то же сообщение. Периодически посылаются уведомления об активностиУведомления об активности используются для того, чтобы показать остальным узлам, что отправитель функционирует и находится в сети. ДружбаДружба – это понятие, применимое к отношениям между двумя узлами. Эти узлы имеют следующие типы: Малопотребляющий узел, который экономит энергию и не может принимать сообщения постоянно. Этот узел проводит большую часть своего времени в выключенном состоянии. Узел без ограничений в энергопотреблении называется дружественным узлом и выполняет роль прокси для малопотребляющего узла. Дружественный узел кэширует сообщения, предназначенные для малопотребляющего узла, что позволяет ему находиться в режиме энергосбережения большую часть времени и изредка просыпаться. Когда малопотребляющий узел просыпается, он опрашивает дружественный узел о наличии предназначенных ему сообщений, обрабатывает их и при необходимости посылает ответные сообщения в mesh-сеть. Другим важным термином, определенным в Bluetooth Mesh, является понятие модели. Модель определяет функциональность устройства, или часть ее. Существует три категории моделей: Серверная модель: набор состояний, смен состояний, связей состояний и сообщений, которые может передавать или принимать узел, соответствующий этой модели. Клиентская модель: не определяет никаких состояний. Вместо этого она определяет только тип сообщений (GET, SET, STATUS), отправляемых узлу с серверной моделью. Контролирующая модель: содержит в себе как серверную, так и клиентскую модель, осуществляя коммуникации с другими серверными и клиентскими моделями. Модели могут быть расширены с целью включения дополнительной информации, не меняя оригинальную модель. Модель, которая не является расширенной, называется корневой моделью. Последнее понятие, которое мы бы хотели рассмотреть, это понятие о сценах в сети Bluetooth Mesh. Сцена – это сохраненный набор состояний, который определяется 16-битным номером, уникальным в пределах этой сети. Сцены позволяют совершить одно действие, чтобы установить множество состояний на различных узлах. Они могут выполняться по запросу или через промежутки времени. Например, сцена может быть настроена на установку температуры 22 градуса в комнате, установку определенной яркости светильников и на закрытие жалюзи одновременно. Все типы узлов могут принимать и передавать сообщения. Тем не менее, дополнительные функции дают определенным узлам специальные возможности. Ниже представлены различные типы узлов с их дополнительными возможностями: Узлы-ретрансляторы Прокси-узлы Дружественные узлы Малопотребляющие узлы Узел может иметь любые из этих дополнительных возможностей, во всех сочетаниях, а также включать и выключать их в любой момент времени. Например, любой узел может иметь возможности ретранслятора, прокси и дружественного узла одновременно. Узел-ретранслятор это тот, который поддерживает функцию ретрансляции. Это означает, что он может передавать сообщения, отправленные другими узлами. Это увеличивает дальность связи для первоначального отправителя и позволяет им проходить через всю сеть за пределами досягаемости исходного передающего узла. Для того, чтобы позволить обмен сообщениями между mesh-сетью и не поддерживающим mesh BLE-устройством (например, смартфоном), используются специальные прокси-узлы. Прокси-узел действует как посредник и использует GATT-сервер для коммуникации с не поддерживающими mesh устройствами. В этом случае используется прокси-протокол, предназначенный для связи с устройством, имеющим возможность установить соединение (используя GATT). Протокол основан на GATT и позволяет устройству читать и записывать характеристики, представленные на GATT прокси-узла. Прокси-узел проводит необходимые действия по согласованию формата пакетов. Это позволяет смартфону без поддержки mesh взаимодействовать с mesh-сетью при помощи прокси-узла, используя его GATT. Дружественные и малопотребляющие узлы тесно связаны друг с другом. Необходимым условием участия малопотребляющего узла в mesh-сети является наличие дружественных отношений с другим узлом, называемым дружественным. Ниже представлен принцип их взаимодействия: Малопотребляющий узел обычно использует ограниченный источник питания, такой как батарейки, то есть ему требуется сберегать энергию, включая радио как можно реже. Малопотребляющие узлы чаще отправляют сообщения, нежели принимают их. Возьмем для примера температурный датчик, питающийся от компактной батарейки. Ему может потребоваться отправлять показания температуры раз в минуту тогда, когда они находятся выше или ниже установленных пределов. Если пользователь решает изменить установленные пределы,то он отправляет сообщение на температурный сенсор. Для того, чтобы сенсор не потерял это сообщение, он должен быть постоянно включен, тем самым потребляя большое количество энергии. Для того, чтобы решить обозначенную выше проблему, вводится концепция дружественного узла, позволяющего малопотребляющему узлу дольше находиться в выключенном состоянии. Дружественный узел кеширует сообщения, предназначающиеся малопотребляющему узлу. В свою очередь, малопотребляющий узел пробуждается и опрашивает дружественный узел на предмет наличия предназначенных ему сообщений. Во время опроса он также передает свои сообщения, предназначенные другим элементам сети, на дружественный узел для последующей ретрансляции. Взаимоотношения между дружественным и малопотребляющим узлом называются “дружбой”. Дружба это ключевая возможность, позволяющая ограниченным в запасе энергии устройствам взаимодействовать с mesh-сетью и при этом сохранять низкое энергопотребление. Процесс обеспечения – это одно из наиболее важных понятий в Bluetooth Mesh. Он используется для добавления устройств в сеть. Устройство, добавленное в сеть, называется узлом, а устройство, добавившее его - обеспечителем (обычно это планшет, смартфон или ПК). Процесс обеспечения проходит в 5 шагов, рассмотренных далее. Шаг 1 включает в себя то, что называется рассылкой маячков: когда необеспеченное устройство заявляет о своей готовности к обеспечению при помощи рассылки mesh-маячков в пакетах адвертайзинга. Это новый тип данных адвертайзинга, внедренный в стандарте Bluetooth Mesh. Обычно этот процесс запускается путем определенной последовательности нажатия кнопок на необеспеченном устройстве. Когда обеспечитель обнаруживает необеспеченное устройство по рассылаемым им маячкам, он отправляет приглашение на необеспеченное устройство. На данном шаге используется новый тип пакетов, внедренных в Bluetooth Mesh и называемых пакетами приглашения к обеспечению.После этого необеспеченное устройство отвечает пакетом возможностей обеспечения, который содержит информацию о возможностях устройства, включающую в себя: Количество элементов, поддерживаемых устройством. Набор поддерживаемых алгоритмов безопасности. Возможность передачи публичного ключа с использованием ООВ-технологии (out-of-band, передача вне основной полосы). Возможность этого устройства отдавать какие-либо значения пользователю. Возможность этого устройства принимать какие-то значения от пользователя. Обеспечение безопасности в Bluetooth Mesh основано на использовании комбинации симметричных и асимметричных ключей, как в алгоритме эллиптических ключей Диффи-Хеллмана (ECDH). В ECDH обмен публичными ключами производится между обеспечивающим и обеспечиваемым устройствами. Обмен может происходить как с использованием Bluetooth, так и по другим каналам (например NFC). Задачей следующего шага является аутентификация необеспеченного устройства. Обычно это требует взаимодействия пользователя с обеспечителем и необеспеченным устройством. Способ аутентификации зависит от возможностей обоих устройств. В первом случае, называемом выдачей вне полосы, необеспеченное устройство должно выдать пользователю случайное число в некоторой форме, например в виде определенного числа морганий светодиода. Затем это число вводится в обеспечивающее устройство. Другой способ называется вводом вне полосы, когда число генерируется обеспечителем и вводится в необеспеченное устройство. Существуют также и другие методы, которые рассматривать мы не будем. Независимо от используемого метода аутентификации аутентификация также включает в себя этап генерирования значения подтверждения и этап проверки подтверждения. После завершения аутентификации, каждое устройство производит ключ сессии, используя собственный приватный ключ и публичный ключ, полученный от другого устройства. Ключ сессии затем используется для защиты соединения во время передачи дополнительных данных обеспечения, включая ключ сети, ключ устройства, параметры безопасности и индивидуальный адрес, который присваивается обеспечивающим устройством. После этого шага необеспеченное устройство становится узлом сети. Первая важная заметка касательно безопасности в Bluetooth Mesh заключается в том, что обеспечение безопасности является обязательным для всех элементов сети, в отличии от BLE, где решение о необходимости обеспечения безопасности принимается разработчиком. Ниже приведены основы безопасности в Bluetooth Mesh: Все сообщения внутри сети зашифрованы и аутентифицированы. Безопасность сети, безопасность приложения и безопасность устройства обеспечиваются независимо друг от друга. Ключи безопасности могут меняться в течении времени жизни сети. Из-за разделения безопасности между уровнями сети, приложений и устройств существует три типа ключей безопасности (каждый из которых решает определенную проблему): Сетевой ключВладение этим общим ключом делает устройство частью сети (то есть узлом). Из сетевого ключа извлекаются два других ключа: сетевой ключ шифрования и ключ конфиденциальности. Владение сетевым ключом позволяет узлу дешифровать и аутентифицировать данные, передаваемые на сетевом уровне, то есть позволяет ретранслировать сообщения, но не позволяет расшифровывать данные приложения. Ключ приложенияЭто ключ, который обычно распределяется внутри набора узлов mesh-сети, выполняющих общую задачу. Например, ключ приложения, управляющего освещением, будет распространен среди выключателей и светильников, но не будет передан термостатам или датчикам движения.Ключ приложения используется для расшифровки и аутентификации сообщений на уровне приложения, но будет действителен только внутри одной сети. Ключ устройстваЭто ключ, принадлежащий конкретному устройству. Он используется в течении процесса обеспечения для защиты соединения между необеспеченным устройством и обеспечителем. Одна из основных проблем mesh-сети – это возможность получения доступа к сети через выброшенное или удаленное устройство, которое раньше было частью сети. Доступ к сети может быть получен путем получения физического доступа к ключам, хранящимся на выброшенном устройстве (также этот способ известен как “атака из мусорного бака”). Для защиты от такого рода атак, Bluetooth Mesh определяет процедуру удаления узла из сети, которая заключается в добавлении узла в черный список и обновлении ключей. Результатом процедуры является распространение новых сетевых ключей и ключей приложений, а также других данных, относящихся к узлам сети, за исключением внесенных в черный список. Другой задачей Bluetooth mesh является обеспечение приватности. Приватность обеспечивается путем использования ключа конфиденциальности для обфускации заголовка сообщения. Например, адрес источника обфусцируется для защиты от отслеживания устройства по его адресу. Ключ конфиденциальности получается из сетевого ключа. Последний раздел безопасности, который мы хотим рассмотреть, это атаки повторением. Суть этих атак заключается в сохранении одного или нескольких сообщений и последующей передаче их устройством злоумышленника. Bluetooth Mesh обеспечивает защиту от такого рода атак следующим путем: Используются порядковые номера. Устройства увеличивают порядковый номер каждый раз, когда они публикуют сообщение. Узел, получающий сообщение, которое содержит порядковый номер меньший или равный номеру одного из предыдущих валидных сообщений, отклонит его (так как это будет похоже на атаку повтором). Используется инкремент дополнительного параметра безопасности, так называемого IV индекса, который является дополнительным параметром, проверяющимся у принятого сообщения. В этой главе мы рассмотрели наиболее важные понятия Bluetooth Mesh, что позволило вкратце познакомиться с новым стандартом Bluetooth. Для того, чтобы узнать больше о Bluetooth Mesh, обратитесь к спецификациям, которые могут быть найдены здесь. На этом всё. Спасибо всем, кто читал и задавал вопросы в комментариях и в личке. Отдельную благодарность за правку и вычитку перевода хочу выразить команде notAnotherOne и @laviol. HW Engineer