Как ускорить отдачу веб-страницы ?
- Войдите на сайт для отправки комментариев
Втр, 22/03/2016 - 10:20
Имеем классический код для ардуино веб-сервера:
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 байт а не по одному - скорость повысится?
// используя 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(character, buffer, length) ?
как при использовании readBytes определить конец файла?
https://geektimes.ru/post/260682/
Спасибо, это то что надо.
// используя 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(character, buffer, length) ?
как при использовании 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; };