реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> POST и GET запросы от avr через ENC28J60 на сервер в интернет
Calligraff
сообщение Oct 15 2015, 07:39
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 15-10-15
Пользователь №: 88 871



Доброго времени суток, Господа.

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

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

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

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

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

Спасибо.
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Oct 15 2015, 11:25
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



Боюсь вас огорчить, но сам недавно задавался аналогичным вопросом и не нашёл готовых вариантов.
В итоге - просто подсмотрел запросы браузера и ответы сервера в разных режимах, написал прослойку сокетов (т.к. готовые пришлось бы долго пилить), и всё со скрипом, но заработало.
Основная проблема при отдаче страницы - нужно либо много памяти, либо генерировать её на лету.
При запросе - принять куда-то данные. Особенно, если их много.
Пример кусочков кода.
Код
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
Go to the top of the page
 
+Quote Post
Calligraff
сообщение Oct 16 2015, 13:01
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 15-10-15
Пользователь №: 88 871



Спасибо за информацию. достаточно ценно для меня.

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


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

и вот

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

Вконце статьи еще ссылки на эту тему.
Вдруг кому пригодится
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016