「[[.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