ファイルの送受信

1.概要

CPS(Cyber Physical System)では、物理空間で集めたデータをサイバ空間で統計処理/解析し、その結果を物理世界に戻して最適な世界を実現することに重きを置いています。単にサイバ空間にデータを集めるだけでなく、データを処理して物理空間にフィードバックを掛けることが大切です。
具体的に想定する用途は、ロボットなどの設定ファイルを更新する場合などです。

1つの例として、図に示すようにロボットの動作を日常的にMSM(Multi-Sensor Module)のセンサでモニタするシステムがあります。このシステムの場合、センサデータを使ったロボットへのフィードバックのパスとしては2つあります。一つ目は、リアルタイムにフィードバックをかけ、ロボットの動作を制御するフィードバックパスです。そしてもう一つは、センサデータをCloud上に集め、統計処理/解析を行うことで、制御の係数を定期的に見直すフィードバックパスです。後者は、ロボット間のばらつきや摩耗による偏差などを補正します。この時にCloudからロボット制御PCの設定ファイルを送信することでロボットのパラメータの変更を行います。

R-CPSシステムでは、PDH(Physical Data Hub)、Edege Server、GCP(Google Cloud Platform)のVM(Vitrual Machine)ともに、Node-REDを搭載しています。そこで、サイバ空間から物理空間への橋渡しの方法の一つとして、Node-REDを使ったテキストファイル(サイバ空間での処理結果)の送受信方法を説明します。

受信側のマシン(ロボット制御用Window PC)にNode-REDが搭載されているか、いないかでファイル転送の方法が変わります。以下、2種類の方法を説明していますので、最適な最適な方法を使用してください。
1) 送信側/受信側のマシン双方にNode-REDがインストールされている場合:HTTP リクエストのPOSTメソッドで送信して書き換えます。
2) 送信側のみNode-REDがインストールされている場合:sftpノードを使って、sftpで送信して書き換えます。

2.仕様

・ ファイルの送信:設定ファイル(Plain Text)の送信
 PDH( or Windows PC)のNode-REDから HTTP リクエストのPOSTメソッドを使って、受信側のWindows PCに送信します。
 送信元ファイル: /home/pi/data/temp/Control.ini
 送信先ディレクトリ:C:\Users\hayak\data\temp\

3.送信側/受信側のマシン双方にNode-REDがインストールされている場合:HTTP リクエスト

3-1. 書換え実験

3-1-1.送信側Node-REDフロー

・injectノードのボタンを押すと、file inで指定した“Control.ini”のファイルをhttp requestノードからPOST処理で、受信側のhttp inノードの送信します。
 受信側でファイルの書込みが終わると、Status Code=200が送り返されてきます。

3-1-2.受信側Node-REDフロー

・受信側のhttp inノードで受診したデータのmsg.req.bodyをfile out ノードで指定したパスに書込みます。
 書込みが終わると、Status Code=200をhttp responseノードから送信します。

3-1-3.送信結果

受信側の指定パスにファイルが作られます。ファイルの中身はテキストファイルです。

3-2. 送信側のNode-REDの説明

送信側のNode-REDフローは、①injectノード、②file inノード、③functionノード、④http requestノード、⑤debugノードをシリアルに接続した構成です。
① injectノードは、名前を変えているだけで、その他の変更は無しです。
② http requestノードは、ファイル名の欄に送信するファイルのパスとファイル名を記載します。あとは、名前を変更しています。
③ functionノードは、ヘッダの設定を行っています。msg.headers[‘content-type]’を’text/plain’に設定します。あと名前の変更も行っています。
④ http requestノードは、メソッドを‘POST’に設定します。そして、送信先のURLを記載します。ここでは ‘http://192.168.11.29:1880/inifile’と設定しています。’/inifine‘の部分が、受信側のurlになります。
⑤ dubugノードは、表示する対象をmsg.statusCodeにします。

// header set
msg.headers = {};
msg.headers['content-type'] = 'text/plain';
return msg;

3-3. 受信側のNode-REDの説明

受信側のNode-REDフローは、①http inノード、②changeノード、③ write fileノード、④http reqponseノードをシリアルに接続し、⑤debugノードをhttp inノードの出力につなげた構成です。
① http inノードは、メソッドを POST にへ項します。また、URLを送信側のhttp requestノードに記載したURLと合わせます。
② changeノードは、送信されてきたデータが”msg.req.body“に格納されていますので、それをmst.payloadに移し替えています。名前も変更しています。
③ write fileノードは、ファイルの書き出しパスとファイル名を設定します。また、動作としてファイルを上書きを選びます。あと名前の変更も行っています。
④ http responseノードは、返すステータスコードを’200’に設定します。⑤ dubugノードは、表示する対象をmsgオブジェクト全体を選択します。

4.送信側のみNode-REDがインストールされている場合:sftp

4-1. PDH側の準備

送信側のPDHのNode-REDに、node-red-contrib-ftpをインストールします。sftpのインストールはこちら(sftpノードの追加)を参照してください。

4-2. Windows PCの準備

受信側のWindows PCに、OpenSSHのSSHサーバーをインストールして起動させる必要があります。手順に関してはこちら(Windows PCへのOpen SSHサーバーの導入)を参照してください。

4-3. ファイルの送信実験

送信側のPDHのNode-REDに、node-red-contrib-ftpの中のsftpノードを用いて、以下のフローを作成しました。
injectノードを押すと、PDHのローカルファイルが、Windows PCの指定フォルダに指定ファイル名で置かれたとのメッセージが返ってきました。

受信側のWindows PCを確認するとsftpノードで指定したファイル名で“C:\Users\sftp\temp\Control.ini”ファイルが出来ていました。中身も問題なく確認できました。

4-4. Node-REDのフローの説明

sftpのNode-REDフローは、①injecノード、②sftpノード、③ debugノードをシリアルに接続した構成です。
① injectノードは、名前以外は変更していません。
② sftpノードは、sftpサーバーの設定が必要です。そのため、鉛筆ボタンを押して、ホストのURL、ポート番号、送信時のユーザー名、パスワードを設定します。その次に,プロパティうでOperationを“PUT”に設定します。そして、送信先のWindows PCのパスとファイル名および、送信元のローカルファイルのパスとファイル名を記入します。
③ dubugノードは、変更無しです。