Arduino の ESP8266をwebサーバーでSDカードのファイルを返す
今回の修正はSDカード内のindex.htmをクライアントに返すための修正です。
機能説明を目的として最小限の動作のみのコードのためエラー処理や汎用的な処理はしていません。実際に使用するときはSDWebServerスケッチなどを参考にしてください。
SDカードにアクセスできるように include 追加
#include <SPI.h>
#include <SD.h>
SDの有無を示すstatic変数追加
static bool hasSD = false;
SDからファイルを読み出す関数追加
bool loadFromSdCard(String path) {
String dataType = "text/html";
File dataFile = SD.open(path.c_str());
if (dataFile.isDirectory()) {
path += "/index.htm";
dataFile = SD.open(path.c_str());
}
if (!dataFile) return false;
server.sendHeader("Content-Length",String(dataFile.size()));
server.sendHeader("Connection","close");
server.sendHeader("Access-Control-Allow-Origin","*");
server.send(200, dataType.c_str(), "");
WiFiClient client = server.client();
size_t totalSize = dataFile.size();
client.write(dataFile, HTTP_DOWNLOAD_UNIT_SIZE);
dataFile.close();
return true;
}
onNotFound_()に1行追加
void onNotFound_() {
if(hasSD && loadFromSdCard(server.uri())) return;
setup()にSDのイニシャライズ追加
void setup() {
if (SD.begin(4)) {
hasSD = true;
}
setup()のserver.on()のコメントアウト
// server.on("/",onRoot);
// server.on("/index.htm",onRoot);
// server.on("/index.html",onRoot);
server.onNotFound(onNotFound_);
server.begin();
}
これでブラウザからhttp://192.168.0.99/にアクセスするとSDカードのルートのindex.htmgが表示される。
以上の追加した全コードは以下の通りです。
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <SPI.h>
#include <SD.h>
#include "myssid.h"
ESP8266WebServer server(80);
static bool hasSD = false;
void onRoot() {
String msg = "<html><head><title>ESP8266WebSerber</title></head><body><h1>Hello</h1></body></html>";
server.send(200,"text/html",msg);
}
bool loadFromSdCard(String path) {
String dataType = "text/html";
File dataFile = SD.open(path.c_str());
if (dataFile.isDirectory()) {
path += "/index.htm";
dataFile = SD.open(path.c_str());
}
if (!dataFile) return false;
server.sendHeader("Content-Length",String(dataFile.size()));
server.sendHeader("Connection","close");
server.sendHeader("Access-Control-Allow-Origin","*");
server.send(200, dataType.c_str(), "");
WiFiClient client = server.client();
size_t totalSize = dataFile.size();
client.write(dataFile, HTTP_DOWNLOAD_UNIT_SIZE);
dataFile.close();
return true;
}
void onNotFound_() {
if(hasSD && loadFromSdCard(server.uri())) return;
String message = "Not Detected\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 += " NAME:" + server.argName(i) + "\n VALUE:" + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void setup() {
Serial.begin(115200);
delay(100);
Serial.println("");
pinMode(5, OUTPUT); // オリジナルは13だがテスト環境の都合で5に変えてある。
if (SD.begin(4)) {
hasSD = true;
}
WiFi.mode(WIFI_STA);
WiFi.begin(mySSID, myPASSWORD);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
WiFi.config(IPAddress(192, 168, 0, 99), WiFi.gatewayIP(), WiFi.subnetMask());
Serial.println("");
Serial.print(WiFi.localIP());
// server.on("/",onRoot);
// server.on("/index.htm",onRoot);
// server.on("/index.html",onRoot);
server.onNotFound(onNotFound_);
server.begin();
}
void loop() {
server.handleClient();
}