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と、割り込み的に発生するリクエストの処理は本質的に相性が悪い気がする…。