LoginSignup
0
0

More than 5 years have passed since last update.

Node-REDのフローから自作ノードにバイナリデータを渡す方法

Last updated at Posted at 2019-02-16

Node-REDのフローから自作ノードにバイナリデータを渡すとき、Uint8Arrayを使用していましたが、これはフロー上のUint8ArrayとNode.js側のUint8Arrayの型が違うために受け渡しできません。

バイナリデータでやり取りをするときは、Bufferクラスをサポートしましょう。そうすれば、フローとNode.jsでバイナリ配列のやり取りすることができます。

問題の事象

Node-REDのフローの中でUint8Array型のバイナリデータを生成して、自作ノードに渡そうとしましたが、正しく動作しませんでした。

ブラウザ上のfunctionノード内のコード

この結果を自作ノードに入力します。

let data = new Uint8Array([1,2,3,4,5]);
return {payload: data};

自作ノード内

node.on('input',(msg) => {
  let payload = new Uint8Array([0,1,2,3,4,5]);
   console.log(msg.payload);
   console.log(payload);
});

結果

自作ノード内で、2つのpayloadを出力してみると、このようになります。
1.png

Functionノードで宣言したUint8ArrayはJSON、自作ノード内で宣言したUint8Arrayは配列になっており、明らかに違うようです...

正解

Bufferを使用した時の結果

ブラウザ上のfunctionノード内のコード

let buffer = new Buffer([0,1,2,3,4,5]);
let uint8array = new Uint8Array([0,1,2,3,4,5]);
return {buffer: buffer, uint8array: uint8array};

自作ノード内

node.on('input',(msg) => {
    console.log({
      buffer:  (msg.buffer instanceof Buffer),
      uint8array: (msg.uint8array instanceof Uint8Array)
    });
    console.log({binay: msg.binary});
    console.log({uint8array: msg.uint8array});
});

正解の結果

このようにBuffer型を使用した方は成功しました。
Node.js内のUint8Arrayは使用できるようなので、instanceofで型をチェックすれば正しく判定できることもわかりました。

2.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0