「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>ビッグデータ]]
--[[EAI/ETL]], [[IoT]]
--[[JavaScript]] > [[Node.js]]

*目次 [#p4950304]
#contents

*概要 [#w5f8f945]
ちょっと触ることになったので。

-IBM英国Hursley研究所のメンバーを中心に開発
-[[OSS]]であり、[[Node.js]]が動く環境であればどこでも動かせる。

**特徴 [#f29d4780]
[[Apache NiFi]]と同じ、[[flow-based programming>Apache NiFi#nc4ba6c2]]ツール。
-エッジ側で動作させる事に主眼をおいて開発されている。
-デバイス側でも動作する(BLEや各種センサープロトコルに対応したプラグインが豊富)
-[[NiFi>Apache NiFi]]は、[[NiFi>Apache NiFi]]と[[MiNiFi>Apache NiFi#zdbf1caa]]に分かれているが、Node-REDは、分かれていない。

**機能 [#c7d723fd]
モノのインターネットを配線するための

***ビジュアル・ツール [#bdd8abc9]
Node-REDエディタ

***様々な[[ノード>#w409bcd4]] [#g8ecc579]

***[[サブ・プロジェクト>#j5c78bd4]] [#f7d2ea48]

**実行場所 [#v250752e]
ローカルのPCやクラウド、[[Raspberry Pi]]上で動作させることが可能。

***ローカル [#e020a9de]
デスクトップPC上の開発環境でも動作する。

***サーバー [#p85428c8]
サーバとしても動作する。

-[[HTTPリスナ>#c41fb0f0]]
-[[MQTTブローカ>#d7d08977]]

***デバイス(クライアント) [#r8830ed1]
[[Raspberry Pi]]などのデバイス(クライアント)上でも動作する。

*詳細 [#t65c368d]

**サブ・プロジェクト [#j5c78bd4]

***Dashboard [#q1df2e67]
Node-REDのダッシュボードUI

-参考
--node-red-dashboard (node) - Node-RED~
https://flows.nodered.org/node/node-red-dashboard

***Node generator [#m9ef37e0]
Open APIドキュメントや関数ノードのソースなど、~
様々なソースからNode-REDノードモジュールを生成するCLI

-参考
--Node-REDのノード開発容易化ツール Node generator~
https://www.slideshare.net/BMXUG/noderednode-generator

***Command Line Tool [#t2a1d423]
Node-REDインスタンスをリモートで管理できるCLI

-参考
--Command-line Administration : Node-RED~
https://nodered.org/docs/user-guide/node-red-admin
--コマンドラインAdminツール : Node-RED日本ユーザ会~
https://nodered.jp/docs/user-guide/node-red-admin

***Flow Connection Gateway [#rd209052]
システム間の接続インタフェース(API)を統合管理する技術

-参考
--日立、プログラミングツール「Node-RED」の連携を~
容易に実現する技術開発 | マイナビニュース~
https://news.mynavi.jp/article/20170809-a139/

**インストール [#faa4b3f3]

***ローカル [#t521f095]
[[Node.js]]のインストール後に[[npm]]でインストールする。

-参考
--Windowsで実行する : Node-RED日本ユーザ会~
https://nodered.jp/docs/getting-started/windows

***コンテナ [#v1bd1f63]
[[Docker環境>VM起動後の開発環境のセットアップ]]を準備して、以下を行う。

-Docker Build

--Dockerfile
 FROM nodered/node-red
 
 RUN mkdir -p $HOME/.node-red
 RUN cd $HOME/.node-red
 RUN npm install node-red-contrib-aedes
※ [[MQTTブローカ>#d7d08977]]を動かすため、追加インストールを行っている。

--ビルド
 >docker build -t nodered-sample:p1 .

-Docker Compose

--docker-compose.yml
 version: '3.4'
 
 services:
   nodered_sample:
     image: nodered-sample:p1
     ports:
       - "1880:1880"
       - "1883:1883"
--起動
 >docker-compose up

※ portsは、ホスト側:コンテナ側で、1880は、HTTP。1883は、[[MQTTブローカ>#d7d08977]]。

**使い方 [#i7061f5a]

***編集 [#p70b6662]
起動したら、以下のURLにアクセスする。

>http://localhost:1880/

フロー・エディタが起動する。

***実行 [#q69a2a62]
フロー・エディタでフローの定義が完了したら、デプロイ・ボタンを押下。

***IMP/EXP [#i100cf05]
フローのインポート / エクスポート
-Ctrl + i で インポート
-Ctrl + e で エクスポート

**ノード [#w409bcd4]
主要なノードの説明

***入力グループ [#acaaa02b]
-Injectノード~
指定の間隔で日時などの文字列を生成

-[[HTTPリスナ (≒ http inノード)>#c41fb0f0]]
-[[MQTTブローカ (→ mqtt inノード)>#d7d08977]]

-, etc.

***出力グループ [#x5b667db]
-Debugノード~
Debug出力を行う。

-[[HTTPリスナ (http responseノード)>#c41fb0f0]]

-, etc.

***機能グループ [#eb3f6148]
-プログラミング

--switchノード~
IF文に相当する。
--commentノード~
commentを書く
--functionノード~
JavaScriptで処理を実装

-文字列処理

--changeノード~
文字列を代入/置換/削除/移動する。

--splitノード~
文字列を分割する。

--joinノード~
splitで分割した文字列を結合する。

--htmlノード~
htmlから文字を抜く。

--templateノード~
template(html等)に文字を埋める。

-通信クライアント系

--http requestノード~
HTTP/HTTPSクライアント

--emailノード~
IMAP/POP3クライアント

--feedparseノード~
RSSリーダー

***コミュニティで開発されたノード [#j5b1a8a0]
-random~
ランダムな値を生成

-bigtimer~
タイマーイベントを発生

-dashboard~
ダッシュボード(HTML)のUI

-worldmap~
地図(HTML)を出力するUI

**パターン [#m9f5424d]

***HTTPクライアント [#bbcb7002]

***HTTPリスナ [#c41fb0f0]
-HTTPは、フローエディタ(トップ・ページ)とAPI(サブ・ディレクトリ)で共用

-以下はサンプルのフロー([[コチラ>#i100cf05]]の手順で、インポート可能)
 [
     {
         "id": "f6f2187d.f17ca8",
         "type": "tab",
         "label": "Flow 1",
         "disabled": false,
         "info": ""
     },
     {
         "id": "3e63d5c0.89476a",
         "type": "http in",
         "z": "f6f2187d.f17ca8",
         "name": "HTTP Endpoint",
         "url": "hoge/:param",
         "method": "get",
         "upload": false,
         "swaggerDoc": "",
         "x": 160,
         "y": 320,
         "wires": [
             [
                 "3dcdaca5.9f0f64"
             ]
         ]
     },
     {
         "id": "7027d3d1.6d81fc",
         "type": "debug",
         "z": "f6f2187d.f17ca8",
         "name": "Debug",
         "active": true,
         "tosidebar": true,
         "console": true,
         "tostatus": true,
         "complete": "payload",
         "targetType": "msg",
         "statusVal": "payload",
         "statusType": "auto",
         "x": 420,
         "y": 260,
         "wires": []
     },
     {
         "id": "4cd59e40.9521f",
         "type": "http response",
         "z": "f6f2187d.f17ca8",
         "name": "HTTP Response",
         "statusCode": "200",
         "headers": {},
         "x": 500,
         "y": 340,
         "wires": []
     },
     {
         "id": "3dcdaca5.9f0f64",
         "type": "template",
         "z": "f6f2187d.f17ca8",
         "name": "page",
         "field": "payload",
         "fieldType": "msg",
         "format": "handlebars",
         "syntax": "mustache",
         "template": "<!DOCTYPE html>\n<html lang=”en”>\n<head>\n<title>Response Named Parameters</title>\n</head>\n<h1>Page found Named Parameters {{req.params.param}}</h1>\n</html>",
         "output": "str",
         "x": 330,
         "y": 340,
         "wires": [
             [
                 "4cd59e40.9521f",
                 "7027d3d1.6d81fc"
             ]
         ]
     }
 ]

-以下のようにアクセスして動作確認する。~
(サブ・ディレクトリが、Web APIになる。)
 http://localhost:1880/hoge/hogehoge

-参考
--HTTPエンドポイントを作成 : Node-RED~
https://cookbook.nodered.jp/http/create-an-http-endpoint
--Node-Red Web Server -HTTP-IN and HTTP Response Nodes - Steves Node-Red Guide~
https://stevesnoderedguide.com/http-in-http-response-nodes

***[[MQTT>#c99af2b6]]ブローカ [#d7d08977]
-MQTTブローカには、
--node-red-contrib-mqtt-brokerを使用する。
--受信したメッセージを使用するには「MQTT in」も必要になる。
--別のMQTTブローカにメッセージを送信するには、[[MQTTクライアント>#wc492176]]を使用する。

-以下はサンプルのフロー([[コチラ>#i100cf05]]の手順で、インポート可能)
 [
     {
         "id": "f6f2187d.f17ca8",
         "type": "tab",
         "label": "Flow 1",
         "disabled": false,
         "info": ""
     },
     {
         "id": "1d2a9951.8880c7",
         "type": "aedes broker",
         "z": "f6f2187d.f17ca8",
         "name": "",
         "mqtt_port": 1883,
         "mqtt_ws_port": "",
         "cert": "",
         "key": "",
         "certname": "",
         "keyname": "",
         "dburl": "",
         "usetls": false,
         "x": 240,
         "y": 100,
         "wires": [
             [
                 "b9d42de9.5a91f"
             ]
         ]
     },
     {
         "id": "b9d42de9.5a91f",
         "type": "debug",
         "z": "f6f2187d.f17ca8",
         "name": "",
         "active": true,
         "tosidebar": true,
         "console": true,
         "tostatus": false,
         "complete": "payload",
         "targetType": "msg",
         "statusVal": "",
         "statusType": "auto",
         "x": 450,
         "y": 100,
         "wires": []
     },
     {
         "id": "70b86e52.71106",
         "type": "mqtt in",
         "z": "f6f2187d.f17ca8",
         "name": "",
         "topic": "hoge",
         "qos": "2",
         "datatype": "auto",
         "broker": "e9b0ae32.61f46",
         "x": 210,
         "y": 160,
         "wires": [
             [
                 "ba2f427b.97b3f"
             ]
         ]
     },
     {
         "id": "ba2f427b.97b3f",
         "type": "debug",
         "z": "f6f2187d.f17ca8",
         "name": "",
         "active": true,
         "tosidebar": true,
         "console": true,
         "tostatus": false,
         "complete": "payload",
         "targetType": "msg",
         "statusVal": "",
         "statusType": "auto",
         "x": 460,
         "y": 160,
         "wires": []
     },
     {
         "id": "e9b0ae32.61f46",
         "type": "mqtt-broker",
         "name": "hoge",
         "broker": "localhost",
         "port": "1883",
         "clientid": "",
         "usetls": false,
         "compatmode": false,
         "keepalive": "60",
         "cleansession": true,
         "birthTopic": "",
         "birthQos": "0",
         "birthPayload": "",
         "closeTopic": "",
         "closeQos": "0",
         "closePayload": "",
         "willTopic": "",
         "willQos": "0",
         "willPayload": ""
     }
 ]

-[[MQTTクライアント>#wc492176]]を使用して、上記のMQTTブローカにメッセージを送信する。

***[[MQTT>#c99af2b6]]クライアント [#wc492176]
-「MQTT out」ノードを使用する。

-mosquitto_pubを使用する。
 mosquitto_pub -h localhost -p 1883 -t message -m 'hoge' -d
※ localhostの部分は、FQDN名やIPアドレスなどでもOK(当たり前だが

***[[Node-RED On Rasbian]] [#z32de00f]
IoTデバイス上で実行させるフロー

**セキュリティ [#m52b57e8]

***HTTPSの有効化 [#rc68b637]
Node.js + Expressの設定で行うことが出来る。

***エディタと管理API [#oa8fad41]
-認証
--従来は、httpAdminAuthでBasic認証をサポートしていたが、今は非推奨。
--現在は、httpAdminAuthではなく、adminAuthを使用する。
--<node-red>/user-authentication.jsにカスタムユーザ認証を追加できる。
--[[Passport>https://www.passportjs.org/]]で、OpenID/OAuthを追加できる。

-カスタム・ミドルウエア~
httpAdminMiddlewareを使用できる。

***管理APIの認可 [#da2bb084]
-/auth/tokenエンドポイントが、ROPCを実装している。
-ココで入手したaccess_tokenをAuthorization: Bearerに指定する。

***[[ダッシュボード>#q1df2e67]] [#c6e9b967]
ダッシュボードだけに適用する場合、~
node-red-dashboard自体に設定がある。

-参考
--Node-REDのダッシュボードだけにBasic認証をかけるメモ – 1ft-seabass.jp.MEMO~
https://www.1ft-seabass.jp/memo/2020/02/29/node-red-dashboard-only-basic-authentication/

***HTTP Inノード [#v321debe]
-認証
--httpNodeAuthを使用する。
--httpAdminAuthと同じ仕組み。

-CROS~
-CORS~
httpNodeCorsを使用する。

-カスタム・ミドルウエア~
httpNodeMiddlewareを使用できる。

-参考
--Node-REDのhttp inノードでBasic認証を有効にする - Qiita~
https://qiita.com/takeyan/items/19b894197d30b65626c5
--Node-RED の http-in ノードに~
Basic 認証をかける : まだプログラマーですが何か?~
http://dotnsf.blog.jp/archives/1072144184.html

***その他 [#c08f2839]
-httpStaticAuth~
静的コンテンツに対する認証。

***参考 [#j1a2c737]

-Node-RED日本ユーザ会
--認証~
https://nodered.jp/docs/api/admin/oauth
--セキュリティ~
https://nodered.jp/docs/user-guide/runtime/securing-node-red

*参考 [#k91a47ac]
-Node-RED - Wikipedia~
https://en.wikipedia.org/wiki/Node-RED

-Steves Node-Red Guide~
https://stevesnoderedguide.com/

-IoTアプリ開発をノンコーディングで!~
Node-REDはこう活用しよう【デブサミ2019】 (1/2):CodeZine(コードジン)~
https://codezine.jp/article/detail/11416

-Node-REDがつなぐ技術と人 〜~
Node-RED Con Tokyo 2019レポート | さくらのナレッジ~
https://knowledge.sakura.ad.jp/22342/

-書籍:Raspberry Pi 3でつくる IoTプログラミング~
https://book.mynavi.jp/ec/products/detail/id=64776

**Node-RED [#dc631c34]
https://nodered.org/

-Node-RED日本ユーザ会~
https://nodered.jp/

-Dockerで実行する : Node-RED日本ユーザ会~
https://nodered.jp/docs/getting-started/docker

**MQTT [#c99af2b6]
-[[IoT関連の通信プロトコル - マイクロソフト系技術情報 Wiki > MQTT>https://techinfoofmicrosofttech.osscons.jp/index.php?IoT%E9%96%A2%E9%80%A3%E3%81%AE%E9%80%9A%E4%BF%A1%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB#feb265c9]]

-1分でIoT環境を構築!Node-RED上でMQTTブローカを立ち上げる手順 - Qiita~
https://qiita.com/zuhito/items/d8ac0f602e0f09b02eac

-MeshbluでオープンソースのIoTをはじめよう~
Part5: RESTとMQTTのメッセージングとデータ保存 | masato's blog~
http://masato.github.io/2015/07/17/meshblu-compose-curl-mqtt-test/

**Qiita [#l3ffae29]
-Node-RED事始め~
https://qiita.com/joeartsea/items/93e8483a31292067c654

-動かして理解するDockerでのNode-RED環境構築~
https://qiita.com/KMiura95/items/b399be0358b003f4e53e

-目からウロコ!Node-REDの

--デザインパターン10選~
https://qiita.com/zuhito/items/e9abfd6f1ba188f908ed
--アンチパターン10選~
https://qiita.com/zuhito/items/442a8b99c597150f8472

-Node-RED Advent Calendar
--2015~
https://qiita.com/advent-calendar/2015/nodered
--2016~
https://qiita.com/advent-calendar/2016/nodered
--2017~
https://qiita.com/advent-calendar/2017/nodered
--2018~
https://qiita.com/advent-calendar/2018/nodered

-Node-REDが動作するコンテナをビルドして Kubernetes で実行するまでを解説
--(1/3)~
https://qiita.com/MahoTakara/items/86c0d1072d1cd34187d5
--(2/3)~
https://qiita.com/MahoTakara/items/605b1e32ddf22fb7b910
--(3/3)~
https://qiita.com/MahoTakara/items/8cfa4d0be22277869084
--(番外編)~
https://qiita.com/MahoTakara/items/2529c4a66519fb459e5d

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS