Генерация и декодирование кадра ZigBee Light Link

В этом примере показано, как сгенерировать и декодировать системы координат профиля приложения ZigBee ® Light Link [1] с помощью библиотеки Communications Toolbox™ для протокола ZigBee.

Фон

Стандарт ZigBee [2] задает сетевые (NET или NWK) и прикладные (APP или APL) слои низкоскоростных беспроводных персональных вычислительных сетей (LR-WPAN). Эти спецификации уровня NET и APP основаны на спецификациях PHY и MAC IEEE ® 802.15.4™ [3]. Устройства ZigBee находят применение в домашней автоматизации и сенсорных сетях и имеют большое значение для тренда Интернета вещей (IoT).

Прикладной слой ZigBee состоит из нескольких подслоев: (i) Подслой поддержки приложений (APS) и (ii) Библиотека кластеров ZigBee (ZCL).

Заголовки APS и ZCL имеют общий формат для всех профилей приложений и кластеров ZigBee (см. пункты 2.2.5 в [2] и 2.4 в [4], соответственно). Полезная нагрузка ZCL используется только некоторыми кластерами, и она соответствует специфичному для кластера формату. Генерация и декодирование типовых APS и ZCL заголовков проиллюстрированы в примере генерации и декодирования систем координат домашней автоматизации ZigBee. Этот пример иллюстрирует специфичную для кластера генерацию и декодирование полезных нагрузок ZigBee Light Link ZCL.

Кластеры и команды

Из 7 кластеров, указанных в профиле приложения Light Link [1], этот пример генерирует и декодирует системы координат для следующих кластеров:

  1. Идентифицируйте кластер: Этот кластер устанавливает устройство в режим идентификации (например, мигание света). Этот пример иллюстрирует генерацию и декодирование систем координат для команды Identify (описанной в пункте 3.5 [4]).

  2. Кластер управления цветом: Этот кластер изменяет цвет подсветки устройства. Этот пример иллюстрирует генерацию и декодирование систем координат для команды Move to Color (описанной в пункте 5.2 [4]).

  3. Кластер управления уровнем: Этот кластер изменяет уровень устройства, например, интенсивность лампочки, насколько закрыта дверь или интенсивность нагревателя. Этот пример иллюстрирует генерацию и декодирование систем координат для команды Move to Level (описанной в пункте 3.10 [4]).

  4. Кластер сцен: кластер сцен настраивает и вспоминает сцены (т.е. наборы сохраненных значений атрибута для других кластеров в том же устройстве). Этот пример иллюстрирует генерацию и декодирование систем координат для команды View Scene (описанной в пункте 3.7 [4]).

  5. Групповой кластер: Этот кластер управляет группами устройств, например, путем создания или удаления группы или путем обнаружения принадлежности к группе. Этот пример иллюстрирует генерацию и декодирование систем координат для команды Add group (описанной в пункте 3.6 [4]).

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

Генерация и декодирование полезной нагрузки ZCL идентифицирующего кластера

Зигби. Объект строения IdentificationFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL кластера Identification. Такие объекты описывают полезную нагрузку кластера Identify и все применимые свойства. Зигби. Функция IdentifyFrameGenerator принимает zigbee. Объект IdentificationFrameConfig, описывающий полезную нагрузку кластера и выводит сгенерированную полезную нагрузку в байтах. Следующий код создает полезную нагрузку 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);

Зигби. Функция IdentifyFrameDecoder принимает имя команды и полезную нагрузку Identify кластера в байтах и выводит zigbee. Объект IdentificationFrameConfig, описывающий полезную нагрузку кластера Identification. Имя команды извлекается из декодирования заголовка ZCL. Смотрите раздел 'Decoding ZCL Header of Home Automation ZigBee Radios' в примере генерации и декодирования систем координат домашней автоматизации ZigBee.

identifyConfigRx = zigbee.IdentifyFrameDecoder('Identify', identifyPayload)
identifyConfigRx = 

  IdentifyFrameConfig with properties:

     CommandType: 'Identify'
    IdentifyTime: 4

Следующий код визуализирует «программную лампочку», которая иллюстрирует эффект идентификации, заданный в принятой системе координат.

bulb = plotBulb('white');
zigbeeIdentifyBulb(bulb, identifyConfigRx.IdentifyTime);
close(bulb);

Генерация и декодирование полезной нагрузки ZCL кластера управления цветом

Зигби. Объект строения ColorControlFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL кластера Color Control. Такие объекты описывают полезную нагрузку кластера Color Control и все применимые свойства. Зигби. Функция ColorControlFrameGenerator принимает zigbee. Объект ColorControlFrameConfig, описывающий полезную нагрузку кластера Color Control и выводит сгенерированную полезную нагрузку в байтах. Следующий код генерирует полезную нагрузку кластера Color Control, которая предписывает осветительному устройству постепенно менять свой текущий цвет (красный) на другое значение (зеленый) в течение 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 принимает имя команды и полезную нагрузку кластера Color Control в байтах и выводит zigbee. Объект ColorControlFrameConfig, описывающий полезную нагрузку кластера Color Control. Имя команды извлекается из декодирования заголовка ZCL. Смотрите раздел 'Decoding ZCL Header of Home Automation ZigBee Radios' в примере генерации и декодирования систем координат домашней автоматизации 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);

Генерация и декодирование полезной нагрузки ZCL кластера управления уровнем

Зигби. Объект строения LevelControlFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL кластера управления уровнем. Такие объекты описывают полезную нагрузку кластера Level Control и все применимые свойства. Зигби. Функция LevelControlFrameGenerator принимает zigbee. Объект LevelControlFrameConfig, описывающий полезную нагрузку кластера 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);

Зигби. Функция LevelControlFrameDecoder принимает имя команды и полезную нагрузку кластера Level Control в байтах и выводит zigbee. Объект LevelControlFrameConfig, описывающий полезную нагрузку кластера Level Control. Имя команды извлекается из декодирования заголовка ZCL. Смотрите раздел 'Decoding ZCL Header of Home Automation ZigBee Radios' в примере генерации и декодирования систем координат домашней автоматизации 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);

Генерация и декодирование полезной нагрузки ZCL кластера сцен

Зигби. Объект строения SceneFrameConfig используется как при генерации, так и при декодировании полезных нагрузок кластера Scenes ZCL. Такие объекты описывают полезную нагрузку кластера Scenes и все применимые свойства. Зигби. Функция ScenesFrameGenerator принимает zigbee. Объект ScenesFrameConfig, описывающий полезную нагрузку кластера 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);

Зигби. Функция SceneFrameDecoder принимает имя команды и полезную нагрузку кластера Scenes в байтах и выводит zigbee. Объект SceneFrameConfig, описывающий полезную нагрузку кластера Scenes. Имя команды извлекается из декодирования заголовка ZCL. Смотрите раздел 'Decoding ZCL Header of Home Automation ZigBee Radios' в примере генерации и декодирования систем координат домашней автоматизации ZigBee.

scenesConfigRx = zigbee.ScenesFrameDecoder('View Scene', scenesPayload)
scenesConfigRx = 

  ScenesFrameConfig with properties:

    CommandType: 'View Scene'
        GroupID: '1234'
        SceneID: '56'

Генерация и декодирование полезной нагрузки ZCL кластера групп

Зигби. Объект строения GroupFrameConfig используется как при генерации, так и при декодировании полезных нагрузок кластера Groups ZCL. Такие объекты описывают полезную нагрузку кластера Groups и все применимые свойства. Зигби. Функция GroupsFrameGenerator принимает zigbee. Объект GroupsFrameConfig, описывающий полезную нагрузку кластера 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. Смотрите раздел 'Decoding ZCL Header of Home Automation ZigBee Radios' в примере генерации и декодирования систем координат домашней автоматизации ZigBee.

groupsConfigRx = zigbee.GroupsFrameDecoder('Add group', groupsPayload)
groupsConfigRx = 

  GroupsFrameConfig with properties:

    CommandType: 'Add group'
        GroupID: '1234'
      GroupName: 'Dining Hall'

Декодирование Wireshark

Сгенерированные системы координат могут быть преобразованы в формат PCAP, который может быть проанализирован и визуализирован с помощью Wireshark [6]. Этот процесс может служить дополнительным шагом верификации, пропагандируя то, что библиотека Communications Toolbox для протокола ZigBee генерирует и декодирует системы координат в соответствии со стандартом.

PCAP- файла необходимо, чтобы полезные нагрузки ZCL были заключены в заголовки из всех других слоев и подслоев (MAC, NET, APS, ZCL). Следующие команды генерируют файл для полезных нагрузок 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

Дальнейшие исследования

Можно далее исследовать следующие функции генератора и декодирования, а также объект строения:

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

Избранная библиография

  1. ZigBee Alliance, ZigBee Light Link Standard, v.1.0, 5 апреля 2012 года.

  2. ZigBee Alliance, Технический документ ZigBee 053474r17, 2007

  3. IEEE 802.15.4-2011 - Стандарт IEEE для местных и столичных сетей - Часть 15.4: Низкоскоростные беспроводные персональные сети (LR-WPAN)

  4. ZigBee Alliance, спецификация библиотеки кластеров ZigBee, редакция 6, январь 2016.

  5. CIE 1931 Color Space. Международная комиссия по процедурам Эклайража. Cambridge University Press, Кембридж

  6. Программное обеспечение Wireshark: https://www.wireshark.org/

Для просмотра документации необходимо авторизоваться на сайте