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

世間では「IoT(Internet of Things)」というワードが話題になっています。
IoTとは、ありとあらゆるものがインターネットにつながる仕組みのことです。
今日はIoTに関する記事です。
ESP-WROOM-02の開発ボードのWi-Fi機能を試しに使ってみました。
目次
スポンサーリンク
ESP-WROOM-02とは
ESP-WROOM-02は、Arduinoと互換を持つマイコンを搭載したWi-Fiモジュールです。


マイコンなので当然、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”と送信してみました。以下が実験結果です。

Arduino IDEのシリアルモニタからhelloと送信しました。
サーバサイドのターミナルからhelloを確認できましたね!
成功です!
まとめ
いかがでしたでしょうか?
今回はクライアント側でHTTP通信によるPOST、サーバ側でREST APIを提供するようなパターンのプログラムを試しました。
このパターンを応用すれば、色々なIoTガジェットを作れることに気づきましたか?
例えば、温度センサをつないで遠く離れた場所の気温を取得するとか。
あるいはドアにセンサをつけて誰かが出入りするたびにLINEに通知が飛んでくるようにしたりとか。(この場合はLINE APIも絡んでくる)
とにかく無限に応用できます!
私も何か作ってみようと思います!
PS
下記は、ESP-WROOM-02を使って作ってみました。使い方の例として、参考になると思いますので、良ければご覧ください (^o^)

スポンサーリンク
関連記事