Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: POST и GET запросы от avr через ENC28J60 на сервер в интернет
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Calligraff
Доброго времени суток, Господа.

В интернете очень много статей, примеров и вообще готовых проектов на тему создания небольшого web-сервера на AVR.

но нигде не нашел примера реализации web-клиента.

Т.е. необходимо не принимать запросы и отдавать данные (например страничку), а наоборот самому инициировать запрос к какому либо серверу и посылать данные (например xml).

Цель: множество станций по России подключенные к сети интернет. Станции при изменении в них данных от датчиков отправляют POST или GET запрос на опеделеный сервер доступный через сеть интернет. Например отправка некого XML на сервер http://<некий сервер>/receiver.php методом POST или так: http://<некий сервер>/receiver.php?s1=27&s2=38&s3=534

Прошу Вас подсказать где поискать подобную реализацию. Желательно с примерами.

Спасибо.
AlanDrakes
Боюсь вас огорчить, но сам недавно задавался аналогичным вопросом и не нашёл готовых вариантов.
В итоге - просто подсмотрел запросы браузера и ответы сервера в разных режимах, написал прослойку сокетов (т.к. готовые пришлось бы долго пилить), и всё со скрипом, но заработало.
Основная проблема при отдаче страницы - нужно либо много памяти, либо генерировать её на лету.
При запросе - принять куда-то данные. Особенно, если их много.
Пример кусочков кода.
Код
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, и сел за библиотеки.

Опять же, по памяти. Я бы рекомендовал использовать либо двойной буфер - пишем данные, затем копируем их в буфер отправки и передаём, либо очень тщательно следить за переменными.
Calligraff
Спасибо за информацию. достаточно ценно для меня.

так же вот еще нашел:


Подключение микроконтроллера к локальной сети: UDP-клиент

и вот

Подключение микроконтроллера к локальной сети: TCP-клиент

Вконце статьи еще ссылки на эту тему.
Вдруг кому пригодится
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.