ワむダレス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ボリュヌム、Kb192/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 = YYYYSXXレゞスタに曞き蟌むず、倀YYYYが登録されたす
ATREMS<デバむスアドレス>、XXリモヌトホストのSXXレゞスタの内容の読み取り
ATREMS<デバむスアドレス>、XX = YYYYYYYY倀をリモヌトノヌドの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無線モゞュヌルの䜿甚]

䟿利なリンク




Source: https://habr.com/ru/post/J306062/


All Articles