Выполнение http запроса Ethernet.h
- Войдите на сайт для отправки комментариев
Чт, 25/03/2021 - 23:24
Здравствуйте)))
if (client.connect(server, 80)) { Serial.println("connected"); // "Подключение установлено" client.println("GET /search?q=arduino HTTP/1.1"); client.println("Host: www.google.com"); client.println("Connection: close"); client.println(); } else { // Если соединения с сервером нет, пишем об этом на Serial Monitor: Serial.println("connection failed"); // "Подключиться не удалось" } }
Мне нужно постоянно отправлять данные на сервер. Я могу это делать через каждые 500 мс и данные успешно отправляются, а я хочу чтобы следующий пакет данных отправился после подтверждения отправки предыдущих.
Т.е. если запрос успешно отправился, выполняем следующий и т д.
Как организовать?
А смысл? TCP сам по себе гарантирует целостность данных. Или в чем суть?
это ddos кому то делаете?
Подтверждения чем - собесом, счётной палатой, кошачьим хвостом?
А смысл? TCP сам по себе гарантирует целостность данных. Или в чем суть?
Т.е. следующий запрос произойдет сразу после предыдущего? Не получится что первый запрос еще не выполнился, а я уже следующий отправляю?
это ddos кому то делаете?
Нет)))
Подтверждения чем - собесом, счётной палатой, кошачьим хвостом?
Последний вариант, думаю)
А по факту, произошла отправка, если сервер ответил 200 OK, отправляю дальше, но как я поняла это лишнее, сервер локальный.
Ответ 200 OK говорит только о том, что состоялся прием данных веб-сервером, но не обязательно о том, что произошла их обработка (
https://developer.mozilla.org/ru/docs/Web/HTTP/Status/200 )
Т.е. 200 ОК может возвращаться вместе с SQL Error в теле ответа, к примеру. Поэтому вопрос "что является подтверждением и кто его выдает?" - ключевой в данной ситуации. Весь дальнейший алгоритм проистекает из ответа.
HTTP предусматривает внутри себя
1. паралельную доставку пакетов (пришло половина пакета 1 потом пакет 2 а потом вторая половина пакета 1)
2. контроль всего этого дела
реальный таймаут ожидания может быть довольно большим (абсолютно реально до 5 сек), ставя 0.5сек ты идешь в разрез с этим протоколом.
если тебе надо быстрый обмен - переходи на другие протоколы, на HTTP делать твою хотелку - просто бесмыслено...
https://ru.wikipedia.org/wiki/SNMP
HTTP предусматривает внутри себя
1. паралельную доставку пакетов (пришло половина пакета 1 потом пакет 2 а потом вторая половина пакета 1)
2. контроль всего этого дела
O_O фигасе новинки в HTTP.
HTTP предусматривает внутри себя
1. паралельную доставку пакетов (пришло половина пакета 1 потом пакет 2 а потом вторая половина пакета 1)
2. контроль всего этого дела
O_O фигасе новинки в HTTP.
разумеется это не сам HTTP, я написал с упрощениями, иначе придется расписывать отличия UDP от TCP
HTTP собирает пакеты? С IP не путаете?
https://ru.wikipedia.org/wiki/HTTP#GET :
----
С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса.
----
подпишусь
Вопрос
php
Ардуинка печатает следующее:
Откуда берется HTTP/1.1 400 Bad Request
https://developer.mozilla.org/ru/docs/Web/HTTP/Methods/POST
Обратите внимание на "Пример". Там пустая строка между хидером и телом. Насколько я помню - в RFC должно быть двойное \r\n , а println() даёт только \n
Я бы вам посоветовал простой путь, если не хотите по стандартам ползать - подсмотреть обмен между браузером и веб-сервером Wireshark-ом, а потом имитировать "через ардуину".
Так работает, получаю
А если я не знаю число отправляемых байт, как посчитать?
Так и подсчитать. Сперва получить данные, потом сформировать запрос, и только потом отправлять, а считывать данные прямо в процессе отправки запроса считается дурным тоном.
ps приведённый пример псевдокод, может даже и не скомпилируется, но суть вот такая
Я snprintf_P()-ом считаю.
Спасибо.
если тебе надо быстрый обмен - переходи на другие протоколы, на HTTP делать твою хотелку - просто бесмыслено...
какие протоколы?
любой tcp/IP или UDP, хоть сами обмен пишите, и сервер и клиента.
Что такое протокол если тупо попроще - просто сбор неких правил и определений, которым должно следовать устройства обмена.
Вы главное не забудьте: если устройства будут обмениваться через какие либо общественные роутеры или интернет - многие не будут пропускать ваш доморощенный протокол. Но если очень хочется - ничего не мешает имитировать http , но обрабатывать заголовки/данные самостоятельно, тогда этому протоколу везде будет дорога по 80 порту.
С чего бы это такая самодеятельность? Есть tcp пакет, есть udp пакет, на любой (почти) порт - дело провайдера не фильтровать, а пропускать (я в курсе про блок 53/udp вниз у многих, но и причина есть, ну или там 25/tcp). И это последнемильники, а транзитникам вообще пофигу, чем больше трафика, тем лучше. За 20 лет только один раз столкнулся, мобильный провайдер (и опять оконечник bras) резал GRE, причём это была их чёткая позиция, с чем связано, не сказали. Что ж, отдали деньги другому провайдеру.
С чего бы это такая самодеятельность?
из личного опыта :)
и интернет трафик не только через провайдеров идет, вы можете запустить клиентскую часть своего устройства например в wifi сети некой организации, а там любят все запрещать (сам такой).
А, ну там пусть запрещают, их трудности.
Почему ардуино нано (с загрузчиком уно) не видит модуль при таком подключении?
Разобралась, на модуле ICSP не разведено на пины (11,12,13)
Подключила ICSP модуля к пинам ардуино, и плюс 10 пин.
Как это? На ICSP не разведен SPI?
На Ethernet shield контакты 11 12 и 13 не соединены с ICSP
А почему у меня плата с такими параметрами работает только через роутер, напрямую с ПК не работает
А почему у меня плата с такими параметрами работает только через роутер, напрямую с ПК не работает
видимо надо включить кроссоверным кабелем
Второй вариант?
да
А на пк-то сетевая карта, куда втыкаете, настроена, как полагается? Кроссоверные кабеля не нужны лет 10-15 как.
Кросоверный вариант не работает.
Сетевая карта настроена как
Проткол интернета Версия 4
192.168.0.55
255.255.255.0
192.168.0.1
Эмм, и вы вытыкаете из неё кабель, ведущий к роутеру, и вместо него втыкаете кабель, ведущий к ардуине?
Кабель от модуля к сетевой карте ПК не работает
Кабель от модуля в роутер, ПК подключен к роутеру - работает
странно, должен работать, проверьте чтоб на ПК статический IP стоял, ну и кабель сетевым тестером перепроверить.
Адрес стоит статический. Кабель исправный, через роутер же работает, но проверяла и другой кабель.
Модуль Пингуется
Да, должно работать. Может, на модуле надо вот это:
Ну и если вы используете обращение не по ip, а по домену, то не сработает, dns и шлюза нет.
Получаю connection failed
Черезе роутер ОК
Подсеть 192,168,1 , а не 192.168.0 все верно, перешла на другую машину
так у пк ip всё же 192.168.0.55 или 192.168.1.55? У ардуины 0 или 1? Должны быть одинаковыми 0/1 и там, и там.
Но вообще, поидее должно работать. Может, конечно, модулю плохеет без шлюза, но сомнительно.
У ПК адрес 192.168.1.55
У модуля 192.168.1.3
Не успела отредактировать своё сообщение до вашего ответа
Вижу. Поидее должно работать. Ещё, может быть, фаервол на пк закрывает доступ к серверу.
Тогда бы и через роутер не работало
Если часто меняете IP, не меняя MAC, то проблемы сильновероятны, так как ARP-кэш на сторонних устройствах сразу самостоятельно не чистится.
Все эти метания сводят с ума пользователя - то работает сеть, то нет... Меняете IP на Wiznet, меняйте и MAC.
...это не к данной проблеме относится, а вообще.
да, хорошая идея. Или arp -d на пк, а модулю просто ребут.
Добавила проверку
При прямом подключении пк <--> wiznet никакого dhcp не будет.
При подключении через роутер:
Initialize Ethernet with DHCP:
DHCP assigned IP 192.168.1.56
connecting to 192.168.1.55
при подключении напрямую
Initialize Ethernet with DHCP: