Отправка запроса от веб-сервера ардуино
- Войдите на сайт для отправки комментариев
Ср, 06/05/2020 - 15:52
Здравствуйте.
Подскажите, как отправить данные с веб-сервера ардуино?
Ардуино подключен к интернету с помощью ENC28J60
В библиотеке EtherCard за это отвечает tcpReply(), скетч выглядит так:
session = ether.tcpSend(); const char* reply = ether.tcpReply(session); if (reply != 0) { //res = 0; String data(reply); Serial.println(F(" >>>REPLY recieved....")); Serial.println(reply); }
php-код, обрабатывающий нажатие кнопки:
include('../connect.php'); $query = 'SELECT * FROM `data` where `id`=3 ORDER by time DESC'; // берем текущее состояние кнопки $result = mysqli_query($link, $query); $row = mysqli_fetch_array($result); $S2=!$row['data']; // меняем на противоположное $query = 'INSERT INTO `data` (`id`, `data`, `time`, `prim`) VALUES ("3", "'.$S2.'", "'.date('Y-m-d H:i:s').'", "")'; $result = mysqli_query($link, $query); echo "v1=".$S2; // выводим значение кнопки для ардуино
после нажатия кнопки, ардуино видит ответ сервера, в мониторе пишется >>>REPLY recieved...., но сам reply пустой
Подскажите, что не так делаю, может не так запрос с сервера отправляю, или reply надо как-то по-другому обрабатывать?
зачем нужна 6 строчка? память некуда девать?
я пробовал и Serial.println(reply); и Serial.println(data); все равно пустой результат, просто забыл удалить из этого текста
проверьте. что отвечает сервер. может там ответ пустой. Подключитесь к серверу не через ардуино, а с компа
я могу зайти на сервер с компа, но как увидеть, что он отвечает?
как увидеть, что он отвечает?
в браузере
в браузере я вижу только головной файл сайта index.php из него вызывается файл led.php обработчик кнопки и он должен послать запрос ардуино:
index.php:
led.php:
последняя строка предполагается отправляет значение v1=1 или 0, но похоже это не так)
arduino к какому файлу обращается?
arduino к какому файлу обращается?
хороший вопрос :) к какому-то add_data.php
вот скетч автора. выложенный на Амперке
sbm - выложите еще код файла add_data.php
Вот весь скетч:
ардуино передает данные в файл add_date.php - это у меня отлично получается.
Не получается при нажатии кнопки на сервере (на сайте), передать значение в ардуино
обрабатывает нажатие кнопки led.php и он должен возвращать значение 1 или 0
в скетче я пытаюсь это сделать в строчках с 119 по 128
в скетче я пытаюсь это сделать в строчках с 119 по 128
ЛОЛ :)
В строчках с 119 по 128 - это ответ на запрос к add_data.php
С нажатием кнопки на сервере это НЕ СВЯЗАНО НИКАК.
И не получится. Вы, похоже, кардинально не понимаете как это все работает. При нажатии кнопки в форме на сайте на ардуину НИЧЕГО НЕ ПЕРЕДАЕТСЯ. Ардуина может что-то получить только в том случае. если сама послала запрос. И посылать этот запрос нужно именно тому скрипту на сервере, который вам вернет состояние кнопки.
sbm, чтоб данные ушли в arduino, вам сначала при нажатии кнопки необходимо исправить данные в бд, т е поставить какой то флаг, а при запросе get с МК смотреть на этот флаг и в зависимости от него слать данные.
отлично, уже немного понял свою ошибку, я действительно плохо понимаю этот процесс
у меня передача данных датчиков и нажатие кнопки - разные процессы, хотя получается их можно объединить в один.
в моем случае, надо послать запрос в led.php и получить от него ответ
в моем случае, надо послать запрос в led.php и получить от него ответ
да, как-то так
Ему нужно просо создать этот файл add data и в нем отдавать значение кнопки из базы в дуню. Если я верно понял вопрос. Причём просто текстом, по виду
в исходной версии сайта данные температуры и состояние кнопки обрабатывались разными скриптами соответственно в файлах add_data.php, который по запросу ардуино добавляет данные в базу, и led.php, который вызывается только сайтом.
Теперь я понял, что нужно переделать в скетче и сайте, будем пробовать, спасибо
я исправил скетч, теперь и датчики и кнопку обрабатывает один файл add_data.php
скетч:
add_data.php:
на стороне сайта, работает хорошо: температура выводится и кнопка переключается, но в ардуино данные все равно не возвращаются( reply в 95 строке всегда 0
Зачем начинаете незнакомое дело с монстрячих конструкций? Сделайте простой php, который получает число, умножает на два и возвращает результат. Когда это заработает - будете уже свои SQL-и накручивать.
резонно, add_date.php:
проще некуда, передаю t1=10, t2=15,
должен получить "?t1=20&t2=35", но почему-то возвращает в ардуино пустую строку
Думаю ваш post запрос некорректно на сервер доходит, посмотрите в логах Web сервера ошибки. Я обычно начинал с get запросов, их полностью заставлял корректно работать, причём сначала с браузера, потом уже на post переходил.
Мне тоже кажется, что echo "t1=20" это не POST запрос, а просто вывод на экран t1=20, но тогда можете привести пример как нужно делать get или пост запросы.
Теорию я знаю, get запрос - это index.php?t1=10&t2=15, post запрос, через форму
Но как мне тут написать add_data.php, как Вы говорили умножение на 2 и вернуть это значение?
Начало понятно:
а как вернуть эти значения get запросом?
Так выше же все написано. Или я не понял задачу.
1. Нажимаете кнопку и значение в бд меняется и устанавливается флаг что необходимо отправить данные в ардуино
2. При любом get / post запросе смотрим в бд флаг, если он есть - возвращаем echo то что нам необходимо и сбрасываем флаг.
Вы в логах проверили - запрос доходит корректно?
Пример есть, если найду ближе к обеду скину
Я больше скажу - возьмите оригинальную UIPEthernet - там в экзамплах, вроде как идёт, Webclient. Оно точно работает. На нем и прогоните свой простой алгоритм. EtherCard - своеобразная библиотека, редко тут всплывает.
вот пример PHP откопал, если в параметре GET запроса пришло on то в обратку шлет текст " SetRelayOFF ~", скетч находит эту строку в ответной HTML страничке и выключает реле, ну и наоборот сотвественно.
POST и GET запросы адресованы серверу и обрабатываются им (сервером). Он приняв эти запросы "раскладывает их по глобальным переменным" (к примеру, POST: https://www.php.net/manual/ru/reserved.variables.post.php )
Дуня в этой связке предстает КЛИЕНТОМ, а клиент может получать только "ВЫВОД" (обычно в html или чистый текст).
Если дуня будет слать GET запрос (POST используется для большого объема данных), к примеру такого вида:
То получающий на сервере скрипт (add_data.php) должен его обработать и выдать ответ:
Дуня получит ответ или "ОК" или "ERROR" и вы увидите его в выводе. То же самое и для получения данных из БД по GET (POST) запросу.
Что-то усложнили банальную задачу...
ЗЫ: Писал все быстро, могут быть и ошибки в коде.
Спасибо, то что Вы написали с 1 по 12 строку у меня получается.
Задача передать данные с сайта ардуине, если на сайте нажали кнопку. Я может не сказал отдельно, весь сайт находится на удаленном хостинге, не в ардуине.
Еще раз: ардиуно собирает данные с датчиков и выключателей и передает их в бд сайта на хостинге. Там они отображаются и если на сайте происходит нажатие кнопки, то это нужно как-то передать обратно ардуине, чтобы оно включило выключатель.
Размещать весь сайт в ардуине не хочу по некоторым соображениям и т.к. не хватит памяти.
Это надо коннект постоянный с хостингом держать. Что-то тут было такое про вебсокеты Или через MQTT заворачивать.
а есть пример скетча, который ловит этот ответ, было бы здорово
то, что я хочу сделать было реализовано на шилде w5100 без MQTT в этой статье, моя задача сделать тоже самое, только на ENC68J60
И что там написано в статье?
Во второй раз советую - возьмите UIPEthernet. У нее синтаксис такой же, как у визнетовской библиотеки
sbm, вы читали то что выше написано? Поняли? Мне кажется нет :(
Sadman41 прав, если нужна мгновенная реакция, то http не ваш вариант.
Если секунда, две задержки допустимо то берете алгоритм выше.
Нажимая на кнопку - записываете флаг в бд и в ответе php (пример выше) читаете значение из бд и выдаёте в МК.
а есть пример скетча, который ловит этот ответ, было бы здорово
Почитайте в конце концов html ответ в Википедии, тупо поиск подстроки.
там данные датчиков отправляют отдельно и скрипт на php add_data их обрабатывает, а проверка нажатие кнопки отдельно в файле led.php:
led.php:
Спасибо, я изучаю примеры, которые Вы рекомендовали, чувствую будут вопросы)
пару секунд задержки совсем не критично
тогда получается, что если при нажатии кнопки на сайте вызывается по post-запросу следующий скрипт
ардуино следующим скетчем должно увидеть в ответ в reply "?t1=20&t2=35", так?
Ну нет :(
По нажатию кнопки записывается флаг в бд.
А МК ардуино каждую например секунду шлет get или post запрос, в ответ на который php шлёт в обратку МК нужные данные с зависимости от данных в бд.
Совершенно верно!
Добавьте в бд отдельную таблицу (если с файлами морочиться не хотите) и проверяйте статус.
Это даже в одной файле скрипта можно реализовать, если так сильно это хочется:
Соответственно сами GET-запросы поправить не забудьте. И слать такие запросы на удаленный web-хостинг чаще 1 раз в 10 секунд я бы не стал - сказываются задержки сети и задержки обработки самим web-хостингом.
У вас дыра в запросе, подверженная SQL injection. Данные, полученные с небезопасной стороны, надо хотя бы обернуть в mysql_escape_string ;)
Это не у меня, как Вы выразились, "дыра", а у ТС, я использовал его кусок кода для "наглядности".
Я бы все сделал через API.
ТС, не пугайся уязвимостей, всегда можно VPN-построить и только по VPN данные отдавать, тогда и авторизации не нужно будет использовать (правда не на всех shared, но сейчас VPS не дороже стоит под такие задачи). Чего у тебя там получается то?