#include
<ESP8266WiFi.h>
#include
<SD.h>
#include
<LittleFS.h>
#include
<SimpleFTPServer.h>
const
char
*
ssid
=
"<YOUR-SSID>"
;
const
char
*
password
=
"<YOUR-PASSWD>"
;
FtpServer ftpSrv;
bool isFirmwareUploaded
=
false
;
bool isFilesystemUploaded
=
false
;
void
progressCallBack(size_t currSize, size_t totalSize) {
Serial.printf(
"CALLBACK: Update process at %d of %d bytes...\n"
, currSize, totalSize);
}
#define
FIRMWARE_VERSION
0.2
String FILESYSTEM_VERSION
=
"0.0"
;
void
_callback(FtpOperation ftpOperation,
unsigned
int
freeSpace,
unsigned
int
totalSpace){
switch
(ftpOperation) {
case
FTP_CONNECT:
Serial.println
(F(
"FTP: Connected!"
));
break
;
case
FTP_DISCONNECT:
Serial.println
(F(
"FTP: Disconnected!"
));
break
;
case
FTP_FREE_SPACE_CHANGE:
if
(isFirmwareUploaded){
Serial.println
(F(
"The uploaded firmware now stored in FS!"
));
Serial.print
(F(
"\nSearch for firmware in FS.."
));
String name
=
"firmware.bin"
;
File firmware
=
SD.open(name, FTP_FILE_READ);
if
(firmware) {
Serial.println
(F(
"found!"
));
Serial.println
(F(
"Try to update!"
));
Update.onProgress(progressCallBack);
Update.begin(firmware.size(), U_FLASH);
Update.writeStream(firmware);
if
(Update.end()){
Serial.println
(F(
"Update finished!"
));
}
else
{
Serial.println
(F(
"Update error!"
));
Serial.println
(Update.getError());
}
firmware.close();
String renamed
=
name;
renamed.replace(
".bin"
,
".bak"
);
if
(SD.rename(name, renamed.c_str())){
Serial.println
(F(
"Firmware rename succesfully!"
));
}
else
{
Serial.println
(F(
"Firmware rename error!"
));
}
delay
(
2000
);
ESP.reset();
}
else
{
Serial.println
(F(
"not found!"
));
}
}
if
(isFilesystemUploaded){
Serial.println
(F(
"The uploaded Filesystem now stored in FS!"
));
Serial.print
(F(
"\nSearch for Filesystem in FS.."
));
String name
=
"filesystem.bin"
;
File filesystem
=
SD.open(name, FTP_FILE_READ);
if
(filesystem) {
Serial.println
(F(
"found!"
));
Serial.println
(F(
"Try to update!"
));
Update.onProgress(progressCallBack);
Update.begin(filesystem.size(), U_FS);
Update.writeStream(filesystem);
if
(Update.end()){
Serial.println
(F(
"Update finished!"
));
}
else
{
Serial.println
(F(
"Update error!"
));
Serial.println
(Update.getError());
}
filesystem.close();
String renamed
=
name;
renamed.replace(
".bin"
,
".bak"
);
if
(SD.rename(name, renamed.c_str())){
Serial.println
(F(
"Filesystem rename succesfully!"
));
}
else
{
Serial.println
(F(
"Filesystem rename error!"
));
}
delay
(
2000
);
ESP.reset();
}
else
{
Serial.println
(F(
"not found!"
));
}
}
Serial.printf(
"FTP: Free space change, free %u of %u!\n"
, freeSpace, totalSpace);
break
;
default
:
break
;
}
};
void
_transferCallback(FtpTransferOperation ftpOperation,
const
char
*
name,
unsigned
int
transferredSize){
switch
(ftpOperation) {
case
FTP_UPLOAD_START:
Serial.println
(F(
"FTP: Upload start!"
));
break
;
case
FTP_UPLOAD:
Serial.printf(
"FTP: Upload of file %s byte %u\n"
, name, transferredSize);
break
;
case
FTP_TRANSFER_STOP:
Serial.println
(F(
"FTP: Finish transfer!"
));
break
;
case
FTP_TRANSFER_ERROR:
Serial.println
(F(
"FTP: Transfer error!"
));
break
;
default
:
break
;
}
if
(ftpOperation
=
=
FTP_UPLOAD_STOP
&
&
String(name).indexOf(
"firmware.bin"
)>
=
0
){
isFirmwareUploaded
=
true
;
}
if
(ftpOperation
=
=
FTP_UPLOAD_STOP
&
&
String(name).indexOf(
"filesystem.bin"
)>
=
0
){
isFilesystemUploaded
=
true
;
}
};
void
setup
(
void
){
Serial.begin
(
115200
);
WiFi.begin(ssid, password);
Serial.println
(
""
);
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.setCallback(_callback);
ftpSrv.setTransferCallback(_transferCallback);
Serial.print
(F(
"Inizializing FS..."
));
if
(LittleFS.begin()){
Serial.println
(F(
"done."
));
}
else
{
Serial.println
(F(
"fail."
));
}
Serial.print
(F(
"FileSystem version "
));
File versionFile
=
LittleFS.open(F(
"/version.txt"
),
"r"
);
if
(versionFile) {
FILESYSTEM_VERSION
=
versionFile.readString();
versionFile.close();
}
Serial.println
(FILESYSTEM_VERSION);
if
(SD.begin(SS)) {
Serial.println
(
"SD opened!"
);
Serial.print
(F(
"\nCurrent firmware version: "
));
Serial.println
(FIRMWARE_VERSION);
ftpSrv.begin(
"esp8266"
,
"esp8266"
);
}
}
void
loop
(
void
){
ftpSrv.handleFTP();
}