Edited at

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

こんにちわ。

れとるときゃりー(@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サービスの本番サーバーをダウンさせてしまった時に爆速で土下座する方法