meideru blog

家電メーカーで働いているmeideruのブログです。主に技術系・ガジェット系の話を書いています。

簡単すぎて神。ESP-WROOM-02でHTTP通信をやってみた

      2019/11/10

IoT

世間では「IoT(Internet of Things)」というワードが話題になっています。

IoTとは、ありとあらゆるものがインターネットにつながる仕組みのことです。

今日はIoTに関する記事です。

ESP-WROOM-02の開発ボードのWi-Fi機能を試しに使ってみました。

ESP-WROOM-02とは

ESP-WROOM-02は、Arduinoと互換を持つマイコンを搭載したWi-Fiモジュールです。

ESP-WROOM-02の開発ボード
ESP-WROOM-02の開発ボード

マイコンなので当然、GPIOを搭載しています。

ということは、このWi-Fiモジュールに直接、センサなどをつげて、そこから得た情報をネットワーク経由でどこかに飛ばせちゃうというわけです。

こんな便利な電子部品はないですよねw

プログラムの書き込みはArduino IDEから行うことができます。

TCPやUDP、HTTPといったプロトコルのライブラリも用意されているので、簡単にネットワークプログラミングを行うことができます。

HTTP通信でPOSTを試してみた

HTTP通信でPOSTを試してみました。

全体的な流れは、ESP-WROOM-02がシリアル通信で受け取った文字列をサーバにPOSTして、サーバ側は受け取った文字列をターミナルに表示します。

サーバサイドはPythonで書きました。いわゆるREST APIを提供する感じになっています。

ESP-WROOM-02のプログラム

ESP-WROOM-02(クライアント)のプログラムです。

ssidとpasswordとhostは個人情報のため伏字にしてあります。

書き込みはArduino IDEから行えるので、とても簡単です。色々なサイトで紹介されているのでググってみてください。

#include <ESP8266WiFi.h>

#define IMG_BUF 4096

// Wi-Fi(5GHzには非対応)
const char* ssid     = "XXXX";
const char* password = "XXXX";

// Server
const char* host   = "XXX.XXX.XXX.XXX";
const int httpPort = 80;
const char* path   = "/";

WiFiClient client;
char buf[IMG_BUF];

void setup() {
  Serial.begin(115200);

  // WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFiに接続しました。");
  Serial.print( "IPアドレス: ");
  Serial.println( WiFi.localIP());
  Serial.print( "ゲートウェイ: ");
  Serial.println(WiFi.gatewayIP());
  Serial.print( "サブネットマスク: ");
  Serial.println(WiFi.subnetMask());
}

void loop() {
  int length = Serial.readBytes(buf, sizeof(buf));
  
  if (length) {
    Serial.println("送信準備中");
    if (!client.connect(host, httpPort)) {
      Serial.println("接続に失敗しました。");
      return;
    }

    String body = buf;
    client.print(String("POST ") + path + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Content-Length:" + String(length) + "\r\n" +
                 "Connection: close\r\n\r\n" +
                 body);

    unsigned long timeout = millis();
    while (client.available() == 0) {
      if (millis() - timeout > 10000) {
        Serial.println(">>> タイムアウトしました。");
        client.stop();
        return;
      }
    }

    Serial.println("--------------------");
    while (client.available()) {
      char c = client.read();
      Serial.print(c);
    }
    Serial.println("");
    Serial.println("--------------------");
  }
}

 

サーバーサイドの作業

以下はPythonで書いたサーバサイドのプログラムです。

POSTを受信すると、受けとった文字列をターミナルに表示するようになっています。

import sys
from http.server import BaseHTTPRequestHandler, HTTPServer

class Client(BaseHTTPRequestHandler):

	def do_POST(self):
		content_len = int(self.headers.get('content-length'))
		body = b'OK'
		self.send_response(200)
		self.send_header('Content-type', 'text/plain')
		self.send_header('Content-length', len(body))
		self.end_headers()
		self.wfile.write(body)
		requestBody = self.rfile.read(content_len).decode('ascii')
		print("length = " + str(content_len))
		print("body = " + requestBody)

server = HTTPServer(('', 80), Client)
server.serve_forever()

結果

“hello”と送信してみました。以下が実験結果です。

ESP-WROOM-02のシリアルモニタ

Arduino IDEのシリアルモニタからhelloと送信しました。

 

ESP-WROOM-02のテストサーバサイドのターミナルからhelloを確認できましたね!

成功です!

まとめ

いかがでしたでしょうか?

今回はクライアント側でHTTP通信によるPOST、サーバ側でREST APIを提供するようなパターンのプログラムを試しました。

このパターンを応用すれば、色々なIoTガジェットを作れることに気づきましたか?

例えば、温度センサをつないで遠く離れた場所の気温を取得するとか。

あるいはドアにセンサをつけて誰かが出入りするたびにLINEに通知が飛んでくるようにしたりとか。(この場合はLINE APIも絡んでくる)

とにかく無限に応用できます!

私も何か作ってみようと思います!

 

PS

下記は、ESP-WROOM-02を使って作ってみました。使い方の例として、参考になると思いますので、良ければご覧ください (^o^)

社会人になって一人暮らしを始めました。留守中、知らない人が家に出入りしているのではないかと心配になることがあります。そんな問題を解決するために、ESP-WROOM-02を用いてとあるデバイスを開発しました。ドアの開閉を検知してLINEに通知を送ってくれるデバイス...

 - 技術系