M5Stack Core2をFTPサーバとし、SDカードのファイルを対象として動作させます。FTPクライアントには「FileZilla」を使用(他のFTPクライアントだと再調整が必要かもしれません)し、「PlatformIO」で開発します。
FTPサーバの作成
次のようにFTPサーバ「FtpTest」を作成します。
main.cpp
#include <M5Core2.h> #include <WiFi.h> #include <WiFiClient.h> #include "ESP32FtpServer.h" const char *ssid = "xxxxx"; const char *password = "xxxxx"; FtpServer ftpSrv; void setup(void) { M5.begin(); Serial.begin(115200); WiFi.begin(ssid, password); Serial.println(""); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); ftpSrv.begin("esp8266", "esp8266"); } void loop(void) { ftpSrv.handleFTP(); }
「ESP32FtpServer.cpp」と「ESP32FtpServer.h」は「lovyan03/M5Stack_LovyanLauncher」から取得し、次のように変更しました。
- 1-11行目にインクルードファイルを示します。M5Stack Core2用のインクルードファイルを使用します。
- 13行目でデバッグ文を有効にします。
- 50行目を無効にします。有効にするとファイル名の第一文字が削除されます。
ESP32FtpServer.cpp
#include <M5Core2.h> #include "ESP32FtpServer.h" #include <WiFi.h> #include <WiFiClient.h> //#include <ESP32WebServer.h> #include <FS.h> //#include <SD.h> //#include <SPIFFS.h> //#include <SPI.h> #include <string> #define FTP_DEBUG WiFiServer ftpServer(FTP_CTRL_PORT); WiFiServer dataServer(FTP_DATA_PORT_PASV); ・・・ // // MLSD - Listing for Machine Processing (see RFC 3659) // else if (!strcmp(command, "MLSD")) { if (!dataConnect()) client.println("425 No data connection MLSD"); else { client.println("150 Accepted data connection"); uint16_t nm = 0; // Dir dir= fs().openDir(cwdName); File dir = fs().open(cwdName); // if(!fs().exists(cwdName)) if ((!dir) || (!dir.isDirectory())) client.println("550 Can't open directory " + String(cwdName)); // client.println( "550 Can't open directory " +String(parameters) ); else { int len = strlen(cwdName); if (len > 1) len += 1; // while( dir.next()) File file = dir.openNextFile(); // while( dir.openNextFile()) while (file) { String fn, fs; fn = file.name(); Serial.println("File Name1 = " + fn); // fn = fn.substring(len); // Serial.println("File Name2 = " + fn); fs = String(file.size()); if (file.isDirectory()) { data.println("Type=dir;Size=" + fs + ";" + "modify=20000101000000;" + " " + fn); // data.println( "Type=dir;modify=20000101000000; " + fn); } else { // data.println( "Type=file;Size=" + fs + ";"+"modify=20000101160656;" +" " + fn); data.println("Type=file;Size=" + fs + ";" + "modify=20000101000000;" + " " + fn); } nm++; file = dir.openNextFile(); } client.println("226-options: -a -l"); client.println("226 " + String(nm) + " matches total"); } data.stop(); } }
FTPサーバの実行
FTPサーバ「FtpTest」を実行すると、シリアルモニタにFTPサーバのIPアドレス「IP address: 192.168.10.110」が表示されるので、 このIPアドレスにより「FileZilla」でアクセスします。FTPのIDとパスワードはとも「esp8266」です。「FileZilla」からFTPサーバをアクセスすると、「FileZilla」は次にように表示します(ダウンロード実行後の表示になっています)。
FTPサーバ「FtpTest」を実行すると、シリアルモニタに次のメッセージが表示されます(「Ftp server waiting for connection on port 21」まで)。
「FileZilla」でアクセスすると、次のように上部ウインドウに表示され、上で示したシリアルモニタの表示に「Client connected!」からのメッセージが表示されます。
SDカードに保存されているファイル「abclldef.txt」をダウンロードします。「FileZilla」からダウンロードすると「FileZilla」で次のメッセージが表示されます。いったんサーバから切断して遅延を行い再接続されます(理由は分かりませんが必ず起こります)。
ダウンロード時のシリアルモニタの表示を次に示します。