②ローカルSTA接続
前の①アクセスポイント(AP)接続では、ESPr Developer自身はアクセスポイントとして、子機の接続を待ち受けました。ローカルSTA接続はESPr Developerが子機としてWiFiルーター等のアクセスポイントに接続し、中継点として、他の子機とローカルネットワーク内で接続する方法とします。(不適切な表現が多々あるかと思いますが、ご容赦願います。)
(1)配線接続とプログラム実行結果
アクセスポイント(AP)接続と基本的に変更はありません。アクセスポイント(AP)接続のページでご確認下さい。
部屋の中で確認していますので、アクセスポイント(AP)を経由する利点をあまり実感できていませんが、もう少し広範囲のローカルネットワークを構築する際などに有効になるのだろうと思って実験しています。
(2)IPアドレス設定
ローカルSTA接続の場合、WiFiルーター接続時にDHCP機能によってIPアドレスが自動的に割り当てられますが、このIPアドレスは必ずしも毎回同じではありません。ArduinoIDEのシリアルモニタ等でもIPアドレスを確認できますが、毎回確認する必要がない様にするため以下の対策があるようです。下表のNo1はとりあえず断念しました。No2,No3の選択ですが、No2は可能性として先に他機器に割り当てされているケースも考えられ、No3は特に問題もなさそうなので、とりあえずNo3を採用します。
| 1 | mDNS 名前接続 |
DNSサーバーを持たず、ローカルネットワーク内で対応可能な機器が応答し、IPアドレスを知らせてくれる機能とのこと。ArduinoIDEにも「mDNS_Web_Server」等のサンプルスケッチがあり、セキュレティ・WiFiルータ設定などアラートが発生し四苦八苦しながら、一度は名前接続確認しましたが、再現出来ず面倒になって保留しました。 |
| 2 | IPアドレス 指定 |
プログラムでSTA接続後、下記によりIPアドレスを指定できるという記事を見つけ、実際にできることを確認しました。他にもIPアドレス設定方法はありましたが、ゲートウェイ,サブネットマスク指定が必要でした。下記はIPアドレスのみで良い様です。 WiFi.config(IPAddress(***,***,**,*)),WiFi.gatewayIP(),WiFi.subnetMask()); |
| 3 | WiFi ルータ指定 |
今回、アクセスポイントとして接続するWiFiルータ(BUFFALO , WSR-2533DHP2)側でMACアドレス毎にIPアドレス指定できることを確認しました。 →特定の端末に同じIPアドレスを割り当てる方法 |
(3)プログラム
プログラム内容の大きな変更はありません。アクセスポイント接続では、ESPr Developer自身のアクセスポイントしてのSSID、パスワードを設定していましたが、STA接続では子機として、WiFiルーター等のアクセスポイントに接続する時のSSID、パスワードを設定します。他に 対象外のハンドルを受け取った場合の処置など追加していますが、基本箇所は大きく変わりません。
尚、WiFi接続 SSID、パスワードはWiFiルーター本体の取り扱い説明書、本体ラベル等でご確認下さい。
→参考:http://faq.buffalo.jp/app/answers/detail/a_id/15271
// ライブラリの呼び込み
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
const char* ssid = "アクセスポイント SSID"; // 接続するアクセスポイントのSSID
const char* password = "アクセスポイントパスワード"; // 接続するアクセスポイントのパスワード
ESP8266WebServer server(80); // WEBサーバーポート(80番)
const int led = 13; // LED用出力端子番号
/* ブラウザに表示するボタンなど html でString form = に続いて表記 */
// LEDオフ時のHTML
String form_off ="<html><head><meta name=viewport content=width=100></head>"
"<p>SW OFF</p>"
"<form action=ON><input type='submit' value='ON' style='background-color:khaki; color:white;'></form>"
"<form action=OF><input type='submit' value='OFF' style='background-color:blue; color:white;'></form>"
"</html>";
// LEDオン時のHTML
String form_on ="<html><head><meta name=viewport content=width=100></head>"
"<p>SW ON</p>"
"<form action=ON><input type='submit' value='ON' style='background-color:red; color:yellow;'></form>"
"<form action=OF><input type='submit' value='OFF' style='background-color:lightgray; color:gray;'></form>"
"</html>";
// 初回送信(LEDオフ時のHTML送信)
void handleRoot() {
digitalWrite(led, 0);
server.send(200, "text/html",form_off);
Serial.println("OFF");
}
// LEDオン時のHTML送信
void LedOn(){
digitalWrite(led, 1);
server.send(200, "text/html", form_on);
Serial.println("ON");
}
// LEDオフ時のHTML送信
void LedOff(){
digitalWrite(led, 0);
server.send(200, "text/html", form_off);
Serial.println("OFF");
}
// 対象外のハンドルを受け取った場合
void handleNotFound(){
digitalWrite(led, 1);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, 0);
}
// 初回設定
void setup(void){
pinMode(led, OUTPUT); // 13pinを出力に設定
digitalWrite(led, 0); // 13pin出力OFF
delay(500); // 0.5秒遅延
Serial.begin(115200); // シリアルモニタ出力速度設定
Serial.println(""); // シリアルモニタ改行
WiFi.begin(ssid, password); // SSID,パスワードを指定してアクセスポイント接続
// 接続状態確認
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// IP アドレスをプログラム側で設定する場合
// WiFi.config(IPAddress(192,168,0,99),WiFi.gatewayIP(),WiFi.subnetMask());
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// mDNS機能開始 ※保留(接続確認できない為)
//if (MDNS.begin("esp8266")) {
// Serial.println("MDNS responder started");
//}
server.on("/", handleRoot);
server.on("/inline", [](){ server.send(200, "text/plain", "this works as well"); });
server.on("/ON", LedOn);
server.on("/OF", LedOff);
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
//MDNS.addService("http", "tcp", 80);
}
// 連続処理(監視開始)
void loop(void){
server.handleClient();
}
以上が、ローカルSTA接続についてです。