簡単すぎて神。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^)

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