LoginSignup
192
91

More than 3 years have passed since last update.

Node-REDでシェアハウスのお風呂を爆速でハッキングする方法

Last updated at Posted at 2019-05-12

こんにちわ。
れとるときゃりー(@retoruto_carry)です。よろしくね。

なにをしたか

お風呂とリビングが違う階にあって、いちいち空いているか見に行くのがめんどくさかった。
リビングからお風呂の使用状況を確認できるものを作った。


Image

方針

ESPr developerというarduinoのwifi付きバージョンみたいなものを使う。2000円くらいで買える。
image.png

同じシェアハウスの住人がいろんなドアにセンサーを設置していて、ElasticsearchのAPIをすでに作ってくれていた(神すぎる)。
Image
ただ、スマホでブラウザからしか見れなかったので、このAPIをESPr developerから叩いてLEDを光らせるようにした。

ESPr Developerのmacでの環境構築

これを参考にした。すんなりうまく行った。
ESPr Developer (ESP-WROOM-02開発ボード) の開発環境を整えてみる - Androidのメモとか

node-redでAPIをブリッジする

httpsのbasic認証でPOSTリクエストを投げて、返ってきたJSONをパースしたい。
これをESPr Developer側で処理しても良いが、いろいろと面倒なので、APIとESPr Developerの間に、もう一つブリッジ用のAPIを立てた。

image.png

このブリッジ用のAPIのすること

  • Basic認証を通して、httpsをhttpにする
  • JSONパースして取り出して返す。

ブリッジ用のAPIを立てるのに、node-redを使った。

node-redはnode.jsをブロックを組み合わせるようにプログラミングできるツール。


npm install -g node-red #インストール
node-red #実行

こんな感じに作った。

Image

詳しく説明していく。

GETされるときのエントリーポイント

image.png

ElasticsearchにPOSTするデータを用意

image.png

ElasticsearchにPOST

Basic認証も通している
image.png

ElasticsearchにPOSTした結果のJSONをパース

image.png

初めてnode-red使ったけど、超簡単で楽しい。
なんで今まで知らなかったんだろう。

ちなみに後から知ったけど、
https://<ID>:<PASS>@example.com/api みたいにしてbasic認証できるっぽい。
参考: https://qiita.com/ngkazu/items/6da021edf177f40e1f26

WIFIにつないでHTTP GETする

サンプル例のESP8266 -> BasicHttpClientを利用した。ほどんどコピペ。数行変えたくらい。

/**
  * BasicHTTPClient.ino
  *
  *  Created on: 24.05.2015
  *
  */

 #include <Arduino.h>

 #include <ESP8266WiFi.h>
 #include <ESP8266WiFiMulti.h>

 #include <ESP8266HTTPClient.h>

 #define USE_SERIAL Serial

 ESP8266WiFiMulti WiFiMulti;

 String endpoint = "http://127.0.0.1:1880/bath";

 int red_led_pin = 4;
 int blue_led_pin = 2;

 void setup() {

     pinMode(red_led_pin, OUTPUT);
     pinMode(blue_led_pin, OUTPUT);

     USE_SERIAL.begin(115200);
    // USE_SERIAL.setDebugOutput(true);

     USE_SERIAL.println();
     USE_SERIAL.println();
     USE_SERIAL.println();

     for(uint8_t t = 4; t > 0; t--) {
         USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
         USE_SERIAL.flush();
         delay(1000);
     }

     WiFi.mode(WIFI_STA);
     WiFiMulti.addAP("SSID", "PASSWORD");

 }

 void loop() {
     // wait for WiFi connection
     if((WiFiMulti.run() == WL_CONNECTED)) {

         HTTPClient http;

         USE_SERIAL.print("[HTTP] begin...\n");
         // configure traged server and url
         http.begin(endpoint); //HTTP

         USE_SERIAL.print("[HTTP] GET...\n");
         // start connection and send HTTP header
         int httpCode = http.GET();

         // httpCode will be negative on error
         if(httpCode > 0) {
             // HTTP header has been send and Server response header has been handled
             USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

             // file found at server
             if(httpCode == HTTP_CODE_OK) {
                 String payload = http.getString();
                 USE_SERIAL.println(payload);
                 if (payload == "0") {
                   digitalWrite(blue_led_pin, HIGH);
                   digitalWrite(red_led_pin, LOW);
                 } else if (payload == "1") {
                   digitalWrite(red_led_pin, HIGH);
                   digitalWrite(blue_led_pin, LOW);
                 }
             }
         } else {
             USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
         }

         http.end();
     }

     delay(20000);
 }

Image

できた🎉🎉

Image

まとめ

node-redを使って、JSONのパースなどの複雑な処理をブリッジ用API側で行ったことで、ESPr Developer側の処理をとても単純なものに落とすことができた。

このようにIoTでは、ネットワーク側の潤沢なリソースを使い、デバイス側の処理を単純なものにすることができる。

あと、node-redは思ったより簡単!楽しい!

ここまで読んでくれた方へ

ここまで読んでくださりありがとうございます。

いいねやコメント、SNSでの共有等をしてくださると、今後の励みになります。よろしくお願いします。

良かったらツイッター(@retoruto_carry)もフォローしてね

こっちの記事も書いたので、よかったら読んでください〜
webサービスの本番サーバーをダウンさせてしまった時に爆速で土下座する方法

192
91
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
192
91