Main Content

このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

ZigBee ホーム オートメーション フレームの生成と復号化

この例では、Communications Toolbox™ Library for the ZigBee Protocol を使用して、ZigBee® 仕様 [2] のホーム オートメーション アプリケーション プロファイル [1] のアプリケーション層フレームを生成および復号化する方法を説明します。

背景

ZigBee 規格 [2] は、低速無線パーソナル エリア ネットワークのネットワーク (NET または NWK) 層とアプリケーション (APP または APL) 層を規定します。この NET 層および APP 層の仕様は、IEEE® 802.15.4™ [3] の PHY 仕様および MAC 仕様に基づいて作成されています。ZigBee デバイスは、ホーム オートメーションやセンサー ネットワーキングに使用例があり、Internet of Things (IoT) の流行にも密接に関連しています。

ZigBee アプリケーション層は、(i) Application Support Sublayer (APS)、(ii) ZigBee Cluster Library (ZCL) という複数の下位層で構成されます。APS サブ層はすべてのアプリケーション プロファイルと ZigBee クラスターに共通の形式 (Clause 2.2.5 [ 2 ] を参照) に従います。ZCL ヘッダーはすべてのクラスターに共通の形式 (Clause 2.4 [ 4 ] を参照) に従います。ZCL ペイロードは、一部のクラスターのみに使用され、クラスター固有の形式に従います。

クラスターとフレームの取得

ホーム オートメーション アプリケーション プロファイルで使用されるすべてのクラスターの中から、この例では、(i) On/Off クラスター (照明器具で使用される) と (ii) Intruder Alarm System (IAS) Zone クラスター (モーション センサーで使用される) [ 4 ] のフレームを生成および復号化します。On/Off クラスターは ZCL ペイロードを利用しませんが、IAS Zone クラスターは利用します。

これらのクラスターのフレームは、USRP® B200-mini 無線機と Communications Toolbox Support Package for USRP® radio を使用して、ホーム オートメーションを有効にする市販の ZigBee 無線から取得されます。ZigBee は、ネットワーク層とアプリケーション層のいずれかでセキュリティも採用できます。取得されたフレームは、ネットワーク層のセキュリティを採用し、後で復号化されたものです。この例では、復号化した NET 層ペイロードのアプリケーション層を復号化します。

load zigbeeAPPCaptures

ホーム オートメーション ZigBee 無線機の APS フレームの復号化

zigbee.APSFrameConfig 構成オブジェクトは、ZigBee APS フレームの生成と復号化の両方で使用されます。このようなオブジェクトは、APS 層フレームを表し、そのフレーム タイプと適用可能なすべてのプロパティを指定します。関数 zigbee.APSFrameDecoder は、APS プロトコル データ ユニット (APDU) をバイト単位で受け入れ、フレームと場合によっては ZCL フレームを表す zigbee.APSFrameConfig オブジェクトをバイト単位で出力します。Clause 2.2.5.1 [ 2 ] では、APS フレーム形式について説明します。

次に、取得した IAS Zone フレームの APS サブ層を復号化します。

[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 無線機の ZCL ヘッダーの復号化

zigbee.ZCLFrameConfig 構成オブジェクトは、ZigBee ZCL ヘッダーの生成と復号化の両方で使用されます。このようなオブジェクトは、ZCL 層フレームを表し、そのフレーム タイプと適用可能なすべてのプロパティを指定します。

関数 zigbee.ZCLFrameDecoder は、ZCL フレームをバイト単位で受け入れ、ヘッダーと場合によっては ZCL ペイロードを表す zigbee.ZCLFrameConfig オブジェクトをバイト単位で出力します。Clause 2.4.1 [ 4 ] では、ZCL ヘッダー フレーム形式について説明します。ZCL ヘッダーは、'ライブラリ全体' のコマンド タイプと 'クラスター固有' のコマンド タイプのどちらも指定できることに注意してください。後者の場合は、クラスター固有のコマンド ID をコマンド タイプに復号化するために、APS ヘッダーに含まれるクラスター ID も zigbee.ZCLFrameDecoder で必要です。たとえば、次のコマンドは取得した IAS Zone フレームの ZCL ヘッダーを復号化します。

[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

ZigBee 無線機からの IAS Zone フレームの ZCL ペイロードの復号化

On/Off クラスターとは対照的に、IAS Zone クラスターは ZCL ヘッダーに加えて ZCL ペイロードを指定します。zigbee.IASZoneFrameConfig 構成オブジェクトは、IAS Zone ZCL ペイロードの生成と復号化の両方で使用されます。このようなオブジェクトは、IAS Zone ペイロードと適用可能なすべてのプロパティを表します。関数 zigbee.IASZoneFrameDecoder は、IAS Zone ペイロードをバイト単位で受け入れ、IAS Zone ペイロードを表す zigbee.IASZoneFrameConfig オブジェクトを出力します。

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.mov', 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.

IAS Zone ZCL ペイロードの生成

関数 zigbee.IASZoneFrameGenerator は、IAS Zone ペイロードを表す zigbee.IASZoneFrameConfig オブジェクトを受け入れ、ペイロードをバイト単位で出力します。次のコードは、このクラスターの 2 つの ZCL ペイロード (侵入検出を示すものと、侵入未検出を示すもの) を作成します。

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

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

ZCL フレームの生成

関数 zigbee.ZCLFrameGenerator は、フレームを表す zigbee.ZCLFrameConfig オブジェクト、オプションで ZCL ペイロードをバイト単位 (2 文字) で受け入れ、ZCL フレームをバイト単位で出力します。次のコードは、On/Off クラスターの ZCL フレーム (ペイロードなし) と IAS Zone クラスターの ZCL フレーム (ペイロードが必要) を生成します。

% 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 フレームの生成

関数 zigbee.APSFrameGenerator は、フレームを表す zigbee.APSFrameConfig オブジェクト、オプションで APS ペイロード (ZCL 層フレーム) をバイト単位 (2 文字) で受け入れ、APS フレームをバイト単位で出力します。次のコードは、前の節で作成した ZCL フレームの APS フレームを生成する方法を示します。

% 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, revision 29, v. 1.2, Jun. 2013.

  2. ZigBee Alliance, ZigBee Specification Document 053474r17, 2007

  3. IEEE 802.15.4-2011 - IEEE Standard for Local and metropolitan area networks--Part 15.4: Low-Rate Wireless Personal Area Networks (LR-WPANs)

  4. ZigBee Alliance, ZigBee Cluster Library Specification, Revision 6, Jan. 2016.