exponenta event banner

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

В этом примере показано, как генерировать и декодировать кадры профиля приложения 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], этот пример генерирует и декодирует кадры для следующих кластеров:

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

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

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

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

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

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

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

Зигби. Объект конфигурации 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);

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

Зигби. Объект конфигурации 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);

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

Зигби. Объект конфигурации 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);

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

Зигби. Объект конфигурации 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'

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

Зигби. Объект конфигурации 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'

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

Сгенерированные кадры могут быть преобразованы в формат 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

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

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

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

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

  1. ZigBee Alliance, ZigBee Light Link Standard, версия 1.0, 5 апреля 2012 г.

  2. Альянс ZigBee, Документ спецификации ZigBee 053474r17, 2007

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

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

  5. Цветовое пространство CIE 1931. Международная комиссия по делам об эклайрейдж. Кембриджский университет Пресс, Кембридж

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