Боюсь вас огорчить, но сам недавно задавался аналогичным вопросом и не нашёл готовых вариантов.
В итоге - просто подсмотрел запросы браузера и ответы сервера в разных режимах, написал прослойку сокетов (т.к. готовые пришлось бы долго пилить), и всё со скрипом, но заработало.
Основная проблема при отдаче страницы - нужно либо много памяти, либо генерировать её на лету.
При запросе - принять куда-то данные. Особенно, если их много.
Пример кусочков кода.
Код
void HTTP_ANSWER() {
memcpy(net_buf, "HTTP/1.1 200 OK\r\nServer: ATmega1284p\r\nContent-Length: 219\r\nConnection: Close\r\nContent-Type: text/html, charset=utf-8\r\n\r\n<html><head><title>DONE!!</title></head><body><p>OKEY !</p><br><form enctype=\"multipart/form-data\" action=\"fileuploader.php\" method=\"POST\"><input type=\"file\" name=\"filename\"><input type=\"submit\"></form></body></html>", 339);
SocketSend(0, net_buf, 339);};
void HTTP_CONTINUE(uint16_t PacketLen) {
console_put("\tContinue data... ");
console_put_DWORD(LastHTTP_DataAwait, 1);
console_put(" - ");
console_put_WORD(PacketLen, 0);
console_put(" -> ");
//console_put((char*)(net_buf));
LastHTTP_DataAwait -= PacketLen;
console_put_DWORD(LastHTTP_DataAwait, 1);
console_put(" to go.\r\n");
if (LastHTTP_DataAwait <= 0) {
HTTP_ANSWER();
};
};
void HTTP_GET() {
LastHTTP_RQ_Type = 1;
if (!(strcmp((char*)LastHTTP_RQ_ADDR, "/"))) {
memcpy(net_buf, "HTTP/1.1 200 OK\r\nServer: ATmega1284p\r\nContent-Length: 219\r\nConnection: Close\r\nContent-Type: text/html, charset=utf-8\r\n\r\n<html><head><title>OLOLO!</title></head><body><p>IT WORKS!</p><br><form enctype=\"multipart/form-data\" action=\"fileuploader.php\" method=\"POST\"><input type=\"file\" name=\"filename\"><input type=\"submit\"></form></body></html>", 339);
SocketSend(0, net_buf, 339);
return;
};
// In error case/
memcpy(net_buf, "HTTP/1.1 404 Not Found\r\nServer: ATmega1284p\r\nContent-Length: 138\r\nConnection: Close\r\nContent-Type: text/html, charset=utf-8\r\n\r\n<html><head><title>404 Not Found</title></head><body><p>Sorry, but I haven't this. Try to get <a href=\"/\">back Home</a>.</p></body></html>", 365);
SocketSend(0, net_buf, 365);
};
void HTTP_POST(uint16_t data_starts_in_buffer, uint16_t PacketLen) {
uint16_t i;
if (!(strcmp((char*)LastHTTP_RQ_ADDR, "/fileuploader.php"))) {
console_put("uploading data: ");
console_put_DWORD(LastHTTP_DataAwait,1);
console_put(" bytes\r\n");
};
LastHTTP_RQ_Type = 2;
i = PacketLen - data_starts_in_buffer;
if (i < LastHTTP_DataAwait) {
LastHTTP_DataAwait -= i;
} else {
HTTP_ANSWER();
};
};
Все ответы и переменные захардварены изначально (делалось в качестве именно проверки).
Я бы рекомендовал передавать данные частями и собирать следующую уже после отправки. Опять же, вопрос в обхёме памяти.
PS: Опять же, я переехал с ENC28J60 на Wiznet w5100 и примеряюсь к w5500 в планах на будущее. Скорее всего, мне просто не повезло, но Microship'овский кристалл случайным образом переставал работать - не спасал даже программный сброс, а только отключение по питанию. Ставить мосфеты посчитал излишим и достал с полочки Arduino Ethernet Shield, и сел за библиотеки.
Опять же, по памяти. Я бы рекомендовал использовать либо двойной буфер - пишем данные, затем копируем их в буфер отправки и передаём, либо очень тщательно следить за переменными.
Сообщение отредактировал AlanDrakes - Oct 15 2015, 11:31