В этом примере показано, как сгенерировать и декодировать системы координат прикладного уровня для Домашнего профиля приложений Автоматизации [1] из спецификации [2] ZigBee®, пользующейся Библиотекой Communications Toolbox™ для Протокола ZigBee.
Стандарт ZigBee [2] задает сеть (СЕТЕВОЙ или NWK) и приложение (APP или APL) слои для беспроводных персональных сетей области с низкой ставкой. Они СЕТЕВЫЕ - и технические требования слоя APP полагаются на PHY и технические требования MAC IEEE® 802.15.4™ [3]. Устройства ZigBee находят применение в домашней автоматизации и организации сети датчика и очень относятся к тренду Интернета вещей (IoT).
Прикладной уровень ZigBee состоит из нескольких подуровней: (i) Подуровень Поддержки приложений (APS) и (ii) Библиотека кластера ZigBee (ZCL). Подуровень APS следует за форматом, который характерен для всех профилей приложений и кластеров ZigBee (см. Пункт 2.2.5 в [2]). Заголовок ZCL следует за форматом, который характерен для всех кластеров (см. Пункт 2.4 в [4]). Полезная нагрузка ZCL используется только некоторыми кластерами, и она следует за кластерно-специфичным форматом.
Из всех кластеров, используемых в домашнем профиле приложений Автоматизации, этот пример декодирует и генерирует системы координат для: (i) кластера Включения - выключения (используемый легкими устройствами) и (ii) кластера Зоны Системы сигнализации злоумышленника (IAS) (используемый датчиками движения) [4]. Кластер Включения - выключения не использует полезную нагрузку ZCL, но кластер Зоны IAS делает.
Системы координат этих кластеров были получены от коммерческих радио ZigBee, разрешающих домашнюю автоматизацию, с помощью USRP® B200-мини-радио и Пакет Поддержки Communications Toolbox для радио USRP®. ZigBee может использовать безопасность или в сети или в прикладном уровне. Полученные системы координат использовали безопасность в слое сети и были позже дешифрованы. Этот пример декодирует прикладной уровень дешифрованных полезных нагрузок СЕТЕВОГО слоя.
load zigbeeAPPCaptures
zigbee.APSFrameConfig объект настройки используется и в генерации и в декодировании систем координат ZigBee APS. Такие объекты описывают систему координат слоя APS и задают ее тип системы координат и все применимые свойства. Функция zigbee.APSFrameDecoder принимает Модуль данных о протоколе APS (APDU) в байтах и выводит zigbee.APSFrameConfig object, описывающий систему координат и возможно систему координат ZCL в байтах. Пункт 2.2.5.1 в [2] описывает форматы системы координат APS.
Затем подуровень APS полученной системы координат Зоны IAS декодируется:
[apsConfig, apsPayload] = zigbee.APSFrameDecoder(motionDetectedFrame); apsConfig
apsConfig = APSFrameConfig with properties: FrameType: 'Data' APSCounter: 230 AcknowledgmentRequest: 1 Addressing: DeliveryMode: 'Unicast' DestinationEndpoint: '01' ClusterID: '0500' ProfileID: '0104' SourceEndpoint: '01' Extended header: ExtendedHeader: 0 Security: Security: 0
zigbee.ZCLFrameConfig объект настройки используется и в генерации и в декодировании заголовков ZigBee ZCL. Такие объекты описывают систему координат ZCL-слоя и задают ее тип системы координат и все применимые свойства.
Функция zigbee.ZCLFrameDecoder принимает систему координат ZCL в байтах и выводит zigbee.ZCLFrameConfig object, описывающий заголовок и возможно полезную нагрузку ZCL в байтах. Пункт 2.4.1 в [4] описывает форматы системы координат заголовка ZCL. Обратите внимание на то, что заголовок ZCL может или задать 'Всей библиотеки' или 'Кластерно-специфичный' тип команды. В последнем случае zigbee.ZCLFrameDecoder также нужен кластерный ID, который присутствует в заголовке APS, для того, чтобы декодировать кластерно-специфичный ID команды в тип команды. Например, следующая команда декодирует заголовок ZCL полученной системы координат Зоны IAS.
[zclConfig, zclPayload] = zigbee.ZCLFrameDecoder(apsPayload, apsConfig.ClusterID); zclConfig
zclConfig = ZCLFrameConfig with properties: FrameType: 'Cluster-specific' CommandType: 'Zone Status Change Notification' SequenceNumber: 9 ManufacturerCommand: 0 Direction: 'Downlink' DisableDefaultResponse: 0
В отличие от кластера Включения - выключения, Кластер Зоны IAS задает полезную нагрузку ZCL в дополнение к заголовку ZCL. zigbee.IASZoneFrameConfig объект настройки используется и в генерации и в декодировании Зоны IAS полезные нагрузки ZCL. Такие объекты описывают полезную нагрузку Зоны IAS и все применимые свойства. Функция zigbee.IASZoneFrameDecoder принимает полезную нагрузку Зоны IAS в байтах и выводит zigbee.IASZoneFrameConfig object, описывающий Зональную полезную нагрузку IAZ.
iasZoneConfig = zigbee.IASZoneFrameDecoder(zclPayload)
iasZoneConfig = IASZoneFrameConfig with properties: CommandType: 'Zone Status Change Notification' ZoneID: 0 Alarm1: 'Not alarmed' Alarm2: 'Alarmed' Tampered: 0 LowBattery: 0 PeriodicReports: 0 RestoreReports: 1 Trouble: 0 ACFault: 0 BatteryDefect: 0 TestMode: 0 Delay: 0
Автоматизация подсветки была установлена для коммерческой автоматизации дома радио ZigBee, системы координат которых получались и декодировались. А именно, если датчик движения обнаруживает движение, это отправляет сигнал в концентратор ZigBee, который в свою очередь отправляет сигнал в лампочку так, чтобы это включило. Когда датчик движения обнаруживает, что движение остановилось (e.g., после 10 секунд без движения) это отправляет сигнал в концентратор ZigBee, который в свою очередь с помощью беспроводных технологий инициировал лампочку, чтобы выключить. Следующее видео иллюстрирует автоматизацию подсветки.
helperPlaybackVideo('LightingAutomation.mp4', 2/5);
Следующий код декодирует фактические кадры, переданные между радио ZigBee. Они были получены с устройством USRP® (также показанный в видео).
apsFrames = {motionDetectedFrame; turnOnFrame; motionStoppedFrame; turnOffFrame}; for idx = 1:length(apsFrames) % APS decoding: [apsConfig, apsPayload] = zigbee.APSFrameDecoder(apsFrames{idx}); % ZCL header decoding: [zclConfig, zclPayload] = zigbee.ZCLFrameDecoder(apsPayload, apsConfig.ClusterID); zclConfig % On-off cluster (does not have ZCL payload) onOffClusterID = '0006'; if strcmp(apsConfig.ClusterID, onOffClusterID) fprintf(['Turn light bulb ' lower(zclConfig.CommandType) '.\n']); end % Intruder Alarm System (IAS) Zone cluster has ZCL payload: iasZoneClusterID = '0500'; if ~isempty(zclPayload) && strcmp(apsConfig.ClusterID, iasZoneClusterID) iasConfig = zigbee.IASZoneFrameDecoder(zclPayload) if any(strcmp('Alarmed', {iasConfig.Alarm1, iasConfig.Alarm2})) fprintf('Motion detected.\n'); else fprintf('Motion stopped.\n'); end end end
zclConfig = ZCLFrameConfig with properties: FrameType: 'Cluster-specific' CommandType: 'Zone Status Change Notification' SequenceNumber: 9 ManufacturerCommand: 0 Direction: 'Downlink' DisableDefaultResponse: 0 iasConfig = IASZoneFrameConfig with properties: CommandType: 'Zone Status Change Notification' ZoneID: 0 Alarm1: 'Not alarmed' Alarm2: 'Alarmed' Tampered: 0 LowBattery: 0 PeriodicReports: 0 RestoreReports: 1 Trouble: 0 ACFault: 0 BatteryDefect: 0 TestMode: 0 Delay: 0 Motion detected. zclConfig = ZCLFrameConfig with properties: FrameType: 'Cluster-specific' CommandType: 'On' SequenceNumber: 64 ManufacturerCommand: 0 Direction: 'Uplink' DisableDefaultResponse: 0 Turn light bulb on. zclConfig = ZCLFrameConfig with properties: FrameType: 'Cluster-specific' CommandType: 'Zone Status Change Notification' SequenceNumber: 10 ManufacturerCommand: 0 Direction: 'Downlink' DisableDefaultResponse: 0 iasConfig = IASZoneFrameConfig with properties: CommandType: 'Zone Status Change Notification' ZoneID: 0 Alarm1: 'Not alarmed' Alarm2: 'Not alarmed' Tampered: 0 LowBattery: 0 PeriodicReports: 0 RestoreReports: 1 Trouble: 0 ACFault: 0 BatteryDefect: 0 TestMode: 0 Delay: 0 Motion stopped. zclConfig = ZCLFrameConfig with properties: FrameType: 'Cluster-specific' CommandType: 'Off' SequenceNumber: 70 ManufacturerCommand: 0 Direction: 'Uplink' DisableDefaultResponse: 0 Turn light bulb off.
Функция zigbee.IASZoneFrameGenerator принимает zigbee.IASZoneFrameConfig object, описывающий полезную нагрузку Зоны IAS, и выводит полезную нагрузку в байтах. Следующий код создает две полезных нагрузки ZCL для этого кластера, указывающего, что проникновение имеет или не было обнаружено.
iasConfigIntrusion = zigbee.IASZoneFrameConfig('Alarm2', 'Alarmed'); zclPayloadIntrusion = zigbee.IASZoneFrameGenerator(iasConfigIntrusion); iasConfigNoIntrusion = zigbee.IASZoneFrameConfig('Alarm2', 'Not alarmed'); zclPayloadNoIntrusion = zigbee.IASZoneFrameGenerator(iasConfigNoIntrusion);
Функция zigbee.ZCLFrameGenerator принимает zigbee.ZCLFrameConfig object, описывающий систему координат, и опционально полезную нагрузку ZCL в байтах (2D символы), и выводит систему координат ZCL в байтах. Следующий код генерирует системы координат ZCL для кластера Включения - выключения (никакая полезная нагрузка) и кластера Зоны IAS (необходимая полезная нагрузка).
% IAS Zone Cluster zclConfigIntrusion = zigbee.ZCLFrameConfig('FrameType', 'Cluster-specific', ... 'CommandType', 'Zone Status Change Notification', ... 'SequenceNumber', 1, 'Direction', 'Downlink'); zclFrameIntrusion = zigbee.ZCLFrameGenerator(zclConfigIntrusion, zclPayloadIntrusion); % On/Off Cluster zclConfigOn = zigbee.ZCLFrameConfig('FrameType', 'Cluster-specific', ... 'CommandType', 'On', ... 'SequenceNumber', 2, 'Direction', 'Uplink'); zclFrameOn = zigbee.ZCLFrameGenerator(zclConfigOn);
Функция zigbee.APSFrameGenerator принимает zigbee.APSFrameConfig object, описывающий систему координат, и опционально полезную нагрузку APS (система координат ZCL-слоя) в байтах (2D символы), и выводит систему координат APS в байтах. Следующий код иллюстрирует, как сгенерировать системы координат APS для систем координат ZCL, созданных в предыдущем разделе.
% IAS Zone Cluster apsConfigIntrusion = zigbee.APSFrameConfig('FrameType', 'Data', ... 'ClusterID', iasZoneClusterID, ... 'ProfileID', zigbee.profileID('Home Automation'), ... 'APSCounter', 1, ... 'AcknowledgmentRequest', true); apsFrameIntrusion = zigbee.APSFrameGenerator(apsConfigIntrusion, zclFrameIntrusion); % On/Off cluster apsConfigOn = zigbee.APSFrameConfig('FrameType', 'Data', ... 'ClusterID', onOffClusterID, ... 'ProfileID', zigbee.profileID('Home Automation'), ... 'APSCounter', 2, ... 'AcknowledgmentRequest', true); apsFrameOn = zigbee.APSFrameGenerator(apsConfigOn, zclFrameOn);
Можно далее исследовать следующий генератор и декодирующие функции, а также объект настройки:
Союз ZigBee, ZigBee Домашний Профиль приложений Общественности Автоматизации, версия 29, v. 1.2, июнь 2013.
Союз ZigBee, документ 053474r17, 2007 спецификации ZigBee
IEEE 802.15.4-2011 - Стандарт IEEE для Локальных сетей и городских компьютерных сетей - Часть 15.4: Беспроводные Персональные Сети области С низкой ставкой (LR-WPANs)
Союз ZigBee, спецификация библиотеки кластера ZigBee, версия 6, январь 2016.