Протокол

Канал связи

Модули nRF24L01 имеют возможность организации до шести каналов связи («труб» в терминологии разработчиков) между разными модулями. В AMS используются два канала — один для передачи данных и один для приёма. Arduino Mega Server является «базой», а сенсоры — «клиентами». Пользоваться каналами может множество устройств и вся информация, проходящая в канале («трубе») доступна всем подключённым к этому каналу устройствам.

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

Работа AMS nRF24 controller

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

Структура пакета

Все сообщения, передаваемые по беспроводной сети nRF24 представляют собой пакеты из 32 байт. Это максимальная длина, поддерживаемая модулями nRF24L01. Беспроводной стек AMS делит этот объём на три части:

  • Заголовок, содержащий служебную информацию (9 байт)
  • Пароль (8 байт)
  • Данные (15 байт)

Заголовок

Заголовок пакета содержит всю необходимую служебную информацию:

  • Байт 0 — Тип пакета
  • Байт 1 — Команда
  • Байт 2 — Сетевой адрес
  • Байт 3 — Адрес назначения
  • Байт 4 — Подтверждение доставки
  • Байт 5 — Номер пакета
  • Байт 6 — Резерв
  • Байт 7 — Резерв
  • Байт 8 — Резерв

Тип пакета

Всего существует семь типов пакетов:

  • 0 — Пустая команда
  • 1 — Команда
  • 2 — Запрос
  • 3 — Данные
  • 4 — Аларм (тревожное сообщение)
  • 5 — Ответ
  • 6 — Эхо
Пустая команда

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

Команда

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

Запрос

Запрос предусматривает совершенно определённую реакцию принимающий стороны. Например, на запрос температуры датчик должен ответить посылкой пакета данных, содержащим текущее значение температуры. Запрашиваться могут любые данные, какие конкретно — определяется вами при программировании датчика или базового AMS.

Данные

Пакеты с данными могут посылаться участниками сети по своей инициативе или в ответ на заранее определённые запросы. Конкретная логика работы определяется вами при программировании системы. Данные могут быть абсолютно любыми, единственное, о чём нужно помнить — это об ограничении в 15 байт в одном пакете. Если вам нужно передать больший объём данных, то вам нужно либо разбить его на несколько пакетов, либо перепрограммировать сам стек AMS nRF24.

Аларм (тревожное сообщение)

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

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

Ответ

Это заранее определённые ответы на посланные запросы. Вы просто определяете реакцию на пришедшие данные. Типовой сценарий — присвоение пришедших значений переменным в скетче. Далее с этими переменными можно делать всё, что угодно — выводить в интерфейс AMS, принимать на основе этих значений какие-либо решения и т. д.

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

Эхо

Это эхо в буквальном смысле — принятая команда копируется в буфер отправки и посылается обратно на пославшую его сторону. Это используется для подтверждения доставки посланного пакета: на пославшую сторону приходит эхо и принимается решение об успешности посылки пакета.

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

Команды

Список команд это заранее определённый набор сообщений, которыми могут обмениваться устройства в беспроводной сети nRF24. Ниже представлен набор команд, поддерживаемый текущей версией AMS. Вы в любой момент можете расширить его, дополнив любыми другими командами (соответствующим образом запрограммировав их).

Список запросов, поддерживаемых системой
  • GET_NAME — запрос имени системы
  • GET_ADDR — запрос сетевого адреса
  • GET_ID — запрос уникального идентификатора
  • GET_FREE_MEM — запрос величины свободной памяти
  • GET_BATTERY — запрос уровня напряжения питания
  • GET_HEALTH — запрос интегрального здоровья системы
  • GET_SELF_TEMP — запрос температуры внутреннего датчика ATmega
  • GET_TEMP_1 — запрос температуры подключённого датчика №1
  • SET_NAME — установка имени системы
  • SET_ADDR — установка сетевого адреса

Эти команды работают в отношении сенсора (потому, что они так запрограммированы), но если вы запрограммируете реакцию на них со стороны AMS, то они будут действовать и на сам Arduino Mega Server.

Список данных, поддерживаемых системой
  • DTA_NAME — имя системы (сенсора)
  • DTA_ADDR — сетевой адрес сенсора
  • DTA_ID — идентификатор сенсора
  • DTA_FREE_MEM — свободная память сенсора
  • DTA_BATTERY — уровень питания сенсора
  • DTA_HEALTH — здоровье сенсора
  • DTA_SELF_TEMP — температура внутреннего датчика ATmega
  • DTA_TEMP_1 — температура датчика №1

Этот блок команд отвечает за посылку данных от сенсора к серверу. На стороне сенсора описаны процедуры самостоятельной посылки данных и посылки их в ответ на запросы со стороны AMS, а на стороне Arduino Mega Server запрограммированы запросы этих данных.

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

Сетевые адреса

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

При первом включении адреса выбираются случайным образом, но вы можете изменить адрес датчика путём посылки соответствующей команды по сети nRF24.

Подтверждение доставки

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

  • 0 — Подтверждения не требуется
  • 1 — Требуется подтверждение

Номер пакета

Это порядковый номер пакета какой-либо команды. Используется, чтобы отличать один конкретный пакет от другого. После достижения максимального значения 255, номер обнуляется и счёт продолжается снова.

Пароль

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

Данные

15 байт, которые вы можете использовать как угодно по своему усмотрению. На передающей стороне помещаете сюда информацию в любом формате, а на приёмной — извлекаете и интерпретируете в соответствии с номером команды.

Обратите внимание. Система Arduino Mega Server непрерывно развивается и в код проекта постоянно вносятся изменения и улучшения, поэтому, описание и документация может не соответствовать вашей конкретной версии системы. Последняя правка этой страницы относится к 0.15 версии системы.