exponenta event banner

Создание и декодирование кадров домашней автоматизации ZigBee

В этом примере показано, как генерировать и декодировать кадры прикладного уровня для профиля приложения Home Automation [1] спецификации ZigBee ® [2] с использованием библиотеки Communications Toolbox™ Library для протокола ZigBee.

Фон

Стандарт ZigBee [2] определяет сетевые (NET или NWK) и прикладные (APP или APL) уровни для низкоскоростных беспроводных персональных сетей. Эти спецификации уровня NET- и APP основаны на спецификациях PHY и MAC IEEE ® 802.15.4™ [3]. Устройства ZigBee находят применение в домашней автоматизации и создании сетей датчиков и имеют большое значение для развития Интернета вещей.

Прикладной уровень ZigBee состоит из нескольких подуровней: (i) подуровня поддержки приложений (APS) и (ii) кластерной библиотеки ZigBee (ZCL). Подуровень APS имеет формат, общий для всех профилей приложений и кластеров ZigBee (см. пункт 2.2.5 в [2]). Заголовок ZCL соответствует формату, который является общим для всех кластеров (см. пункт 2.4 в [4]). Полезная нагрузка ZCL используется только некоторыми кластерами и соответствует специфичному для кластера формату.

Захваты кластеров и кадров

Из всех кластеров, используемых в профиле приложения Home Automation, этот пример декодирует и генерирует кадры для: (i) кластера On/Off (используется световыми устройствами) и (ii) кластера зоны системы аварийной сигнализации (IAS) (используется датчиками движения) [4]. Кластер On/Off не использует полезную нагрузку ZCL, но кластер IAS Zone.

Кадры этих кластеров были получены из коммерческих радиоприемников ZigBee, обеспечивающих автоматизацию дома, с использованием радио USRP ® B200-mini и пакета поддержки Communications Toolbox для радио USRP ®. ZigBee может использовать защиту на сетевом или прикладном уровне. Захваченные кадры использовали защиту на сетевом уровне и позже были расшифрованы. В этом примере декодируется уровень приложений дешифрованных полезных нагрузок уровня NET.

load zigbeeAPPCaptures

Декодирование кадров APS домашних автоматизированных радиоприемников ZigBee

Зигби. Объект конфигурации 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

Декодирование заголовка ZCL домашних радиостанций автоматизации ZigBee

Зигби. Объект конфигурации ZCLFrameConfig используется как при генерации, так и при декодировании заголовков ZCL ZigBee. Такие объекты описывают кадр уровня ZCL и определяют его тип и все применимые свойства.

Зигби. Функция ZCLFrameDecoder принимает кадр ZCL в байтах и выводит 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

Декодирование полезной нагрузки ZCL кадра зоны IAS от радио ZigBee

В отличие от кластера On/Off, кластер IAS Zone определяет полезную нагрузку ZCL в дополнение к заголовку ZCL. Зигби. Объект конфигурации IASZoneFrameConfig используется как при генерации, так и при декодировании полезных нагрузок ZCL зоны IAS. Такие объекты описывают полезную нагрузку зоны 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, кадры которых были захвачены и декодированы, создана система автоматизации освещения. В частности, как только датчик движения обнаруживает движение, он посылает сигнал на концентратор 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.

Создание полезной нагрузки ZCL зоны IAS

Зигби. Функция IASZoneFrameGenerator принимает зигби. Объект IASZoneFrameConfig, описывающий полезную нагрузку зоны IAS и выводящий полезную нагрузку в байтах. Следующий код создает две полезные нагрузки ZCL для этого кластера, указывающие на то, что вторжение было или не было обнаружено.

iasConfigIntrusion = zigbee.IASZoneFrameConfig('Alarm2', 'Alarmed');
zclPayloadIntrusion = zigbee.IASZoneFrameGenerator(iasConfigIntrusion);

iasConfigNoIntrusion = zigbee.IASZoneFrameConfig('Alarm2', 'Not alarmed');
zclPayloadNoIntrusion = zigbee.IASZoneFrameGenerator(iasConfigNoIntrusion);

Создание кадров ZCL

Зигби. Функция ZCLFrameGenerator принимает зигби. Объект 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);

Формирование кадров APS

Зигби. Функция APSFrameGenerator принимает зигби. Объект 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);

Дальнейшие исследования

Далее можно изучить следующие функции генератора и декодирования, а также объект конфигурации:

Избранная библиография

  1. ZigBee Alliance, ZigBee Home Automation Public Application Profile, редакция 29, версия 1.2, июнь 2013 г.

  2. Альянс ZigBee, Документ спецификации ZigBee 053474r17, 2007

  3. IEEE 802.15.4-2011 - Стандарт IEEE для локальных и городских сетей - Часть 15.4: Низкоскоростные беспроводные персональные сети (LR-WPAN)

  4. Альянс ZigBee, спецификация кластерной библиотеки ZigBee, редакция 6, январь 2016 г.