Arduino WebClient - Локальный сервер
- Войдите на сайт для отправки комментариев
Доброго времени суток, уважаемые форумчане
Знаю что такой вопрос уже поднимался на данном форуме, но проблему решить не удалось...Помогите реализовать веб клиент на базе ардуино и локальный сервер...
Проблема в том, что никак не получается вывести отправленные методом Get на сервер данные...
Скетч ардуино:
#include <SPI.h> #include <Ethernet.h> #include "DHT.h" //Константы #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес EthernetClient client; //Переменные unsigned long int timeConn = millis(); // Частота отправки данных о t/h на сервер float h; // Значение температуры float t; // Значение влажности char server[] = "127,0,0,1"; /*-------------------------------------------------------------- Необходимые настройки --------------------------------------------------------------*/ void setup() { //Старт Serial.begin(9600); Ethernet.begin(mac); dht.begin(); } /*-------------------------------------------------------------- Основное тело программы --------------------------------------------------------------*/ void loop() { h = dht.readHumidity(); t = dht.readTemperature(); if (millis() - timeConn > 2000) { sendData(t,h); timeConn = millis(); Serial.println("CONNECT SERVER: Send temp/hum"); } } /*-------------------------------------------------------------- Функция отправляет данные о температуре и влажности на WEB сервер. --------------------------------------------------------------*/ void sendData(float t, float h) { client.connect(server, 80); client.print( "GET /index.php?"); client.print("t="); client.print(t); client.print("&"); client.print("h="); client.print(h); client.println(" HTTP/1.1"); client.print( "Host: " ); client.println(server); client.println( "Connection: close" ); client.println(); client.println(); client.stop(); client.flush(); /* Для тестирование текст запроса вывел в сериал порт */ Serial.print( "GET /index.php?"); Serial.print("t="); Serial.print(t); Serial.print("&"); Serial.print("h="); Serial.print(h); Serial.println(" HTTP/1.1"); Serial.print( "Host: " ); Serial.println(server); Serial.println( "Connection: close" ); }
Ардуино с шилдом подключена к LAN на ноуте. На винде 7 стоит Open Server там лежит папка с сайтом home.ru и внутри файлик с таким содержанием:
<?php ini_set("display_errors",1); error_reporting(E_ALL); ?> <html> <head> <title>Mysite</title> </head> <body> Hello <?php ini_set("display_errors",1); error_reporting(E_ALL); $temp = $_GET['t']; $hum = $_GET['h']; echo $temp; ?> </body> </html>
Когда перехожу на сам сайт выдает такие ошибки:
Notice: Undefined index: t in C:\OpenServer\domains\home.ru\index.php on line 17
Notice: Undefined index: h in C:\OpenServer\domains\home.ru\index.php on line 18
Понятно, что не приходят данные t и h... Помогите понять почему и как это исправить...
Монитор порта arduinoIDE выдает все как положено :
CONNECT SERVER: Send temp/hum
GET /index.php?t=0.00&h=0.00 HTTP/1.1
Host: 127,0,0,1
Connection: close
Очень надеюсь на вашу помощь!
127.0.0.1 это адрес самого себя
127.0.0.1 это адрес самого себя
А какой IP тогда ставить? Ноутбука?
IP адрес вашего сервера, откуда я знаю где он у вас там крутится ) Если на ноутбуке, то ноутбука
IP адрес вашего сервера, откуда я знаю где он у вас там крутится ) Если на ноутбуке, то ноутбука
Сервер стоит на ноутбуке. Заменил IP на адрес ноута:
Все равно на сервер не приходят данные..
IP адрес пишется через точки
IP адрес пишется через точки
Заменил запятые наточки.ничего не изменилось..
Откройте стандартный пример который с iDE идет, пример называется WebClient там все есть. Если нет днс подключайтесь по IP но правильно задав его как в #6
Плюс GET запрос лучше одной строкой давать, заранее сформировать и послать.
Плюс если DHCP нет, при инициализации надо и мак и айпи передавать.
Откройте стандартный пример который с iDE идет, пример называется WebClient там все есть. Если нет днс подключайтесь по IP но правильно задав его как в #6
Заменил как в примере на
Все равно все та же ошибка
Плюс GET запрос лучше одной строкой давать, заранее сформировать и послать.
Плюс если DHCP нет, при инициализации надо и мак и айпи передавать.
Запустил пример dhcpadresssprinter, в монитор порта не выводится IP адресс ардуинки...напомню что ардуино подключено к LAn порту ноутбука
Ну а кто ей должен адрес выдать то если подключено напрямую... Адрес явно задавайте. Потом с компа пробуйте пингуйте. Если сетевуха не древняя то разберется с любым кабелем иначе может кросс-кабель понадобиться. В общем учите матчасть для начала.
перейдите на своем ноуте по адресу 192.168.1.3\\index.php?t=10.0&h=32 посмотрите что будет в итоге
Ну а кто ей должен адрес выдать то если подключено напрямую... Адрес явно задавайте. Потом с компа пробуйте пингуйте. Если сетевуха не древняя то разберется с любым кабелем иначе может кросс-кабель понадобиться. В общем учите матчасть для начала.
перейдите на своем ноуте по адресу 192.168.1.3\\index.php?t=10.0&h=32 посмотрите что будет в итоге
Не удается получить доступ к сайту Сайт 192.168.1.3 не позволяет установить соединение. Выполните поиск по запросу index в Google ERR_CONNECTION_REFUSED
localhost/index.php?t=10.0&h=32
?
del
localhost/index.php?t=10.0&h=32
?
Object not found!
The requested URL was not found on this server. If you entered the URL manually please check your spelling and try again.
If you think this is a server error, please contact the webmaster.
Error 404
Ну у вас и вэбсервер не настроен даже, он вообще запущен? Решайте поэтапно задачу. Добейтесь чтобы ардуинка пинговалась с ноутбука. Далее разберитесь со своим сервером, ну а потом уже можно соединять все воедино
Ну у вас и вэбсервер не настроен даже, он вообще запущен? Решайте поэтапно задачу. Добейтесь чтобы ардуинка пинговалась с ноутбука. Далее разберитесь со своим сервером, ну а потом уже можно соединять все воедино
Обнаружил что не был установлен драйвер для LAN на машине, установил, теперь ардуино определяется в сетевых устройствах как неопознанное устройство.
В настройках этого подключения задал ip для устройства 192.168.1.17 маска подсети 255,255,255,0 и адрес шлюза 192,168,1,3 ( IP ноутбука)
Теперь ардуина пингуется по адресу 192,168,1,17 .
А как настроить веб сервер? у меня стоит Open server 5.2.2
Ну это уже в профильные форумы, обычно есть файл конфигурации где все прописывается. Как минимум поробуйте запустить его и перейти по адресу home.ru
Ну это уже в профильные форумы, обычно есть файл конфигурации где все прописывается. Как минимум поробуйте запустить его и перейти по адресу home.ru
По адресу home.ru переходит, я так понимаю надо как то закрепить за этим адресом ip?
за ним уже поидее закреплен адрес, адрес вашего ноута. Можно попробовать с ардуины обратиться по символьному имени home.ru
char server[] = "www.home.ru"; //
но у вас там и пхп скрипт странный, поидее он должен складывать данные в базу данных, а в том виде что у вас данные переданные ардуиной потеряются при следующем вызове index.php. Хотя я пхп последний раз видел давно но думаю что так. А так вы в браузере набираете home.ru и выполняется тот же самый GET только без параметров
Так по home.ru/index.php?t=10.0&h=32.0 что в браузере видите?
Так по home.ru/index.php?t=10.0&h=32.0 что в браузере видите?
К сожалению сейчас на работу ушел, попробую только вечером около 19.00 по МСК, буду очень признателен если Вы будете онлайн
Есть логика в том что данные должны заноситься в базу, попробую сделать вот так
<?php
define(DB_HOST, "localhost");
define(DB_NAME, "db_name"); //название базы
define(DB_USER, "username"); //имя пользователя базы
define(DB_PASS, "pass"); //пароль пользователя базы
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS);
if(!$link) die ("Невозможно подключиться к базе данных!");
mysql_select_db(DB_NAME);
$temp=$_GET["t"];
$hum=$_GET["h"];
$query = "INSERT INTO `temp_room1` (`time`, `temp`, `hum`)
VALUES ('".time()."', '".$temp."','".$hum."')";
/*
temp_room1 - название таблицы в базе
time, temp, hum - поля в таблице
*/
if(!mysql_query($query))
echo "ошибка при записи в БД!";
mysql_close($link);
?>
Ну и лучше сделать отдельный скрипт для приема данных от ардуины, разбора и сохранения в базу. Тогда для добавления данных в базу данных, ардуино будет выполнять GET к скрипту скажем arduparser.php а index.php уже будет просто так называемой web-мордой для отображения информации.
А как настроить веб сервер? у меня стоит Open server 5.2.2
Лучше использовать более распространённые, по ним информации гораздо больше: nginx или Apache.
А как настроить веб сервер? у меня стоит Open server 5.2.2
Лучше использовать более распространённые, по ним информации гораздо больше: nginx или Apache.
Он основан тоже на апаче
Ну и лучше сделать отдельный скрипт для приема данных от ардуины, разбора и сохранения в базу. Тогда для добавления данных в базу данных, ардуино будет выполнять GET к скрипту скажем arduparser.php а index.php уже будет просто так называемой web-мордой для отображения информации.
Сделал страничку parser.php
Теперь по запросу home.ru/parser.php?t=10.0&h=32.0 в базу данных заносятся значения 10 и 32 соответственно, значит скрипт работает.
Однако при подключении ардуины к ноутбуку все равно данные в таблицу не добавляются.
Покопался в настройках сервера, теперь по IP моего ПК 192.168.1.3 можно попасть на home.ru на локальном сервере и запрос 192.168.1.3\\parser.php?t=10.0&h=32 проходит отлично, данные в БД добавляются. но все равно не приходят данные от ардуно...
Чувакиии на помоооощь!!!!
Что то получилось, но опять же криво да косо... Когда запускаю ардуино теперь мне приходят переменные t и h, но....они пустые. Запись в БД ведется. Помогите понять где ошибка уже мозг взрывается 0_о
sketch
parser.php
--
Ну что тут сказать, во-первых по базе: id лучше делать автоинкрементным. Поле тайм типа timestamp ну и температура и влажность так-то float и к тому же они могут быть нулями.
client.print( "GET /parser.php? "); в этой строке попробуйте сразу весь запрос отправить одной строкой как с компа делали и говорили что работает.
Ну что тут сказать, во-первых по базе: id лучше делать автоинкрементным. Поле тайм типа timestamp ну и температура и влажность так-то float и к тому же они могут быть нулями.
client.print( "GET /parser.php? "); в этой строке попробуйте сразу весь запрос отправить одной строкой как с компа делали и говорили что работает.
client.print( "GET /parser.php?t=10.0&h=32 ");
вставляет в базу данных записи 10 и 32 соответственно
БД изменил:
Ну вот и отлично, а что еще не работает?
Ну вот и отлично, а что еще не работает?
Данные с датчика так и не передаются...
Раз так работает: client.print( "GET /parser.php?t=10.0&h=32 "); то сформуруйте единый get запрос, а не шлите данные отдельными принтами и все будет работать
Раз так работает: client.print( "GET /parser.php?t=10.0&h=32 "); то сформуруйте единый get запрос, а не шлите данные отдельными принтами и все будет работать
А как будет правильно? client.print( "GET /parser.php?t=?&h=?"); вот так?
Вообще не знаю как это делается ахах
Ну вот самое простое, правда стринг много памяти жрет, но я думаю вам это не критично
Что то не получается(
А я тестил на обычном сериале, он похоже стринг нормально разбирает а этой библиотеки именно string (с маленькой буквы надо) надо пробовать toCharArray тогда должно понять
UPD: хотя сейчас вот попробовал все нормально компилируется. String с большой буквы написан?
Да, с большой, попробую вечером на tochararray поменять
У меня ваш код со вставленным моим нормально компилируется без всяких toCharArray
А скиньте как у вас получился мой код с вашими добавками, посмотрю, может что то не так сделал
Ну вот как-то так, все компилируется без ошибок. DHT закомментировал, потому что в той иде что под рукой нет библиотеки DHT
А я вставлял ваш код в то место где объявляли переменные t и. h , а client.println(get_query); в void sendData, может поэтому у меня ошибки такие...
Ну да, области видимости переменных никто не отменял :)
Мой косяк, вечером попробую, отпишусь)
Ну да, области видимости переменных никто не отменял :)
Добрался наконец то до ноутбука...Залил скетч, с небольшими изменениями:
Вот так все работает! Спасибо! радости нет предела!
C базой разобрались? если нет пишите подскажу