В этом примере показано, как генерировать и декодировать кадры профиля приложения ZigBee ® Light Link [1] с помощью библиотеки Communications Toolbox™ Library для протокола ZigBee.
Стандарт ZigBee [2] определяет сетевые (NET или NWK) и прикладные (APP или APL) уровни низкоскоростных беспроводных персональных сетей (LR-WPAN). Эти спецификации уровня NET- и APP основаны на спецификациях PHY и MAC IEEE ® 802.15.4™ [3]. Устройства ZigBee находят применение в домашней автоматизации и создании сетей датчиков и имеют большое значение для развития Интернета вещей.
Прикладной уровень ZigBee состоит из нескольких подуровней: (i) подуровня поддержки приложений (APS) и (ii) кластерной библиотеки ZigBee (ZCL).

Заголовки APS и ZCL имеют формат, общий для всех профилей приложений и кластеров ZigBee (см. пункты 2.2.5 в [2] и 2.4 в [4] соответственно). Полезная нагрузка ZCL используется только некоторыми кластерами и соответствует специфичному для кластера формату. Генерация и декодирование общих APS и ZCL заголовков проиллюстрированы в примере генерации и декодирования кадров домашней автоматизации ZigBee. Этот пример иллюстрирует создание и декодирование полезных нагрузок ZCL Light Link для конкретного кластера.
Из 7 кластеров, указанных в профиле приложения Light Link [1], этот пример генерирует и декодирует кадры для следующих кластеров:
Идентификация кластера: Этот кластер устанавливает устройство в режим идентификации (например, мигает светом). Этот пример иллюстрирует формирование и декодирование кадров для команды Identify (описана в пункте 3.5 [4]).
Кластер управления цветом: этот кластер изменяет цвет осветительного устройства. В этом примере показано формирование и декодирование кадров для команды Move to Color (см. п. 5.2 [4]).
Кластер Level Control: этот кластер изменяет уровень устройства, например, интенсивность лампочки, степень закрытия двери или интенсивность нагревателя. В этом примере показано формирование и декодирование кадров для команды Move to Level (см. п. 3.10 [4]).
Кластер сцен: кластер сцен устанавливает и отзывает сцены (т.е. наборы сохраненных значений атрибутов для других кластеров в том же устройстве). Этот пример иллюстрирует формирование и декодирование кадров для команды View Scene (см. раздел 3.7 в [4]).
Групповой кластер: этот кластер управляет группами устройств, например, путем создания или удаления группы или путем обнаружения членства в группе. Этот пример иллюстрирует формирование и декодирование кадров для команды Add group (описана в пункте 3.6 [4]).
В дополнение к проиллюстрированным командам этот пример обеспечивает реализацию для генерации и декодирования кадров для всех команд пяти упомянутых кластеров (полный список см. в разделе Дальнейшее исследование).
Зигби. Объект конфигурации FrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL кластера Identify. Такие объекты описывают полезную нагрузку кластера Identify и все применимые свойства. Зигби. Функция FrameGenerator принимает zigbee. Объект FrameConfig, описывающий полезную нагрузку кластера Identify и выводящий сгенерированную полезную нагрузку в байтах. Следующий код создает полезную нагрузку ZCL для команды, запрашивающей идентификацию устройства в течение 4 секунд.
% Creation of configuration object for Identify cluster identifyConfigTx = zigbee.IdentifyFrameConfig('CommandType', 'Identify', ... 'IdentifyTime', 4); % Frame generation (ZCL payload) for Identify cluster identifyPayload = zigbee.IdentifyFrameGenerator(identifyConfigTx);
Зигби. Функция FrameDecoder принимает имя команды и полезную нагрузку кластера Identify в байтах и выводит zigbee. Объект FrameConfig, описывающий полезную нагрузку кластера Identify. Имя команды извлекается из декодирования заголовка ZCL. См. раздел «Декодирование заголовка ZCL домашних радиостанций автоматизации ZigBee» в примере генерации и декодирования кадров домашней автоматизации ZigBee.
identifyConfigRx = zigbee.IdentifyFrameDecoder('Identify', identifyPayload)
identifyConfigRx =
IdentifyFrameConfig with properties:
CommandType: 'Identify'
IdentifyTime: 4
Следующий код визуализирует «программную лампочку», которая иллюстрирует эффект идентификации, указанный в принятом кадре.
bulb = plotBulb('white');
zigbeeIdentifyBulb(bulb, identifyConfigRx.IdentifyTime);
close(bulb);
Зигби. Объект конфигурации ColorControlFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL кластера управления цветом. Такие объекты описывают полезную нагрузку кластера управления цветом и все применимые свойства. Зигби. Функция ColorControlFrameGenerator принимает зигби. Объект ColorControlFrameConfig, описывающий полезную нагрузку кластера управления цветом и выводящий сгенерированную полезную нагрузку в байтах. Следующий код генерирует полезную нагрузку кластера управления цветом, которая предписывает осветительному устройству постепенно изменять свой текущий цвет (красный) на другое значение (зеленый) в течение 50 секунд принятия решения (т.е. 5 секунд). Цвет описывается в терминах значений x, y в соответствии с цветовым пространством CIE 1931, установленным Международной комиссией по освещению (CIE) [5].
bulb = plotBulb('red');

% Creation of configuration object for Color Control cluster colorCtrlConfigTx = zigbee.ColorControlFrameConfig('CommandType', 'Move to Color', ... 'ColorX', 16384, 'ColorY', 39322, 'Time', 50); % Frame generation (ZCL payload) for Color Control cluster colorControlPayload = zigbee.ColorControlFrameGenerator(colorCtrlConfigTx);
Зигби. Функция ColorControlFrameDecoder принимает имя команды и полезную нагрузку кластера управления цветом в байтах и выводит zigbee. Объект ColorControlFrameConfig, описывающий полезную нагрузку кластера управления цветом. Имя команды извлекается из декодирования заголовка ZCL. См. раздел «Декодирование заголовка ZCL домашних радиостанций автоматизации ZigBee» в примере генерации и декодирования кадров домашней автоматизации ZigBee.
colorCtrlConfigRx = zigbee.ColorControlFrameDecoder('Move to Color', colorControlPayload)
colorCtrlConfigRx =
ColorControlFrameConfig with properties:
CommandType: 'Move to Color'
ColorX: 16384
ColorY: 39322
Time: 50
Следующая команда использует «программную лампочку» для визуализации эффекта управления цветом, указанного в полученном кадре. В частности, цвет луковицы постепенно изменяется с красного на зеленый в течение 5 секунд.
zigbeeMoveBulbColor(bulb, colorCtrlConfigRx.ColorX, colorCtrlConfigRx.ColorY, colorCtrlConfigRx.Time);

Далее тот же эффект происходит на другой цветовой траектории (от зелёного до фиолетового).
colorCtrlConfigTx2 = zigbee.ColorControlFrameConfig('CommandType', 'Move to Color', ... 'ColorX', 19661, 'ColorY', 6554, 'Time', 50); colorControlPayload2 = zigbee.ColorControlFrameGenerator(colorCtrlConfigTx2); colorCtrlConfigRx2 = zigbee.ColorControlFrameDecoder('Move to Color', colorControlPayload2); zigbeeMoveBulbColor(bulb, colorCtrlConfigRx2.ColorX, colorCtrlConfigRx2.ColorY, colorCtrlConfigRx2.Time); pause(1.5);

Зигби. Объект конфигурации Leign ControlFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL кластера Level Control. Такие объекты описывают полезную нагрузку кластера Level Control и все применимые свойства. Зигби. Функция Leign ControlFrameGenerator принимает zigbee. Объект Leign ControlFrameConfig, описывающий полезную нагрузку кластера Level Control и выводящий сгенерированную полезную нагрузку в байтах. Следующий код создает полезную нагрузку кластера Level Control, которая предписывает устройству изменить текущий уровень на указанное значение.
% Creation of Level Control cluster configuration object levelCtrlConfigTx = zigbee.LevelControlFrameConfig('CommandType', 'Move to Level', ... 'Level', 20, 'TransitionTime', 1); % Level Control cluster frame generation (ZCL payload) levelControlPayload = zigbee.LevelControlFrameGenerator(levelCtrlConfigTx);
Зигби. Функция LeegControlFrameDecoder принимает имя команды и полезную нагрузку кластера Level Control в байтах и выводит zigbee. Объект Leign ControlFrameConfig, описывающий полезную нагрузку кластера Level Control. Имя команды извлекается из декодирования заголовка ZCL. См. раздел «Декодирование заголовка ZCL домашних радиостанций автоматизации ZigBee» в примере генерации и декодирования кадров домашней автоматизации ZigBee.
levelCtrlConfigRx = zigbee.LevelControlFrameDecoder('Move to Level', levelControlPayload)
levelCtrlConfigRx =
LevelControlFrameConfig with properties:
CommandType: 'Move to Level'
Level: 20
TransitionTime: 1
Хотя кластер Level Control может использоваться для регулирования интенсивности света, кластер Color Control оставляет его кластеру Level Control для управления яркостью цвета осветительного устройства. В следующем примере используется принятый кадр управления уровнем для увеличения уровня яркости лампочки.
zigbeeMoveBulbColor(bulb, colorCtrlConfigRx2.ColorX, colorCtrlConfigRx2.ColorY, 1, levelCtrlConfigRx.Level);

Зигби. Объект конфигурации FrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL кластера Scenes. Такие объекты описывают полезную нагрузку кластера сцен и все применимые свойства. Зигби. Функция FrameGenerator принимает zigbee. Объект FrameConfig, описывающий полезную нагрузку кластера Scenes и выводящий сгенерированную полезную нагрузку в байтах. Следующий код генерирует полезную нагрузку кластера Scenes, которая запрашивает устройство передать другой кадр (View Scene Response), описывающий сцену.
% Creation of Scenes cluster configuration object scenesConfigTx = zigbee.ScenesFrameConfig('CommandType', 'View Scene', ... 'GroupID', '1234', 'SceneID', '56'); % Scenes cluster frame generation (ZCL payload) scenesPayload = zigbee.ScenesFrameGenerator(scenesConfigTx);
Зигби. Функция FrameDecoder принимает имя команды и полезную нагрузку кластера Scenes в байтах и выводит zigbee. Объект FrameConfig, описывающий полезную нагрузку кластера Scenes. Имя команды извлекается из декодирования заголовка ZCL. См. раздел «Декодирование заголовка ZCL домашних радиостанций автоматизации ZigBee» в примере генерации и декодирования кадров домашней автоматизации ZigBee.
scenesConfigRx = zigbee.ScenesFrameDecoder('View Scene', scenesPayload)
scenesConfigRx =
ScenesFrameConfig with properties:
CommandType: 'View Scene'
GroupID: '1234'
SceneID: '56'
Зигби. Объект конфигурации GroupFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL кластера групп. Такие объекты описывают полезную нагрузку кластера групп и все применимые свойства. Зигби. Функция Groups FrameGenerator принимает zigbee. Объект Groups FrameConfig, описывающий полезную нагрузку кластера Groups, и выводит сгенерированную полезную нагрузку в байтах. Следующий код создает полезную нагрузку кластера Groups, которая предписывает устройству добавить указанную группу в таблицу Group.
% Creation of Groups cluster configuration object groupsConfigTx = zigbee.GroupsFrameConfig('CommandType', 'Add group', ... 'GroupName', 'Dining Hall', 'GroupID', '1234'); % Groups cluster frame generation (ZCL payload) groupsPayload = zigbee.GroupsFrameGenerator(groupsConfigTx);
Зигби. Функция GroupFrameDecoder принимает имя команды и полезную нагрузку кластера Groups в байтах и выводит zigbee. Объект GroupFrameConfig, описывающий полезную нагрузку кластера Groups. Имя команды извлекается из декодирования заголовка ZCL. См. раздел «Декодирование заголовка ZCL домашних радиостанций автоматизации ZigBee» в примере генерации и декодирования кадров домашней автоматизации ZigBee.
groupsConfigRx = zigbee.GroupsFrameDecoder('Add group', groupsPayload)
groupsConfigRx =
GroupsFrameConfig with properties:
CommandType: 'Add group'
GroupID: '1234'
GroupName: 'Dining Hall'
Сгенерированные кадры могут быть преобразованы в формат PCAP, который может быть проанализирован и визуализирован с помощью программы Wireshark [6]. Этот процесс может служить дополнительным этапом проверки, предлагающим, чтобы библиотека Communications Toolbox Library для протокола ZigBee генерировала и декодировала кадры в соответствии со стандартами.
Файл PCAP должен содержать полезные нагрузки ZCL с заголовками всех других уровней и подуровней (MAC, NET, APS, ZCL). Следующие команды генерируют файл PCAP для полезных нагрузок ZCL, сгенерированных в этом примере, которые могут быть загружены с помощью программы Wireshark.
% ZLL profile ID zllProfileID = zigbee.profileID('Light Link'); payloadsWithInfo(1) = struct('Payload', identifyPayload, 'ProfileID', zllProfileID, ... 'ClusterSpecific', true, 'ClusterID', zigbee.clusterID('Identify'), 'CommandType', 'Identify', 'Direction', 'Uplink'); payloadsWithInfo(2) = struct('Payload', colorControlPayload, 'ProfileID', zllProfileID, ... 'ClusterSpecific', true, 'ClusterID', zigbee.clusterID('Color Control'), 'CommandType', 'Move to Color', 'Direction', 'Uplink'); payloadsWithInfo(3) = struct('Payload', levelControlPayload, 'ProfileID', zllProfileID, ... 'ClusterSpecific', true, 'ClusterID', zigbee.clusterID('Level Control'), 'CommandType', 'Move to Level', 'Direction', 'Uplink'); payloadsWithInfo(4) = struct('Payload', scenesPayload, 'ProfileID', zllProfileID, ... 'ClusterSpecific', true, 'ClusterID', zigbee.clusterID('Scenes'), 'CommandType', 'View Scene', 'Direction', 'Uplink'); payloadsWithInfo(5) = struct('Payload', groupsPayload, 'ProfileID', zllProfileID, ... 'ClusterSpecific', true, 'ClusterID', zigbee.clusterID('Groups'), 'CommandType', 'Add group', 'Direction', 'Uplink'); % Add headers from other layers/sublayers: MPDUs = zigbeeAddProtocolHeaders(payloadsWithInfo); % Export MPDUs to a PCAP format zigbeeExportToPcap(MPDUs, 'zigbeeLightLink.pcap'); % Open PCAP file with Wireshark
Далее можно изучить следующие функции генератора и декодирования, а также объект конфигурации:
zigbee.APSFrameConfig, zigbee. APSFrameGenerator, zigbee. APSFrameDecoder
zigbee.ZCLFrameConfig, zigbee. ZCLFrameGenerator, zigbee. ZCLFrameDecoder
zigbee. IdentifyFrameConfig, zigbee. IdentifyFrameGenerator, zigbee. IdentifyFrameDecoder
zigbee.ColorControlFrameConfig, zigbee. ColorControlFrameGenerator, zigbee. ColorControlFrameDecoder
zigbe.Leign ControlFrameConfig, zigbee. Leign ControlFrameGenerator, zigbee. LevelControlFrameDecoder
zigbee. ScenesFrameConfig, zigbee. ScenesFrameGenerator, zigbee. ScenesFrameDecoder
zigbee.Groups FrameConfig, zigbee. Groups FrameGenerator, zigbee. GroupsFrameDecoder
В дополнение к командам, проиллюстрированным в этом примере, предлагаемая реализация также поддерживает команды, перечисленные в следующей таблице. Команды, перечисленные в среднем столбце, могут быть экспортированы в файл PCAP, который может быть проанализирован с помощью программы Wireshark.

ZigBee Alliance, ZigBee Light Link Standard, версия 1.0, 5 апреля 2012 г.
Альянс ZigBee, Документ спецификации ZigBee 053474r17, 2007
IEEE 802.15.4-2011 - Стандарт IEEE для локальных и городских сетей - Часть 15.4: Низкоскоростные беспроводные персональные сети (LR-WPAN)
Альянс ZigBee, спецификация кластерной библиотеки ZigBee, редакция 6, январь 2016 г.
Цветовое пространство CIE 1931. Международная комиссия по делам об эклайрейдж. Кембриджский университет Пресс, Кембридж
Программное обеспечение Wireshark: https://www.wireshark.org/