ESP32に大きなファイルを渡したい場合に、ESP32内にFTPサーバとして立ち上げておけば、Windowsのエクスプローラからアップロードやダウンロードが楽になります。
ソースコードをGitHubに上げておきました。
poruruba/SimpleEsp32FtpServer
シンプルなESP32用FTPサーバ
ESP32内にFTPサーバを立ち上げますが、非常にシンプルなものにしています。
・1つのファイルしか保持できません。
・フォルダは作れません。
・揮発なので、リブートすると消えます。
・Windowsのエクスプローラしか試していません。
※WinSCPで試してみましたが、ファイルを直接編集しようとしたときだけ、ソケットを多重で開こうとして切断されてしまいました。
以下の方が作られたものをほぼそのまま使っています。(ありがとうございました!)
SDを前提としていましたが、上記の通り非常にシンプルにして、メモリだけで実現するようにしています。
robo8080/ESP32_FTPServer_SD
使い方
#include "ESP32FtpServer.h"
FtpServer ftpSrv;
WiFiに接続した後に、
configTzTime("JST-9", "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
ftpSrv.begin("esp32","esp32", buffer, sizeof(buffer));
ポイントは以下のところです。
void begin(String uname, String pword, unsigned char *p_buffer, unsigned long length);
受け付けるユーザ名、パスワードに加えて、FTPで送受信するデータのバッファと最大サイズを指定しています。
あとは、loop()の中で、
FTP_F_STATUS status = ftpSrv.handleFTP(); //make sure in loop you call handleFTP()!!
if( status != F_IDLE ){
Serial.print("status="); Serial.println(status); Serial.println(ftpSrv.file_name); Serial.println((char*)buffer);
}
FTP_F_STATUS は、以下の種類があります。
・F_IDLE:特に変化なし
・F_RETRIEVED:ファイルが取得された
・F_STORED:ファイルの受信完了
・F_DELETED:ファイルが削除された
・F_RENAMED:ファイル名が変更された
上記の状態となったときに、任意の処理ができるようにしています。
また、FTPクライアント側にファイルを渡したい時には以下を呼び出します。
beginで指定したバッファに、返したいデータを設定した後に呼び出します。
void setFile(const char *fname, unsigned long size);
Windowsのエクスプローラで開く
Windowsのエクスプローラのアドレスバーに以下を入力すれば、接続できます。
ftp://ユーザ名:パスワード@IPアドレス/
ユーザ名とパスワードは、ftpSrv.begin()に指定したものです。
IPアドレスは、ESP32のIPアドレスです。
終わりに
ちょっと不安定かな。。。
以上