京急の運行情報をESP8266で取得する
京急を愛してやまない。めったに遅延することがない安定感は素晴らしいものがあります。それ故に、たまに遅延すると結構面食らってしまうことも。
前回は、Pythonでスクリプトを書きました。カンがいい人はわかると思いますが、Raspberry Piで動かすことを想定しています。
今回は、ESP8266をArduino IDEでコーディングして、情報を取得してみます。
コーディングします
#include <ESP8266WiFi.h> #include <WiFiClient.h> char ssid[] = "xxxxxxxx"; char password[] = "xxxxxxx"; char unkopage[] = "unkou.keikyu.co.jp"; int led = 2; void setup() { pinMode(led, OUTPUT); digitalWrite(led, LOW); Serial.begin(115200); Serial.println(""); connectWifi(); } void loop() { String result = getPageSource(); if (result.indexOf("unko-panel") < 0) { Serial.println("取得エラー"); } else if (result.indexOf("平常") < 0) { Serial.println("遅延してるかもしれません"); } else { Serial.println("平常通り運転してます"); } delay(30*60*1000); } void connectWifi() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); blinkLed(1000); } Serial.println("connected!"); } String getPageSource() { WiFiClient client; if ( !client.connect(unkopage, 80) ) { return String(""); } client.print(String("GET ") + "/" + " HTTP/1.1\r\n" + "Host: " + unkopage + "\r\n" + "Range: bytes=8000-9000\r\n" + "Connection: close\r\n\r\n"); client.println(); delay(1000); String body = ""; while (client.available()) { body += client.readStringUntil('\r'); } return body; } void blinkLed(int msec) { int totalTime = 0; while (totalTime < msec) { digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(100); totalTime += 200; } }
最初に呼ばれるsetup()
でWi-Fiの接続をします。ESP8266WiFi.h
だと接続もかなり簡単です。
Range: bytes=8000-9000
と設定しているのは、APによってはパケットがロスしてしまうようで(笑) HTMLのソースのうち、運行情報が書かれている場所だけをピンポイントで狙って取得します。
ja.stackoverflow.com
unko-panel
というdivタグ内に運行情報が書かれています。そもそもunko-panel
が見つけられなかったら失敗、unko-panel
内に平常
というStringが含まれていたら平常通り運転しているとみなし、なければ何かが起こっていると判断します。
実装完了
シリアルモニターに運行情報が表示されます。(キャプチャし忘れました) 取得した情報を元に、LEDを光らせたりすると夢が広がります。
Learning Esp8266: Build the Internet of Things With the Arduino Ide and Raspberry Pi