В этом примере показано, как сгенерировать и декодировать системы координат прикладного уровня для профиля приложения домашней автоматизации [1] спецификации ZigBee ® [2], используя библиотеку Communications Toolbox™ для протокола ZigBee.
Стандарт ZigBee [2] задает сетевой (NET или NWK) и прикладной (APP или APL) слои для низкоскоростных беспроводных персональных сетей. Эти спецификации уровня NET и 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]. Кластер On/Off не использует полезную нагрузку ZCL, но кластер IAS Zone использует.
Системы координат этих кластеров были захвачены с коммерческих радиоприемников ZigBee, обеспечивающих автоматизацию дома, с помощью B200-mini радио USRP ® и пакета поддержки Communications Toolbox для радио USRP ®. ZigBee может использовать безопасность как в сети, так и на прикладном слое. Захваченные системы координат использовали безопасность на слое сети, а затем были расшифрованы. Этот пример декодирует прикладной слой дешифрованных полезных нагрузок NET-уровня.
load zigbeeAPPCaptures
Зигби. Объект строения APSFrameConfig используется как при генерации, так и при декодировании систем координат APS ZigBee. Такие объекты описывают кадр уровня APS и определяют его тип системы координат и все применимые свойства. Зигби. Функция APSFrameDecoder принимает модуль данных протокола APS (APDU) в байтах и выводит zigbee. Объект APSFrameConfig, описывающий систему координат и, возможно, система координат 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
Зигби. Объект строения ZCLFrameConfig используется как при генерации, так и при декодировании заголовков ZigBee ZCL. Такие объекты описывают кадр ZCL-уровня и определяют его тип системы координат и все применимые свойства.
Зигби. Функция ZCLFrameDecoder принимает систему координат в байтах и выводит zigbee. Объект ZCLFrameConfig, описывающий заголовок и, возможно, полезную нагрузку ZCL в байтах. Пункт 2.4.1 в [4] описывает форматы системы координат заголовка ZCL. Обратите внимание, что заголовок ZCL может задавать тип команды «Library-wide» или «Cluster-specific». В последнем случае - зигби. ZCLFrameDecoder также нужен идентификатор кластера, который присутствует в заголовке APS, в порядок чтобы декодировать идентификатор команды конкретного кластера в тип команды. Например, следующая команда декодирует заголовок 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
В отличие от кластера On/Off, кластер IAS Zone задает полезную нагрузку ZCL в дополнение к заголовку ZCL. Зигби. Объект строения IASZoneFrameConfig используется как при генерации, так и при декодировании полезных нагрузок IAS Zone ZCL. Такие объекты описывают полезную нагрузку зоны IAS и все применимые свойства. Зигби. Функция IASZoneFrameDecoder принимает полезную нагрузку зоны IAS в байтах и выводит zigbee. Объект IASZoneFrameConfig, описывающий полезную нагрузку зоны 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, которая, в свою очередь, посылает сигнал на лампочку так, что она включается. Когда датчик движения обнаруживает, что движение остановилось (например, через 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.
Зигби. Функция IASZoneFrameGenerator принимает zigbee. Объект IASZoneFrameConfig, описывающий полезную нагрузку зоны IAS и выводит полезную нагрузку в байтах. Следующий код создает две полезные нагрузки ZCL для этого кластера, указывающие, что вторжение было или не было обнаружено.
iasConfigIntrusion = zigbee.IASZoneFrameConfig('Alarm2', 'Alarmed'); zclPayloadIntrusion = zigbee.IASZoneFrameGenerator(iasConfigIntrusion); iasConfigNoIntrusion = zigbee.IASZoneFrameConfig('Alarm2', 'Not alarmed'); zclPayloadNoIntrusion = zigbee.IASZoneFrameGenerator(iasConfigNoIntrusion);
Зигби. Функция ZCLFrameGenerator принимает zigbee. Объект ZCLFrameConfig, описывающий систему координат и, опционально, полезную нагрузку ZCL в байтах (двухсимвольных) и выходы система координат ZCL в байтах. Следующий код генерирует системы координат ZCL для кластера On/Off (без полезной нагрузки) и кластера IAS Zone (требуется полезная нагрузка).
% 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);
Зигби. Функция APSFrameGenerator принимает zigbee. Объект APSFrameConfig, описывающий систему координат, и, опционально, полезную нагрузку APS (ZCL-слой системы координат) в байтах (двух символов) и выходах системы координат 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 Alliance, ZigBee Home Automation Public Application Profile, revision 29, v. 1.2, Jun. 2013.
ZigBee Alliance, Технический документ ZigBee 053474r17, 2007
IEEE 802.15.4-2011 - Стандарт IEEE для местных и столичных сетей - Часть 15.4: Низкоскоростные беспроводные персональные сети (LR-WPAN)
ZigBee Alliance, спецификация библиотеки кластеров ZigBee, редакция 6, январь 2016.