В этом примере показано, как сгенерировать и декодировать системы координат ZigBee ® Smart Energy с помощью библиотеки 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 Smart Energy ZCL.
Из 7 кластеров, используемых в профиле приложения Smart Energy, этот пример генерирует и декодирует системы координат для следующих кластеров:
Кластер Demand Response and Load Control (DRLC): Этот кластер рекламирует изменения спроса и потребления энергии. Этот пример иллюстрирует генерацию и декодирование систем координат для команды Load Control Event (описанной в пункте 10.3.2.3.1 [4]).
Ценовой кластер: Этот кластер передает информацию о ценах на энергию, газ или воду. Этот пример иллюстрирует генерацию и декодирование систем координат для команд Get Current Price и Publish Price (описанные в пункте 10.2.2.3.1 [4]).
Кластер обмена сообщениями: Этот кластер обменивается текстовыми сообщениями между устройствами ZigBee. Этот пример иллюстрирует генерацию и декодирование систем координат для команды Display Message (описанной в пункте 10.5.2.3.1 [4]).
В дополнение к проиллюстрированным командам реализация, предлагаемая в этом примере, также генерирует и декодирует системы координат следующих команд:
Зигби. Объект строения DRLCFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL для кластера Demand Response и Load Control (DRLC). Такие объекты описывают полезную нагрузку кластера DRLC и все применимые свойства. Зигби. Функция DRLCFrameGenerator принимает zigbee. Объект 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. Смотрите раздел 'Decoding ZCL Header of Home Automation ZigBee Radios' в примере генерации и декодирования систем координат домашней автоматизации 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. Такие объекты описывают полезную нагрузку кластера 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. Смотрите раздел 'Decoding ZCL Header of Home Automation ZigBee Radios' в примере генерации и декодирования систем координат домашней автоматизации 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, описывающий полезную нагрузку Messagingclauster. Имя команды извлекается из декодирования заголовка ZCL. Смотрите раздел 'Decoding ZCL Header of Home Automation ZigBee Radios' в примере генерации и декодирования систем координат домашней автоматизации 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);
Затем клиенты могут декодировать команду «Отмена сообщения»:
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 для протокола 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, зигби. PriceFrameDecoder
zigbee.MessagingFrameConfig, zigbee. MessagingFrameGenerator, zigbee. MessagingFrameDecoder
zigbee.APSFrameConfig, zigbee. APSFrameGenerator, zigbee. APSFrameDecoder
zigbee.ZCLFrameConfig, zigbee. ZCLFrameGenerator, zigbee. ZCLFrameDecoder
ZigBee Alliance, ZigBee Smart Energy Standard, редакция 19, версия 1.2a, 3 декабря 2014 г.
ZigBee Alliance, Технический документ ZigBee 053474r17, 2007
IEEE 802.15.4-2011 - Стандарт IEEE для местных и столичных сетей - Часть 15.4: Низкоскоростные беспроводные персональные сети (LR-WPAN)
ZigBee Alliance, спецификация библиотеки кластеров ZigBee, редакция 6, январь 2016.
Программное обеспечение Wireshark: https://www.wireshark.org/