В этом примере показано, как сгенерировать и декодировать системы координат профиля приложения 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], этот пример генерирует и декодирует системы координат для следующих кластеров:
Идентифицируйте кластер: Этот кластер устанавливает устройство в режим идентификации (например, мигание света). Этот пример иллюстрирует генерацию и декодирование систем координат для команды Identify (описанной в пункте 3.5 [4]).
Кластер управления цветом: Этот кластер изменяет цвет подсветки устройства. Этот пример иллюстрирует генерацию и декодирование систем координат для команды Move to Color (описанной в пункте 5.2 [4]).
Кластер управления уровнем: Этот кластер изменяет уровень устройства, например, интенсивность лампочки, насколько закрыта дверь или интенсивность нагревателя. Этот пример иллюстрирует генерацию и декодирование систем координат для команды Move to Level (описанной в пункте 3.10 [4]).
Кластер сцен: кластер сцен настраивает и вспоминает сцены (т.е. наборы сохраненных значений атрибута для других кластеров в том же устройстве). Этот пример иллюстрирует генерацию и декодирование систем координат для команды View Scene (описанной в пункте 3.7 [4]).
Групповой кластер: Этот кластер управляет группами устройств, например, путем создания или удаления группы или путем обнаружения принадлежности к группе. Этот пример иллюстрирует генерацию и декодирование систем координат для команды Add group (описанной в пункте 3.6 [4]).
В дополнение к проиллюстрированным командам этот пример обеспечивает реализацию для генерации и декодирования систем координат для всех команд пяти упомянутых кластеров (см. Дальнейшее исследование для полного списка).
Зигби. Объект строения 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);
Зигби. Объект строения 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);
Зигби. Объект строения 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);
Зигби. Объект строения 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'
Зигби. Объект строения 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'
Сгенерированные системы координат могут быть преобразованы в формат 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
Можно далее исследовать следующие функции генератора и декодирования, а также объект строения:
zigbee.APSFrameConfig, zigbee. APSFrameGenerator, zigbee. APSFrameDecoder
zigbee.ZCLFrameConfig, zigbee. ZCLFrameGenerator, zigbee. ZCLFrameDecoder
zigbee.IdentifyFrameConfig, zigbee. IdentifyFrameGenerator, zigbee. IdentifyFrameDecoder
zigbee.ColorControlFrameConfig, zigbee. ColorControlFrameGenerator, zigbee. ColorControlFrameDecoder
zigbee.LevelControlFrameConfig, zigbee. LevelControlFrameGenerator, zigbee. LevelControlFrameDecoder
zigbee.ScenesFrameConfig, zigbee. ScenesFrameGenerator, zigbee. ScenesFrameDecoder
zigbee.GroupsFrameConfig, zigbee. GroupsFrameGenerator, zigbee. GroupsFrameDecoder
В дополнение к командам, проиллюстрированным в этом примере, предлагаемая реализация также поддерживает команды, перечисленные в следующей таблице. Команды, перечисленные в среднем столбце, можно экспортировать в файл PCAP, который можно анализировать с помощью Wireshark.
ZigBee Alliance, ZigBee Light Link Standard, v.1.0, 5 апреля 2012 года.
ZigBee Alliance, Технический документ ZigBee 053474r17, 2007
IEEE 802.15.4-2011 - Стандарт IEEE для местных и столичных сетей - Часть 15.4: Низкоскоростные беспроводные персональные сети (LR-WPAN)
ZigBee Alliance, спецификация библиотеки кластеров ZigBee, редакция 6, январь 2016.
CIE 1931 Color Space. Международная комиссия по процедурам Эклайража. Cambridge University Press, Кембридж
Программное обеспечение Wireshark: https://www.wireshark.org/