今回の記事ではZenoh通信Protocolを横河電機のert3とSeeedStudioのreComputer R1025-10を試します。最初はPeer to PeerとZenoh Routerにチャレンジします。
さ、FAを楽しもう。
Zenoh?
ZenohはPub/Sub/Queryプロトコルであり、比較的新しい通信Protocolです。その効率的なPub/Sub/Queryを提供し、複数レベルの信頼性、ダイナミック・ディスカバリー、フラグメンテーション、ワイヤ・レベルのバッチ処理をサポートします。また、Zenohは、スケーラブルなルーティング・インフラストラクチャを提供し、アプリケーションをインターネット規模で展開することを可能にします。
Pub/Sub in Zenoh
下図は基本的なパブ/サブの動作を示しています。システムに接続されたサブライバは、Zenoh ネットワークを通じて効率的にルーティングされたパブリッシャから送信された値を受信します。また、ネットワークに接続されたサブウーファがスリープしている様子も見ることができます。
Queries in Zenoh
下図はZenohを使った簡単なクエリの動作を示しています。ストレージとクエリケーブルが存在することがわかります。クエリ可能とは、クエリに応答できるすべてのプロセスです。ストレージはサブスクリプションとクエリ可能の組み合わせです。
Who is using?
以下は、Zenohを採用、支援、貢献した企業、研究機関、財団のリストであります(2024年時点)。
Installation
最初に横河電機のert3とrecomputerR1025にZenoh のPython Packageをインストールします。
install venv
下記のコマンドに仮想環境を作成します。
python -m venv yourvenvname |
install zenoh
ert3とrecomputerR1025の仮想環境の中にZenoh Packageをインストールしましょう。
pip install eclipse-zenoh==1.0.0b2 |
Exmaple1
Example1は横河電機のert3がSubscriberで、recomputerR1025がPublisherになります。2つのデバイスではPeer to Peerで通信します。
SeeedStudio Side
下記のコマンドでSubscribe用のPython scriptを作成します。
nano z_sensor.py |
z_sensor.py
下記のPython Scriptで1秒ごとにCNC/machine1/axis1/position/abs/x MessageをPublishします。
import zenoh,random,time random.seed() def read_post(): return (random.randint(15,30)) #return “Hello world” if __name__ ==”__main__”: session = zenoh.open(zenoh.Config()) key=’CNC/machine1/axis1/position/abs/x’ pub=session.declare_publisher(key) while True: t=read_post() buf=f”{t}” print(“putting data..”+key+” “+buf) pub.put(buf) time.sleep(1) |
ert3 Side
下記のコマンドでert3用のPython scriptを作成します。
nano z_sub.py |
z_sub.py
下記のPython Scriptで1秒ごとにCNC/machine1/axis1/position/abs/x をSubscribeします。
import zenoh,time def listener(message): #print(“Message is received:”+message.kind+” , “+message.key_expr+” ,”+message.payload.des> print(f”Received {message.kind} (‘{message.key_expr}’: ‘{message.payload.deserialize(str)}> if __name__ == “__main__”: session=zenoh.open(zenoh.Config()) sub=session.declare_subscriber(‘CNC/machine1/axis1/position/abs/x’,listener) time.sleep(10) |
Result
横河電機のert3とrecomputerR1025間でメッセージ交換できました!
Example2
Example2はrecomputerR1025にZenoh Routerをインストールし、横河電機のert3がSeeedStudioがPublishしたメッセージをそのRouter経由でデータを取得します。
SeeedStudio Side
SeeedStudioR1025側からpackageをインストールし、Python Scriptを作成します。
Install Router
下記のコマンドでZenoh Routerをインストールします。
$ echo “deb [trusted=yes] https://download.eclipse.org/zenoh/debian-repo/ /” | sudo tee -a /etc/apt/sources.list > /dev/null $ sudo apt update $ sudo apt install zenoh |
Config File
zenoh-config.json5 Fileを作成し、下記のようにConfiguration Fileを作成してください。
REST APIで、Port 8000、CNC/**をRoutingするようなConfigurationです。
{ plugins: { rest: { // activate and configure the REST plugin http_port: 8000 // with HTTP server listening on port 8000 }, storage_manager: { // activate and configure the storage_manager plugin storages: { myhome: { key_expr: “CNC/**”, volume: { // and using the “memory” volume (always present by default) id: “memory” } } } } } } |
Start router
最後は下記のコマンドでZenoh Routerを起動し、またExample1で作成したz_sensor.pyを起動しましょう。
zenohd -c zenoh-config.json5 |
ert3 Side
次は横河電機のert3にRouterからCNC/machine1/axis1/abs/x’の情報を取得するScriptを作成します。
import zenoh if __name__ == “__main__”: session = zenoh.open() replies = session.get(‘CNC/machine1/axis1/abs/x’) for reply in replies: try: print(“Received (‘{}’: ‘{}’)” .format(reply.ok.key_expr, reply.ok.payload.deserialize(str))) except: print(“Received (ERROR: ‘{}’)” .format(reply.err.payload.decode(str))) session.close() |
Result
Done!横河電機のert3 ControllerがrecomputerR1025にインストールされたZenoh Routerから情報を取得できました!