[[FrontPage]]

*はじめに [#u77776c8]

近頃、ZigBeeを使う方が非常に増えきたなと感じます。

必ずしも「ZigBee業界」でない方々が、自分のやりたいことを実現するための手段として、ZigBeeを選択しはじめていて、ZigBeeが目的でなく手段になってきています。古くからワイヤレスネットワークに取り組んできた私たちとしては非常に嬉しい限りです。

ただ残念なことに、通信規格としてのZigBeeは、今や複雑巨大なモンスターになってしまい、たとえ技術者であっても理解して使いこなすのはなかなか困難と言わざるを得ません。そこでスカイリーは、より現実的、実践的に、ポイントを抑えたZigBeeの解説を作ろうと考えました。一般的な概論は極力避けて仕様面を必要最小限に記述していますが、これは逆にいうと膨大なZigbee仕様も、最初に理解すべき本質的な部分はそのごく一部で十分ということです。

この解説で「ZigBeeモジュールを導入してみたけど動作がよくわからん」という「??」が少しでも解決されれば嬉しいと願っています。

*ZigBeeプロトコル [#o721d5bc]

**変遷 [#t2deac6f]

ZigBee通信規格は2004年の発表から現在に至るまでに、仕様上の大きな改訂が何度かありました。とりわけ2007年頃策定された最新規格においてはZigBeePROフューチャーセット(通称「ZigBeePRO」)が登場し、それまでのいわゆる伝統的なZigBee規格は「ZigBeeフューチャーセット」という呼び名で区別されることになりました。

&ref(image5.PNG,nolink,image5);

ZigBeePROとZigBeeの違いを一言でいいますと、ZigBeePROではツリー型ネットワークが廃止され、メッシュネットワークのみになりました。また初期のZigBeeではスター型においてスーパーフレームを利用するいわゆるビーコンネットワークが可能でしたが、ZigBeePROではビーコンネットワークはサポートされなくなっています。したがってZigBeePROではもはやスター型とメッシュ型の区別もあまり意味がなくなり、スター型とは「コーディネータとエンドデバイスだけで構成されるメッシュネットワークである」と考えることもできます。

現在の主流はZigBeePRO規格となっており、ZigBee解説書の中にはZigBeePROで通用しない機構が解説されているものもありますので、場合によっては注意が必要です。

このWikiでは主にZigBeePROを解説しますが、ほとんどの記述がZigBeeにも当てはまります。ただし特に区別が重要な箇所については、その区別を明確にして解説しています。

**周波数 [#t2deac6f]

ZigBeeは物理層として主にIEEE 802.15.4という規格を利用します。IEEE 802.15.4はその名の通りIEEEで策定されている通信規格で、ネットワーク層以上を定めるZigBeeと物理層を定める802.15.4は策定している団体が異なります。802.15.4で利用できる周波数は以下のようになっています。

-2.4GHz帯・・・世界共通
-868MHz帯・・・主にヨーロッパ
-915MHz帯・・・主にアメリカ

また各周波数には分かりやすいように連番で論理番号が割り振られています。

-868MHz帯・・・チャンネル0
-915MHz帯・・・チャンネル1-10 (906MHzから2MHz刻みで全10チャンネル)
-2.4GHz帯・・・チャンネル11-26 (2405MHzから5MHz刻みで全16チャンネル)

したがってZigBeeの説明で「チャンネル11」というときは、2405MHzを指すことになります。これらの中で特に2.4GHz帯は世界共通で利用できるため、最も多く利用されている周波数になります。

そこで2.4GHzにフォーカスした場合の周波数の使い方と、家庭やオフィスで一般的に使われるようになった無線LAN(802.11b)との比較を下図に示します。

&ref(image8.PNG,nolink,image8);

802.15.4は隣合うチャンネル同士で影響を与えない点がポイントです。一方で802.11bはチャンネルの占有帯域が重複しており、完全に干渉を避けるにはチャンネルを4つ開ける必要があります。802.11bとZigBee(802.15.4)は共に変調方式にDSSSを使っていますが、802.15.4は中心周波数から2MHzを使い、802.11bは22MHzを使います。

また現在、900MHz帯を利用する802.15.4d, g, eの標準化も進行しており、そう遠くない将来にサブ1GHz上で動作するZigBeeが利用可能になると考えられています。


*ネットワークとデバイスタイプ [#t2deac6f]

ZigBeeでは3種類のデバイスタイプが存在します。それぞれ、コーディネータ、ルータ、エンドデバイスと呼ばれます。

コーディネータは、PANを開始し、必要ならば外部のネットワークともつながるゲートウェイとなります。エンドデバイスはスリープしても良い唯一のタイプで、実際の用途、例えば温度計測するなら温度センサー、二酸化炭素濃度を計測するならCO2センサー役になります。この二種類のデバイス間に多数存在できてデータを転送する役がルータになります(もちろんルータにセンサーを付けても良いですが)。エンドデバイスと異なりルータはデータを中継するいわゆるルーティング能力を持ちます。いつどこからデータの中継を依頼されるか分からないため、スリープすることはできません。

**ネットワークの形 [#t2deac6f]

ZigBeeには図のように3つのネットワーク方式があります。

***【ネットワーク構成図】 [#tec9311d]

&ref(network.jpg,nolink,image1);

スター型は、例えば無線LANがこの形です。中央にアクセスポイント(=コーディネータ)があり、そこに末端端末(=エンドデバイス)も転送端末(=ルータ)も直接つながります。

ツリー型はその名のとおり木のように、幹、枝、葉というように階層的につながっていく形式です。ZigBeeではツリーを形成する際に「分散アドレス割り当て」というユニークな手法を採用しています。この方式では、ある特定の計算式にしたがって親が子のアドレスをアサインしていきます。その計算式はツリーの深さと子デバイスの数から重複なくアドレスを生成でき、ネットワーク全体の情報を持つことなく一意なアドレスを割り当てていくことができるようになっています。さらに秀逸なのは、そのアドレスからツリーの深さや親デバイスを逆算できるため、ルーティングテーブルを使わなくてもネクストホップが確定できます。そのためネットワーク規模が大きくなってもメモリ消費量はそれほど増えないという大きな特徴をもっています。

(余談ですが個人的にはこの「分散アドレス割り当て」方式こそがZigBee最大の発明の一つだと思うのですが、惜しくもZigBeePROでは廃止になってしまいました。)

最後にメッシュ型ですが、これはネットワークがメッシュつまり網状に拡大していく形です。アドレスは基本的に「乱数」で割り当てられます。よってアドレスからは転送先が分からないため、いわゆるAODVと呼ばれる動的な経路構築のメカニズムを用いて通信経路を形成します。前述のように、ZigBeePROではツリー型は廃止されており、ZigBeeフューチャーセットの方で継続的にサポートされています。またビーコンネットワークをサポートしないZigBeePROではスター型とメッシュ型の区別も曖昧で、結果としてスター・ツリー・メッシュという3つのネットワークの区別は、現在ではかなり便宜的なものになっています。

*アドレッシング [#p824fd21]

ここでは、非常に重要な「アドレス」について解説します。Zigbee機器は2種類のアドレス、つまりIEEE 64bitアドレス(またはロングアドレス、拡張アドレス等)と16bitアドレス(ショートアドレス、ネットワークアドレス)を使い分けます。それぞれ以下の意味を持ちます。

**IEEE 64bitアドレス [#p824fd21]
デバイスに固有の識別子。世界中のZigBeeデバイスがそれぞれ固有の64bitアドレスを持ちます。通常、機器の製造元がきちんとアドレスを管理して出荷時に付与します。ただし評価ボードなど「実験、開発用」のZigBee機器にはIEEE 64bitアドレスが付与されてないこともあります。イーサネットの48bit MACアドレスと同じ役割を果たします。

**16bitアドレス [#p824fd21]
後述するPANへの参加時に、動的にアサインされます。同じPANの中では必ず一意である必要がありますが、異なるPANであれば同じ番号が使われる可能性もあります。16bitアドレスはPANへ参加する度に異なる値がアサインされます。その意味ではDHCPで運用されているプライベートIPネットワークに似ています。

このうちZigBeeは、主に16bitアドレスを使って互いに通信します。

*PANの生成と参加 [#p824fd21]

ZigBeeネットワークの作り方を解説します。ZigBeeでは、各ネットワークはPAN IDという16ビットの識別子で区別されます。PAN IDが異なるデバイスはたとえ電波の届く範囲にいても直接通信はできません。逆にいうと、ZigBeeがネットワークを作るとは、各デバイスが同じPAN IDを共有するプロセスであるということが出来ます。

**PANの生成[コーディネータ] [#fb931340]
コーディネータはまず最初に各チャンネルの電波環境を調べ、ノイズの少ないチャンネルを検索します。同時にアクティブスキャンを行い、周囲に同様なコーディネータが存在しないか確認します。その上で、

1) PANが利用するチャンネル
2) PANが利用するPAN ID

を決定して起動します。

PAN IDは、原則的にはランダムに生成されますが、それだといろいろと使いづらい点も多いので、事前に生成するPAN IDを指定できる製品がほとんどです。

誤解を恐れずに思い切りざっくりといってしまえば、コーディネータの仕事はたったのこれだけです。

コーディネータは1つのPANに必ず1つだけ存在し、ショートアドレスは必ず0x0000を使うと決まっています。事前に割り当て値が予測できないルータ、エンドデバイスのショートアドレスと異なり、コーディネータだけは確定してます。センサなどで取得したデータをコーディネータに周期的に送信するといったコーディネータ方向へのアプリケーションは、事前にアドレスを調べることなく動作することができるわけです。

**スキャン[ルータ・エンドデバイス] [#v26c9420]
ネットワーク参加の最初のプロセスとしてスキャンが始まります。多くの場合、各デバイスはアクティブスキャンを周期的に行いますが、その過程で周囲の端末に対して “Beacon Request”を同報します。それをキャッチした周囲の端末は “Beacon Response”をユニキャストで応答します。これにより周囲の端末の情報(Node Descriptor)を得ることができるわけです。

ブロードキャストで探索し、ユニキャストで応答する、これが基本です。

&ref(image2.PNG,nolink,image2);

次に、スキャンによって取得した周囲の情報(Node Descriptor)の中から、参加したいネットワークのPAN IDを選択します。デバイスを個別に選択するのでなく、あくまでPAN IDを選択するという点に注意が必要です。そして更にそこから、スキャンで取得したNode Descriptorを使って、そのPAN IDに接続できそうな最寄のデバイスをピックアップし、接続過程に入ります。

**接続 [#v26c9420]
アクティブスキャンで得られたNode Descriptorの中には、ビーコンを応答してきたデバイスのIEEE 64bit アドレスが格納されています。この情報を元にして接続要求元はMAC層のAssociation request, Association Response, Data requestを行います。この過程で接続先は、接続要求してきた端末のアドレスをランダムにアサインすると同時に、自分がもっているリスト(ネイバーテーブル)に追加します。

&ref(image3.PNG,nolink,image3);

**デバイス通知 [#lcf221bb]
接続をリクエストした相手からAssociation Responseが成功ステータスで返答されると、ネットワークへの参加は成功になります。次に、新しく参加したデバイスは、自分のIEEE 64bitアドレスとショートアドレスの対情報とデバイスの属性を、ネットワーク全体にブロードキャストします。これはZDO層のdevice annceという特殊なメッセージによって実現されます。これによって新規にデバイスがネットワークへ参加したということを他のデバイスが知ることになります。

ここまでが、ZigbeeにおけるPAN生成とPANへの参加シーケンスの流れです。バッタもんでない、すべての正しいZigBeeデバイスは、必ずこの処理を行います。ただしこれらの処理はZigbeeハードウェアが自動で行いますので、使う側が意識することはほとんどありません。

**参加に関するいろいろ [#v26c9420]
***アクティブスキャン [#lc91191b]
アクティブスキャンは、ZigBeeの各チャンネル毎にビーコン要求してだして、しばらく待機し、また次のチャンネルで、、、というように繰り返し処理をします。このため、アクティブスキャンが完了するまでにしばらく時間がかかります。これがいわゆるZigbeeの「接続時間が長い」というやつです。通信できるようになるまでにしばらく時間がかかるなと思う時があるのは、アクティブスキャンをかけているからです。デバイスはスキャンをかけている間は原則、他の通信は行いません。

スキャンにおける各チャンネルの滞留時間は、一番短くて約15msec, 長くて約4分程度で、計算式は

15.36msec * 2^duration  
(ここで0 <= duration <= 14) 

つまり倍々に増える形で滞留時間をコントロールできます。

さて、このアクティブスキャンを迅速に行うことは可能でしょうか? これはつまり接続時間の短縮につながります。

ZigBee的な回答としては2つの手段があります。

1. 上の式におけるdurationを小さい値にする 
2.スキャンするチャンネルを全チャンネルでなく、いくつかのチャンネルに絞る

2は一般にスキャンチャンネルマスクといい、たとえばチャンネル11, 15, 19, 23だけスキャンするといった運用が可能です。当然、このチャンネルで起動しているPANだけしか発見できなくなりますが、ネットワーク形成を短縮したい場合のひとつの方法となります。

***接続の許可・拒否 [#lc91191b]


*【「ZigBee PRO」の主な機能】 [#u74aab89]

1) 周波数アジリティー機能(Frequency Agility)
  
ZigBeeの周波数帯(2.4GHz)は、無線LANやブルートゥース(Bluetooth)などが共用しており、電波が干渉する可能性があります。「ZigBee PRO」では、通信状況を常に把握しており、干渉によって通信状況が悪くなった場合は、コーディネーターがチャンネル変更の指示を出し、干渉しないチャンネルへ移動させて、ネットワークの安定性を高めることができるようになりました。

2) 分割配信機能(Fragmentation)

ZigBeeは1回に最大127バイトのデータが送信可能ですが、用途(画像送信等)によっては127バイトでは小さすぎる場合もあり、「ZigBee PRO」では、127バイトより大きなデータを自動的に分割して送信し、受信側で元データに自動的に復元します。この機能により、電子証明書を送付することができ、高度なネットワークセキュリティが可能となりました。

3) ストキャスティック・アドレッシング機能(Stochastic Addressing)
これまでのZigBeeでは親機のアドレスから自機のアドレスが決まっていたので、一度接続が完了すると場所を移動させることができませんでした。「ZigBeePRO」のストキャスティック・アドレッシング機能によりアドレスが乱数になったのでデバイスの親子関係を意識する必要がなくなり、たとえば、ディスプレイを移動するなど、構成するデバイスの位置移動が楽になりました。
  

4) ID コンフリクト機能(ID Conflict)

ZigBeePROフューチャーセットでは、1つのネットワーク内で16ビット=65565通りのアドレスをランダムに割り当てますが、万が一そのアドレスが重なってしまった場合、衝突を検出してアドレスを自ら変更することで、衝突を解決する機能が備わりました。
 

5) ルート・レコード機能(Source Routing)

ZigBeeでは、自動的にルートを選択してデータを中継しますが、どのルートを辿ったかということがこれまで分かりませんでした。「ZigBee PRO」のルート・レコード機能によって、途中ルートが分かるようになります。 


6) メニー・トゥー・ワン機能(Many-to-one)

ZigBeeでは、これまで1台ずつ経路を作る必要があったために、端末台数が多いと通信負担が大きく、たとえば、コーディネーター(Coordinator)を中心に6台がつながっている場合は6回の通信確認が必要でした。「ZigBeePRO」のメニー・トゥー・ワン機能は、1回の通信で全端末分の経路が作られるようになりました。


7) リンク・ステータス機能(Link Status)

Z一般にワイヤレス通信では往路はOKだが、復路はNGというように、片方向だけ電波状態が悪い場合が多くあります。「ZigBee PRO」のリンク・ステータス機能によって、往復路でそれぞれ電波状態の良い経路を選べるようになりました。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS