Генерация кадра ссылки света ZigBee и декодирование

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

Фон

Стандарт ZigBee [2] задает сеть (СЕТЕВОЙ или NWK) и приложение (APP или APL) слои беспроводных персональных сетей области с низкой ставкой (LR-WPANs). Они СЕТЕВЫЕ - и спецификации слоя 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 полезные нагрузки ZCL.

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

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

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

  2. Кластер Управления цветом: Этот кластер изменяет цвет устройства подсветки. Этот пример иллюстрирует генерацию кадра и декодирующий для Перемещения, чтобы Окрасить команду (описанной в Пункте 5.2 [4]).

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

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

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

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

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

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

zigbee. Функция IdentifyFrameDecoder принимает название команды и Идентифицировать кластерную полезную нагрузку в байтах и выводит zigbee. Объект IdentifyFrameConfig, описывающий Идентифицировать кластерную полезную нагрузку. Название команды получено из декодирования заголовка ZCL.

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

  IdentifyFrameConfig with properties:

     CommandType: 'Identify'
    IdentifyTime: 4

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

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

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

zigbee. Объект настройки ColorControlFrameConfig используется и в генерации и в декодировании полезные нагрузки ZCL кластера Управления цветом. Такие объекты описывают полезную нагрузку кластера Управления цветом и все применимые свойства. zigbee. Функция ColorControlFrameGenerator принимает zigbee. Объект ColorControlFrameConfig, описывающий полезную нагрузку кластера Управления цветом и выходные параметры сгенерированная полезная нагрузка в байтах. Следующий код генерирует полезную нагрузку кластера Управления цветом, которая дает устройству подсветки команду прогрессивно изменять свой текущий цвет (красный) на различное значение (зеленое) в 50 deciseconds (т.е. 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);

zigbee. Функция ColorControlFrameDecoder принимает название команды и полезную нагрузку кластера Управления цветом в байтах и выводит zigbee. Объект ColorControlFrameConfig, описывающий полезную нагрузку кластера Управления цветом. Название команды получено из декодирования заголовка ZCL.

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 кластера контроля уровня

zigbee. Объект настройки LevelControlFrameConfig используется и в генерации и в декодировании кластера Контроля уровня полезные нагрузки ZCL. Такие объекты описывают полезную нагрузку кластера Контроля уровня и все применимые свойства. zigbee. Функция LevelControlFrameGenerator принимает zigbee. Объект LevelControlFrameConfig, описывающий полезную нагрузку кластера Контроля уровня и выходные параметры сгенерированная полезная нагрузка в байтах. Следующий код создает полезную нагрузку кластера Контроля уровня, которая дает устройству команду изменять свой текущий уровень на заданное значение.

% 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);

zigbee. Функция LevelControlFrameDecoder принимает название команды и полезную нагрузку кластера Контроля уровня в байтах и выводит zigbee. Объект LevelControlFrameConfig, описывающий полезную нагрузку кластера Контроля уровня. Название команды получено из декодирования заголовка ZCL.

levelCtrlConfigRx = zigbee.LevelControlFrameDecoder('Move to Level', levelControlPayload)
levelCtrlConfigRx = 

  LevelControlFrameConfig with properties:

       CommandType: 'Move to Level'
             Level: 20
    TransitionTime: 1

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

zigbeeMoveBulbColor(bulb, colorCtrlConfigRx2.ColorX, colorCtrlConfigRx2.ColorY, 1, levelCtrlConfigRx.Level);

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

zigbee. Объект настройки SceneFrameConfig используется и в генерации и в декодировании кластера Сцен полезные нагрузки ZCL. Такие объекты описывают полезную нагрузку кластера Сцен и все применимые свойства. zigbee. Функция ScenesFrameGenerator принимает zigbee. Объект ScenesFrameConfig, описывающий полезную нагрузку кластера Сцен и выходные параметры сгенерированная полезная нагрузка в байтах. Следующий код генерирует полезную нагрузку кластера Сцен, которая запрашивает устройство передать различный кадр (Ответ Сцены Представления) описание сцены.

% 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);

zigbee. Функция SceneFrameDecoder принимает название команды и полезную нагрузку кластера Сцен в байтах и выводит zigbee. Объект SceneFrameConfig, описывающий полезную нагрузку кластера Сцен. Название команды получено из декодирования заголовка ZCL.

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

  ScenesFrameConfig with properties:

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

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

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

zigbee. Функция GroupFrameDecoder принимает название команды и полезную нагрузку кластера Групп в байтах и выводит zigbee. Объект GroupFrameConfig, описывающий полезную нагрузку кластера Групп. Название команды получено из декодирования заголовка ZCL.

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, СЕТЕВОЙ, 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, Стандарт Ссылки Света ZigBee, v. 1.0, 5-го апреля 2012.

  2. Союз ZigBee, документ 053474r17, 2007 спецификации ZigBee

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

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

  5. Цветовое пространство CIE 1931. Commission Internationale de l'Eclairage Proceedings. Издательство Кембриджского университета, Кембридж

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