ワイヤレスZigBeeネットワーク。 パート2 [ETRX35X無線モジュールの使用]

はじめに





前の記事で、ZigBeeワイヤレステクノロジーの主な機能について説明しました。 このパートでは、実際にこのテクノロジーをすぐに使い始める方法について説明します。 これを行うために、ファームウェアを内蔵したETRX357モジュールを選択しました。これにより、ネットワーク機能を操作し、一連のATコマンドを使用してアナログおよびデジタル周辺機器を管理できます。 また、この記事では、ZigBeeネットワークのデバイスの種類とネットワークセキュリティに関する質問について詳しく説明します。 最後に、いくつかのワイヤレスデバイスから温度情報を受信するデータ収集ネットワークを構築します。










1. ETRX357モジュール





選択したハードウェアプラットフォームに精通します。 ETRX357モジュール 、Silicon LabsのEM357チップに基づいています。 このチップはチップ上のシステムです。2.4GHzの周波数で動作するプロセッサコアCortex-M3 + RFトランシーバーです。







ETRX357モジュールに 4つのバージョンあります。









直接視界条件でのETRX357およびETRX357-LRSモジュールの実験的通信範囲測定:









以下は、モジュールの主な特性に関する要約表です。







特徴 説明
プロセッサコア ARM Cortex-M3
高周波トランシーバー 2.4 GHz
フラッシュ/ RAMボリューム、Kb 192/12
消費電力 TX: 42 mA @ +8 dBm
RX: 26.5 mA
「夢」: 400 nA
動作電圧範囲 2.1-3.6 V
動作温度範囲 -40 ... + 85°C


技術的特性に関する詳細情報は、モジュールのドキュメントで入手できます[ 1 ]。










2.内蔵ファームウェア



すべてのモジュールには製造元からのファームウェアが組み込まれています。開始するには、モジュールに電力を供給し、シリアルUARTインターフェイスのTxDおよびRxDラインを接続するだけで十分です。 すべてのコマンドは、条件付きで2つのタイプに分類できます。







  1. ネットワーク機能を操作します。 例:

    • ネットワーキング/既存のネットワークへの接続
    • アドレス/グループ/ブロードキャストメッセージの送信
    • リモートノードレジスタの読み取り/書き込み
  2. モジュール周辺機器を操作します。 例:

    • I / Oポートを構成する
    • RFトランシーバーの電力制御
    • シリアルインターフェイスを介した情報メッセージの出力の有効化/無効化


また、標準ファームウェアには一連の機能が含まれており、場合によっては外部のマイクロコントローラーや制御装置がなくても機能します。 コマンドの完全なリストはマニュアル[ 2 ]にありますが、最も頻繁に使用されるもののみを以下にリストします。 データ収集システムを作成するには、このリストのチームが必要です。







ネットワーキング
チーム 説明
AT +パンスキャン 利用可能なネットワークをスキャンする
AT + EN ネットワーキング
AT + JN 利用可能なネットワークに接続します
AT + DASSL 現在のネットワークを離れる
AT + DASSR:<デバイスアドレス> ネットワークを終了するコマンドをリモートデバイスに送信する


メッセージを送信する
チーム 説明
AT + UCAST:<デバイスアドレス> = <メッセージ> アドレスメッセージを送信する
AT + MCAST:<最大 リレーカウント>、<グループID>、<メッセージ> ネットワーキング
AT + BCAST:<最大 リレーの数>、<メッセージ> 利用可能なネットワークに接続します
AT + SCAST:<メッセージ> データをシンクノードに送信する


最大メッセージ長 :72バイト。







重要 :グループメッセージはブロードキャストメッセージの特殊なケースであるため、高い反復率で送信しないでください(ドキュメントでは、8秒以内に8グループ/ブロードキャストメッセージしか示していません)。 さらに、グループメッセージがスリープ状態のエンドデバイスによって受け入れられないという事実に注意を払う価値があります。







無線モジュールレジスタを操作する
チーム 説明
ATSXX? SXXレジスタの内容の読み取り
ATSXX = YYYY SXXレジスタに書き込むと、値YYYYが登録されます
ATREMS:<デバイスアドレス>、XX? リモートホストのSXXレジスタの内容の読み取り
ATREMS:<デバイスアドレス>、XX = YYYY YYYY値をリモートノードのSXXレジスタに書き込む


ビルトインSレジスタへのビット単位のアクセスが可能です。 これを行うには、読み取り/書き込みコマンドで、XXの後に、参照する必要があるビット番号を指定する必要があります。 例:







ATS001? #   1    S00 ATS001=1 #  1  1   S00 ATS1812? #   18    S18 ATREMS:0000,0AE? #   14    S0A      0000
      
      







それでは、ZigBeeネットワークの構築プロセスのより詳細な議論に移りましょう。 メザニン無線モジュールとZigBee-USBゲートウェイがインストールされているデバッグボードを使用します。 デバッグボードにはいくつかのアナログセンサーがあり、これについては後で説明します。 それらから読み取り値を取得し、それらを中央データ収集ユニットに送信します。そこで、すべてが処理されます。 ステップごとに、データ収集システムを作成し、プロセスで発生する可能性のある主な問題を分析します。







将来のデータ収集システムについて説明します。


















3. ZigBeeネットワークの作成



AT + ENコマンドについては前述しました。これにより、ネットワークを編成できます。 このコマンドがシリアルインターフェイス経由で送信されたデバイスがネットワークコーディネーターになります。 デフォルトでは、コーディネーターは最適な周波数チャネルを個別に選択し、短いネットワークアドレスと長いネットワークアドレスを生成します。







 AT+EN JPAN:24,949D,56370DE37E0DC0FF # 24 -   # 949D -    # 56370DE37E0DC0FF -   
      
      





以下は、ZigBeeネットワークの作成プロセスに値が影響するレジスタのリストです。













コーディネーターにとって重要な点が1つあります。定義済みの識別子を持つネットワークを作成しようとしたときに、同じパラメーターを持つネットワークが既に存在する場合、一致する識別子が自動的に生成されます。












4.ネットワークセキュリティ



ZigBeeネットワークでは、特別なノードであるセキュリティセンターがセキュリティを担当します。 デフォルトのコーディネーターは、セキュリティセンターです。 また、ネットワークが分散トラストセンターモードで作成された場合、トラストセンターは任意のルーター(FFDデバイス)にできます(これについては、この章の最後で説明します)。







トラストセンターの責任:







  1. 他のデバイスを接続する許可
  2. 暗号化キーの操作(キーの定期的な更新、キーの更新に関する他のノードへの通知)


ZigBeeネットワークは2つのキーを使用します。







  1. リンクキー -このキーは、データ交換のためにネットワーク上の2つのデバイス間で安全な接続を確立するために使用されます。 ネットワークへの接続時にデバイスが受信するキーはトラストセンターリンクキーと呼ばれ、デバイスの操作中に取得できる他のすべてのキーはアプリケーション層リンクキーと呼ばれます。 デフォルトでは、セキュリティセンターのリンクキーは、セキュリティホールを表すクリアテキストで送信されます。これは、新しいデバイスをネットワークに接続するときにこのキーを傍受できるためです。
  2. ネットワークキー -このキーは、ZigBeeスタックのネットワークレベルでデータを暗号化するために使用されます。 セキュリティセンターによって生成され、定期的に更新されます。 単一のZigBeeネットワーク内のすべてのデバイスには、単一のネットワークキーがあります。 その助けにより、すべてのネットワークパケットが暗号化されます。 デフォルトでは、セキュリティセンターはリンクキーを使用して暗号化されたネットワークキーを送信します。


ネットワークを介して送信されるデータの潜在的な侵害を防ぐために、いくつかのオプションを使用できます。









この記事では、プリインストールされたリンクキーを使用したオプションを検討します。 このアプローチの欠点は、すべてのモジュールに適切な構成を書き込む必要があることです。 しかし、小規模ネットワークでは、これは重要ではありません。 ETRX357モジュールの標準ファームウェアでは、対応する値をレジスタS09に書き込むことでリンクキーを設定できます。 さらに、 S0Aレジスタで次のビットを1に設定する必要があります。









ノード構成の例
 ATS09=ABCDEFFEDCBACBAFEDDEFABCBAFEDCFF:password #  Link Key # :password -       ATS0A8=1 ATS0A4=1 ATS0A2=1
      
      





コーディネーターを除くすべてのノードでビット2および4を設定することはオプションの手順です。 このアプローチの利点:









別の興味深い可能性を指摘します。S0Aレジスタでは、9ビットが特別な機能を有効にします-分散トラストセンターのモードでネットワークを作成します。 この動作モードでは、任意のルーター(FFDデバイス)を使用して、新しいデバイスを現在のネットワークに接続できます。 分散型セキュリティセンターモードは、すべてのワイヤレスノードの接続の遅延を回避するために、大規模なネットワークを展開するときに使用されます。 ネットワークの展開後、 AT + BECOMETCコマンドを使用して、セキュリティポリシーを規制するためのセキュリティセンターが選択されます。 この動作モードでネットワークセキュリティを確保するには、プリセットの処理/リンクキーの取得も必要です。 そうしないと、セキュリティセンターが選択されるまで、ZigBeeデバイスはネットワークにシームレスに接続できる可能性があります。










5. ZigBeeデバイスの種類



前の記事では、ZigBeeデバイスの主要なタイプが検討されました。 主な機能を思い出して、エンドデバイスの種類について説明します。









リストされたデバイスは、エンドデバイスの親ノードとして機能します。 ルーターまたはコーディネーターの子ノードの最大数は最大32です。親デバイスは、接続されているエンドデバイスのメッセージを受信および保存(*)する責任があります。 次に、エンドデバイスは親を介してネットワークと通信します。 新しいエンドデバイスがネットワークに接続されるたび、または古いエンドが再接続されるたびに、親が定義され、子デバイスの特別なテーブルにエントリが作成されます。 このテーブルには、子ノードの短いアドレスと長いアドレス、およびそのタイプが格納されます。 使用可能なエンドデバイスのタイプを考慮してください。









ZigBeeネットワークの例









エンドデバイスは、FFDデバイスを介して常に接続されます。FFDデバイスは、接続時に通信品質の最良のインジケーターを備えていました。 その過程で、ルーターが故障しているか、サービスのために使用されたときに状況が発生することがあります。 この場合、親との再接続を何度か試みた後、エンドデバイスは新しい親ノードの検索を開始します。 この図では、モバイルノードと親の間の接続が破線で示されています。 一定期間後、MEDデバイスは別の親を介してネットワークに参加できます。











ポーリングメカニズム



このメカニズムは、いくつかの目的で使用されます。







  1. したがって、モバイルデバイスとエンドデバイスは、親ノードに保存されているメッセージを受信できます。







  2. 子デバイスのテーブルから自分に関するレコードが削除されないようにします。


スリープ状態のエンドデバイスのZigBee仕様によると、アドレスメッセージは親によって7.68秒間保存されます。 さらに、SED / MEDデバイスのアドレスメッセージの繰り返し率が指定された値よりも高い場合、メッセージは上書きされます。 したがって、信頼性の高いデータ配信を確保するには、スリープ状態のエンドデバイスが十分な頻度で親ノードに問い合わせる必要があります。 この点で、スリーピングエンドデバイスには、 短い ポーリング間隔と長いポーリング間隔の2つのポーリング間隔があります。







短いポーリング間隔は、トランザクションの成功の確認を待機する場合、たとえばセンサー読み取り値のデータを含むパケットを送信する場合に使用されます。 通常、この間隔は1秒に設定されます。 確認を受信すると、デバイスはスリープモードになり、長いポーリング間隔が使用されます。







長いポーリング間隔は、通常、十分に長い時間(数分から数日)に設定されます。 これにより、スリーピングエンドデバイスは、親の子テーブルのスペースを節約できます。 親は、時間通りに連絡がとれなかった場合、テーブルからエンドデバイスを削除できます。 この場合、その瞬間に寝坊したエンドデバイスは、ネットワークに再接続する必要があります。







ポーリングメカニズムの詳細については、Silicon LabsのZigBeeスタックガイドを参照してください。 ETRX357モジュールの標準ファームウェアでは、親ノードはタイマー/カウンター0からの割り込みによってポーリングされます。










6.データ収集ネットワークの作成



基本的な理論が語られているので、実践に移りましょう。 ETRX357無線モジュールと連携するためにPythonモジュールが使用されます。 使用に関するすべての推奨事項は、添付のREADMEファイルに記載されています。







6.1 ZigBeeデバイスの構成



各ノードに対応する構成を書き込みます。 3つのデバイス(USBゲートウェイと2つのデバッグボード)はすべてコンピューターに接続され、それぞれが適切に構成されました。









コンフィギュレーターの例
 #!/usr/bin/env python3 # coding=utf-8 import rfconf import serial.tools.list_ports def main(): #     sensor_nwk.xml configurator = rfconf.ModuleConfigReader("sensor_nwk.xml") supp_nodes = configurator.get_avail_nodes() supp_nodes = dict(enumerate(supp_nodes)) if len(supp_nodes) > 0: print("Configuration XML file support {} nodes:".format(len(supp_nodes))) print(supp_nodes) #        "Telegesis" for com in serial.tools.list_ports.comports(): if com.description.split()[0] == "Telegesis": tgmodule = rfconf.ModuleInterface(com.device) usr_choice = int(input("How would you like to configure that node: ")) tgmodule.set_node_type(supp_nodes[usr_choice]) tgmodule.write_config(configurator) else: print("There is nothing to do") if __name__ == "__main__": main()
      
      





構成ファイル
 <rfconfig> <node type="COO"> <!-- Link Key --> <reg name="S09" password="password" overwrite="y" type="string"> 12341234123412341234123412341234 </reg> <!--   --> <reg name="S0A" password="password" overwrite="n" type="hex"> 0114 </reg> <!--    --> <reg name="S01" overwrite="y" type="int"> 3 </reg> <!--  Sink- --> <reg name="S10" overwrite="n" type="hex"> 10 </reg> </node> <node type="SED"> <!-- Link Key --> <reg name="S09" password="password" overwrite="y" type="string"> 12341234123412341234123412341234 </reg> <!--   --> <reg name="S0A" password="password" overwrite="n" type="hex"> 0114 </reg> <!--    --> <reg name="S01" overwrite="y" type="int"> 3 </reg> <!--    Sink- --> <reg name="S10" overwrite="n" type="hex"> 100 </reg> <!--    PB5 --> <reg name="S15" overwrite="n" type="hex"> 2000 </reg> <!--   / --> <reg name="S13" overwrite="y" type="hex"> 00FF7EFB </reg> <reg name="S16" overwrite="y" type="hex"> 00008204 </reg> <!--     S16,      --> <reg name="S17" overwrite="y" type="hex"> 00008204 </reg> <!--   / --> <reg name="S18" overwrite="y" type="hex"> 00FD58E7 </reg> <!--     S18,      --> <reg name="S19" overwrite="y" type="hex"> 00FD58E7 </reg> <!--  / 7 --> <reg name="S37" overwrite="y" type="int"> 40 </reg> <reg name="S38" overwrite="y" type="hex"> 8110 </reg> <!--       --> <!--    2     --> <reg name="S28" overwrite="y" type="int"> 0003 </reg> <!--    0     1 (PA0) --> <reg name="S23" overwrite="y" type="hex"> 0001 </reg> <!--    2     2 (PA1) --> <reg name="S24" overwrite="y" type="hex"> 0003 </reg> </node> </rfconfig>
      
      





スリープ状態のデバイスのセットアップに関するいくつかのコメント。 無線モジュールの消費電力を最小限に抑えるには、未使用の周辺機器(LEDインジケータと光センサーの電源)をすべてオフにする必要があります。 さらに、すべての未使用ピンをプルイン入力または出力用に構成する必要があります。 いくつかの32ビットレジスタがI / Oポートの構成を担当します。









/ AT-[2]. , , , . , S15 13 1 ( PB5). LM61 .







LM61






6.2



, , , . . , . / 7 10 . / 7 S37. :













/ 7 S38 . 0110, /, Sink-. , , (S38F) S38 1. , – 8110. [3]. , Sink-.







Sink-



ZigBee (PANID). 0000 . , , , (UART, SPI ..) - . – , ETRX357, , . :









, , ETRX357 — Sink- — . Sink-, 4 S10 . , , Sink, Sink, 8 S10 AT+SSINK Sink-. Sink- , , . , Sink-, . , Sink-, , . , , Sink- .







Sink AT+SCAST :







 #    Sink AT+SCAST:Hello # ( )     AT+UCAST:CAFE=Hello AT+UCAST:000D6F00024CBCCC=Hello
      
      





6.3



0, . - .



















2 ( S28 ). , , 2-4, , UART. 0 , , . , UART ( . S11). 4 , . 1 2 ( PA0 PA1). :







 # ,     0 - 0001 # ,     2 - 0003 #    2     ATS28=0003 #    0    1 ATS23=0001 #    2    2 ATS24=0003
      
      





:













2, LM61






0, LM61






2, LM61






, 1 , Polling-. , , . 1 . Polling- , .







2, poll=1024 , LM61






6.4



, , . GitHub , examples , sensor_nwk.py . , . . . - , .







 #!/usr/bin/env python3 # coding=utf-8 import rfconf import serial.threaded class TemperatureReader(rfconf.ETRXModuleReader): TEMP_POS = 2 NODEID_POS = 0 def handle_line(self, data): if not data: #    return #      : # SDATA: <Long ID>,<GPIO state>,<ADC0>,<ADC1>,<SeqNO>,<VCC> info, *payload = rfconf.response_split(data) if info == "SDATA": nodeid = payload[self.NODEID_POS] temp = int(payload[self.TEMP_POS], 16) #       #   LM61 temp = (temp / 10 - 600) / 10 print("Node: {} - Temperature: {:.2f}".format(nodeid, temp)) def leave_network(node): LEAVE_NWK_CMD = "AT+DASSL" node.write_command(LEAVE_NWK_CMD) resp = node.read_resp() #    AT+DASSL    "OK" #    ,      "LeftPAN" if resp[-1] == "OK": msg = "" while not msg: msg = node.readline() print(msg) else: print(resp[-1]) def get_network_info(coordinator): NWK_INFO_POS = 1 GET_NWK_INFO_CMD = "AT+N" coordinator.write_command(GET_NWK_INFO_CMD) resp = coordinator.read_resp() if resp[-1] == "OK": nwk_info = resp[NWK_INFO_POS] *nused, ch, txpower, panid, longid = rfconf.response_split(nwk_info) print("network already created - ", end="") print("ch: {}, PANID: {}, EUI64: {}".format(ch, panid, longid)) def create_network(coordinator): NWK_INFO_POS = 1 NWK_PARAMS_POS = 1 CREATE_NWK_CMD = "AT+EN" coordinator.write_command(CREATE_NWK_CMD) resp = coordinator.read_resp() if resp[-1] == "OK": #    nwk_info = resp[NWK_INFO_POS] info, ch, sid, lid = rfconf.response_split(nwk_info) print("network is created - ", end="") print("ch: {}, PANID: {}, EUI64: {}".format(ch, sid, lid)) else: #     -     , #          get_network_info(coordinator) def main(): coo_node = rfconf.ETRXModule("<COMXX  (Windows)  /dev/<ttyUSBXX> (Linux)>", node_type="COO") reader = TemperatureReader(coo_node) #      create_network(coo_node) ser = coo_node.get_serial_interface() reader_thread = serial.threaded.ReaderThread(ser, reader) #      with reader_thread as protocol: reader_thread.join() if __name__ == "__main__": main()
      
      














7.



, . ZigBee- . , Polling- ~250 . 1 , 4000 (~160 ). , . , .







, , . . , .







PS Energy Profiler, Simplicity Studio , EFM32GG-STK3700 Advanced Energy Monitor. Application Note Silicon Labs. , STK3700, . SWO .


















  1. ETRX357
  2. ETRX357標準ファームウェアATコマンドガイド
  3. Silicon Labsの電池式ZigBeeスイッチの説明
  4. デバッグキットETRX3DVKA357の説明


記事一覧



  1. ワイヤレスZigBeeネットワーク。 パート1 [入門]
  2. ワイヤレスZigBeeネットワーク。パート2 [ETRX35X無線モジュールの使用]


便利なリンク






All Articles