Androidのメモとか

そふとうぇあえんじにゃーの備忘録

京急の運行情報をESP8266(ESPr Developer)に取得させる(unko.ino)

京急の運行情報をESP8266で取得する

京急を愛してやまない。めったに遅延することがない安定感は素晴らしいものがあります。それ故に、たまに遅延すると結構面食らってしまうことも。

unkou.keikyu.co.jp

前回は、Pythonスクリプトを書きました。カンがいい人はわかると思いますが、Raspberry Piで動かすことを想定しています。

relativelayout.hatenablog.com

今回は、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

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。