В этом примере показано, как генерировать и декодировать кадры ZigBee ® Smart Energy с помощью библиотеки 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. Этот пример иллюстрирует генерацию и декодирование полезных нагрузок ZigBee Smart Energy ZCL для конкретного кластера.
Из 7 кластеров, используемых в профиле приложения Smart Energy, этот пример генерирует и декодирует кадры для следующих кластеров:
Кластер Demand Response and Load Control (DRLC): этот кластер рекламирует изменения спроса и потребления энергии. Этот пример иллюстрирует формирование и декодирование кадров для команды Load Control Event (описано в пункте 10.3.2.3.1 [4]).
Ценовой кластер: Этот кластер передает информацию о ценах на энергию, газ или воду. В этом примере показано формирование и декодирование кадров для команд «Получить текущую цену» и «Опубликовать цену» (см. п. 10.2.2.3.1 [4]).
Кластер обмена сообщениями: этот кластер обменивается текстовыми сообщениями между устройствами ZigBee. В этом примере показано формирование и декодирование кадров для команды Display Message (см. раздел 10.5.2.3.1 в [4]).
В дополнение к проиллюстрированным командам, реализация, предложенная в этом примере, также генерирует и декодирует кадры следующих команд:

Зигби. Объект конфигурации DRLCFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL для кластера DRLC. Такие объекты описывают полезную нагрузку кластера DRLC и все применимые свойства. Зигби. Функция DRLCFrameGenerator принимает зигби. Объект DRLCFrameConfig, описывающий полезную нагрузку кластера DRLC и выводящий полезную нагрузку в байтах. Следующий код создает полезную нагрузку ZCL для команды, которая устанавливает уставку нагревательных устройств 23,5 C.
% Creation of DRLC cluster configuration object drlcConfigTx = zigbee.DRLCFrameConfig('CommandType', 'Load Control Event', ... 'EventID', '00000001', 'DeviceClass', 'Strip Heaters/Baseboard Heaters', ... 'HeatingSetPoint', 23.5); % DRLC cluster frame generation (ZCL payload) drlcPayload = zigbee.DRLCFrameGenerator(drlcConfigTx);
Зигби. Функция DRLCFrameDecoder принимает имя команды и полезную нагрузку кластера DRLC в байтах и выводит zigbee. Объект DRLCFrameConfig, описывающий полезную нагрузку кластера DRLC. Имя команды извлекается из декодирования заголовка ZCL. См. раздел «Декодирование заголовка ZCL домашних радиостанций автоматизации ZigBee» в примере генерации и декодирования кадров домашней автоматизации ZigBee.
drlcConfigRx = zigbee.DRLCFrameDecoder('Load Control Event', drlcPayload)
drlcConfigRx =
DRLCFrameConfig with properties:
CommandType: 'Load Control Event'
EventID: '00000001'
DeviceClass: 'Strip Heaters/Baseboard Heaters'
DeviceGroup: '00'
Time: 0
Duration: 0
CriticalityLevel: 'Green'
HeatingSetPoint: 23.5000
RandomStart: 1
RandomEnd: 1
Зигби. Объект конфигурации PriceFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL для кластера Price. Такие объекты описывают полезную нагрузку ценового кластера и все применимые свойства. Зигби. Функция PriceFrameGenerator принимает zigbee. Объект PriceFrameConfig, описывающий полезную нагрузку кластера Price и выводящий полезную нагрузку в байтах. Следующий код создает полезную нагрузку ZCL для команды, которая запрашивает текущую цену товара.
% Creation of Price cluster configuration object priceConfigTx = zigbee.PriceFrameConfig('CommandType', 'Get Current Price'); % Price cluster frame generation (ZCL payload) pricePayload = zigbee.PriceFrameGenerator(priceConfigTx);
Зигби. Функция PriceFrameDecoder принимает имя команды и полезную нагрузку кластера Price в байтах и выводит zigbee. Объект PriceFrameConfig, описывающий полезную нагрузку кластера Price. Имя команды извлекается из декодирования заголовка ZCL. См. раздел «Декодирование заголовка ZCL домашних радиостанций автоматизации ZigBee» в примере генерации и декодирования кадров домашней автоматизации ZigBee.
priceConfigRx = zigbee.PriceFrameDecoder('Get Current Price', pricePayload)
priceConfigRx =
PriceFrameConfig with properties:
CommandType: 'Get Current Price'
IdleReceiving: 0
Получив команду «Get Current Price», сервер отвечает командой «Publish Price».
priceConfigTx = zigbee.PriceFrameConfig('CommandType', 'Publish Price', 'Price', 0.4899, 'Duration', 14400); pricePayload = zigbee.PriceFrameGenerator(priceConfigTx);
Клиентское устройство может затем декодировать опубликованную цену:
priceConfigRx = zigbee.PriceFrameDecoder('Publish Price', pricePayload)
priceConfigRx =
PriceFrameConfig with properties:
CommandType: 'Publish Price'
ProviderID: 0
RateLabel: ''
EventID: 0
GenerationTime: 0
Unit: 'kW'
UnitFormat: 'Binary'
Currency: 840
PriceTier: 1
RegisterTier: 1
NumPriceTiers: 0
StartTime: 0
Duration: 14400
Price: 0.4899
Зигби. Объект конфигурации MessagingFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL для кластера Messaging. Такие объекты описывают полезную нагрузку кластера обмена сообщениями и все применимые свойства. Зигби. Функция MessagingFrameGenerator принимает zigbee. Объект MessagingFrameConfig, описывающий полезную нагрузку кластера Messaging и выводящий полезную нагрузку в байтах. Следующий код создает полезную нагрузку ZCL для команды, отображающей сообщение.
% Creation of messaging cluster configuration object messageID = 1234; messagingConfigTx = zigbee.MessagingFrameConfig('CommandType', 'Display Message', ... 'MessageID', messageID, 'Message', 'This is a custom message', 'Duration', 90); % Messaging cluster frame generation (ZCL payload) displayMessagePayload = zigbee.MessagingFrameGenerator(messagingConfigTx);
Зигби. Функция MessagingFrameDecoder принимает имя команды и полезную нагрузку кластера Messaging в байтах и выводит zigbee. Объект MessagingFrameConfig, описывающий полезную нагрузку кластера сообщений. Имя команды извлекается из декодирования заголовка ZCL. См. раздел «Декодирование заголовка ZCL домашних радиостанций автоматизации ZigBee» в примере генерации и декодирования кадров домашней автоматизации ZigBee.
messagingConfigRx = zigbee.MessagingFrameDecoder('Display Message', displayMessagePayload)
messagingConfigRx =
MessagingFrameConfig with properties:
CommandType: 'Display Message'
MessageID: 1234
TransmissionType: 'Normal Transmission Only'
Priority: 'Low'
MessageConfirmation: 0
Duration: 90
Message: 'This is a custom message'
Сервер, отображающий сообщение, также имеет возможность отменить сообщение с помощью команды «Отменить сообщение»:
cancelMsgConfig = zigbee.MessagingFrameConfig('CommandType', 'Cancel Message', ... 'MessageID', messageID); cancelMessagePayload = zigbee.MessagingFrameGenerator(messagingConfigTx);
Затем клиенты могут декодировать команду Cancel Message:
messagingConfigRx = zigbee.MessagingFrameDecoder('Cancel Message', cancelMessagePayload)
messagingConfigRx =
MessagingFrameConfig with properties:
CommandType: 'Cancel Message'
MessageID: 1234
TransmissionType: 'Normal Transmission Only'
Priority: 'Low'
MessageConfirmation: 0
Сгенерированные кадры сообщений могут быть преобразованы в файл в формате PCAP, который может быть проанализирован и визуализирован с помощью программы Wireshark [5]. Этот процесс может служить дополнительным этапом проверки, предлагающим, чтобы библиотека Communications Toolbox Library для протокола ZigBee генерировала и декодировала кадры в соответствии со стандартами.
Файл PCAP должен содержать полезные нагрузки ZCL с заголовками всех других уровней и подуровней (MAC, NET, APS, ZCL). Эта задача выполняется с помощью следующих команд.
zllProfileID = zigbee.profileID('Smart Energy'); % ZLL profile ID msgClusterID = zigbee.clusterID('Messaging'); % Messaging cluster ID payloadsWithInfo(1) = struct('Payload', displayMessagePayload, 'ProfileID', zllProfileID, ... 'ClusterSpecific', true, 'ClusterID', msgClusterID, 'CommandType', 'Display Message', 'Direction', 'Downlink'); payloadsWithInfo(2) = struct('Payload', cancelMessagePayload, 'ProfileID', zllProfileID, ... 'ClusterSpecific', true, 'ClusterID', msgClusterID, 'CommandType', 'Cancel Message', 'Direction', 'Downlink'); % Add headers from other layers/sublayers: MPDUs = zigbeeAddProtocolHeaders(payloadsWithInfo); % Export MPDUs to a PCAP format zigbeeExportToPcap(MPDUs, 'zigbeeSmartEnergy.pcap'); % Open PCAP file with Wireshark
Далее можно изучить следующие функции генератора и декодирования, а также объект конфигурации:
zigbee.DRLCFrameConfig, zigbee. DRLCFrameGenerator, zigbee. DRLCFrameDecoder
zigbee.PriceFrameConfig, zigbee. PriceFrameGenerator, zigbee. PriceFrameDecoder
zigbee.MessagingFrameConfig, zigbee. MessagingFrameGenerator, zigbee. MessagingFrameDecoder
zigbee.APSFrameConfig, zigbee. APSFrameGenerator, zigbee. APSFrameDecoder
zigbee.ZCLFrameConfig, zigbee. ZCLFrameGenerator, zigbee. ZCLFrameDecoder
Альянс ZigBee, интеллектуальный энергетический стандарт ZigBee, редакция 19, версия 1.2а, 3 декабря 2014 г.
Альянс ZigBee, Документ спецификации ZigBee 053474r17, 2007
IEEE 802.15.4-2011 - Стандарт IEEE для локальных и городских сетей - Часть 15.4: Низкоскоростные беспроводные персональные сети (LR-WPAN)
Альянс ZigBee, спецификация кластерной библиотеки ZigBee, редакция 6, январь 2016 г.
Программное обеспечение Wireshark: https://www.wireshark.org/