« Arduino の ESP8266をwebサーバーで定義以外のファイルが指定され場合の処理 | トップページ | ESP8266 にリアルタイムクロック DS3231 を接続する »

2015年8月12日 (水)

Arduino の ESP8266をwebサーバーでSDカードのファイルを返す

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();
}

« Arduino の ESP8266をwebサーバーで定義以外のファイルが指定され場合の処理 | トップページ | ESP8266 にリアルタイムクロック DS3231 を接続する »

Arduino」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/569662/62041154

この記事へのトラックバック一覧です: Arduino の ESP8266をwebサーバーでSDカードのファイルを返す:

« Arduino の ESP8266をwebサーバーで定義以外のファイルが指定され場合の処理 | トップページ | ESP8266 にリアルタイムクロック DS3231 を接続する »