WROOM 02(ESP8266)でソケットサーバを建てる

Table of Contents

がいよう

WROOM02は650円で買える結構ハイスペなWiFi内蔵マイコンモジュール。
http://akizukidenshi.com/catalog/g/gK-09758/
こいつで宅内のWiFiに接続し、ローカルネットワーク内に固定IPのサーバーを建てる話。
オリジナルのソースを読めば一発で分かる話だが、備忘録として残す。
やってる事は「TCPソケットでメッセージを受ける」だけで、想定としてはネットワークにぶら下がったPC等から自作デバイス(WROOM02)を操作するみたいな感じだ。

ぜんぶん

#include <ESP8266WiFi.h>

/**************************/
/*wifi static configration*/
/**************************/
char ssid[] = "WiFiのSSID";
char pass[] = "WiFiのパスワード";
IPAddress ip(192, 168, 1, 111);
IPAddress gateway(192,168,1,255);
IPAddress subnet(255,255,255,0);
WiFiServer server(11111); //port

/////////////////
const int led = 2; //status led pin

void beginConnect() {
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
  }
  server.begin();
  digitalWrite(led, HIGH);
}

/************************/
/***  main functions  ***/
/************************/
void setup() {
  pinMode(led, OUTPUT);
  WiFi.config(ip,gateway,subnet);

  //use for debug
  Serial.begin(115200);
  Serial.println("\nbegin");
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    WiFiClient c = server.available();
    if (c) {
      while(c.connected()){
        if(c.available()){
          char str[64]={0};
          c.read((uint8_t*)str,63);
          Serial.println(str);
        }
      }
    }
  }
  else {
    beginConnect();
  }
}

かいせつ

Wroom02のWiFiライブラリは、ArduinoオリジナルのWiFiクラスに概ね準拠している。
そのためArduino公式のリファレンスを見ればサンプルとしては十分機能する。
https://www.arduino.cc/en/Reference/WiFi

躓きポイントとして、WiFi.config(ip,gateway,subnet);がある。
オリジナルではWiFi.config(ip);のみで動作するが、WROOM02ではgatewayとsubnetを省略出来ない仕様である。
それさえ指定してやれば固定IPでネットワークにぶら下げられる。

またこれは本家ライブラリの躓きポイントなんだが、loop()内でネットワークのリクエストを捌く仕様上、while(c.connected())で処理を固める必要がある。
whileを活用しないとブロックを抜けてしまい、コネクションが即座に断たれてしまう。
…loop関数の存在が前提のArduinoと、割り込み的に発生するリクエストの処理は本質的に相性が悪い気がする…。

カテゴリー: IT, 電子工作 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です