Как ускорить отдачу веб-страницы ?

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Имеем классический код для ардуино веб-сервера:

EthernetClient client = server.available();  // try to get client
File webFile;
if(SD.exists(GetData)){
 webFile = SD.open(GetData);
}
while(webFile.available() && File_type == true) {
 client.write(webFile.read()); // send web page to client
}
webFile.close();

т.е. читаем байт с SD-карты и пишем его в изернет-шилд.

Скорость 4кБайт/с.

Мало, У меня только страница(x.html) весит 70 кБ.

Вопрос: как ускорить отдачу страницы?

Я полагаю, если читать по 10 байт а не по одному - скорость повысится?

dmitron1036
Offline
Зарегистрирован: 10.01.2016
// используя stream.readBytes(buffer, length)
length = 10;
while(webFile.available() && File_type == true) {
client.write( webFile.readBytes(buffer, length) ); // send web page to client
}

Так например...

Получится?

или лучше использовать stream.readBytesUntil(characterbufferlength) ?

как при использовании readBytes определить конец файла?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016
dmitron1036
Offline
Зарегистрирован: 10.01.2016

Спасибо, это то что надо.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

dmitron1036 пишет:

// используя stream.readBytes(buffer, length)
length = 10;
while(webFile.available() && File_type == true) {
client.write( webFile.readBytes(buffer, length) ); // send web page to client
}

Так например...

Получится?

или лучше использовать stream.readBytesUntil(characterbufferlength) ?

как при использовании readBytes определить конец файла?

 

Не будет так работать, ибо вот тут client.write( webFile.readBytes(buffer, length) ) та самая client.write получит как результат функции чтения количество прочитанных байт, но не как ссылку на буфер. И вообще подход пагубный - передавать результаты фынкции как параметр другой функции, ибо они передаются через стек и могут этот стек с лёгкостью загнать до области динамической памяти.

А вообще так:

#define BuffLen 32

unsignet int FileLen,t;
unsignet byte Buff[BuffLen];  //,earh можно и временный динамическую переменную организовать, не не как локальную переменную, которая в стеке ляжет

....

FileLen=webFile.Length; // наугад написал имя свойства, дающего размер открытого файла
while (FileLen>0) {
    if (FileLen>BuffLen) {t=BuffLen} else {t=FileLen};
    webFile.readBytes(Buff,t);
    client.write(Buff,t);
    FileLen=FileLen-t;
};