majordomo-arduino не получается снять показания
- Войдите на сайт для отправки комментариев
Пт, 25/07/2014 - 15:30
Добрый день.
Скачал и установил majordomo-arduino.
Если открыть страницу http://192.168.3.177/getdev или http://192.168.3.177/ как написано в документации, то всё хорошо, страницы формируются и есть показания дачтиков и состояние пинов.
А вот если в php коде написать :
<?php
$data = file_get_contents('http://192.168.3.177/getdev');
echo $data;
?>
то никакого результата не выводится.
Подскажите плз, что я делаю не так ?
А доступ есть к этому ресурсу в PHP? Мне кажется что нет ...
А как проверить ?
если я ввожу в php :
IP адрес сервера на котором крутится LAMP с кодом PHP 192.168.3.5
а IP адрес Arduino 192.168.3.177
И как запрос
Я правильно понимаю, что с других внешних серверов все получается, а с http://192.168.3.177/ ну никак?
(и, кстати, непонятно, вы с компа голым php лезете, или из-под веб-сервера)
Да, с других серверов получается.
Сервер который лезет за данными. Ubuntu + LAMP.
хорошо бы посмотреть, что выдаст wget http://192.168.3.177/getdev
(интересует его протокол работы)
Вот что выдал
а вот и файлы по запросам
wget http://192.168.3.177/getdev - getdev
ATI-0.00 HW-nan GND HUM-289
и
wget http://192.168.3.177 - index.html
Попробуйте подкинуть php адрес http://192.168.3.177/getdev/index.html
Жаль, но не помогло.
Вы правда считаете что мы должны гадать как у Вас устроена и настроена сеть? Как Вы файлы обозвали? Как апачи настроен и что в пхп.ини прописано?
Нет, я так не считаю.
Может кто то сталкивался уже с такой проблемой. Проект majordomo-arduino давольно известный.
В этом проекте как то считываются показания с датчиков на ардуине. Хотелось бы узнать каким методом ?
Жаль, но не помогло.
попробуйте еще http://192.168.3.177/getdev/
В этом проекте как то считываются показания с датчиков на ардуине. Хотелось бы узнать каким методом ?
Посмотреть код?
wget http://192.168.3.177 - index.html
Во вторых... что-то смущает что "
200 Заголовки отсутствуют"Возможно мажордомо их не выдает (хотя странно... сомнительно что они столь грубую ошибку допустили...)
А file_get_contents() может как раз вести себя типа "если http 200 нема, то считать попытку неудачей".
Может файерволы какие-то у вас стоят...
Посмотрите что там, все-таки приходит от вашего мажордомо в заголовках.... в друг там что-то типа http 301 или http 401
PHP: $http_response_header - Manual
P.S. А вообще это тема ближе куда-то к php-шным форумам... там скорее можно найти решение проблем доступа из php к внешним ресурсам.
Да, скорее всего arduino шлёт ответ в "неправильном" формате. Именно по этому file_get_contents не выдаёт никаких результатов.
Блин !!! Но всё таки как то люди вытаскивают значения из arduino !!!
Разбирать код http://smartliving.ru/ мне не под силу. Не хватит знаний !!!
Файерволыотключил. Не помогло.
>Блин !!! Но всё таки как то люди вытаскивают значения из arduino !!!
Прекратите думать об этом как "вытаскивать значения из ардуино".
Вы общаетесь по протоколу http.
Следовательно у вас есть http сервер и http клиент (ваш php код).
Кто там выступает в роли http-сервера... - дело десятое.
Копать нужно в сторону разбирательств с http протоколом. Разобраться что такое заголовки (и для реквеста и для респонса), что такое статусы, как посмотреть "что ответил сервер" (вот я вам как раз и дал ссылочку)
Найти разницу между запросом который посылает браузер, и запросом который у вас получается с помощью file_get_content....
Может там мажордомо ожидает какого-нибудь банального "Accept: text/html" что бы знать в каком же виде вам ответ нужно дать...
Посмотрите, для начала какие заголовки в запросе посылают wget/браузер и ваш php.
Ну скажем вот это первое нагуглилось для проверки этого:http://headers.cloxy.net/request.php
А еще... на 80% уверен, что сам мажордомо имеет какое-нибудь API. И, с большой долей вероятности клиенты на PHP уже тоже существуют. Выпарсивать данные из html-ля предназначенные для человека (с дизайном и проч.) - это самое последнее что нужно пробовать. Если никаких других способов не предусмотрено. Но с большой долей вероятности этот мажордомо умеет отдавать данные в виде json или xml.
Спасибо. Буду ковырять в этом направлении.
О результатах отпишусь.
Проект majordomo-arduino давольно известный.
ну так гуггл вам в руки. вы же видите что тут никто не сталкивался. и если прям НАСТОЛЬКО ИЗВЕСТНЫЙ, то загуглите примеры.
А я вот стакливался. Сейчас подскажу.
Смотрите. На странице имеем http://192.168.0.210/getdev следующие показания:
28FF820410140093:26.00;28FFE90310140074:25.00;
Из кода я специально убрал следющие строки:
Мне показалось так будет проще.
Собственно на WEB сервере пишем следующий PHP скрипт:
Собственно данный скрипт сам напишет значения с датчиков в БД не зависимо от их кол-ва.
Убедитесь что на сервере стоит cURL. Проверить можно создав PHP файл на сервере:
Собственно и все. Чтоб не плодить новые темы, хочется спросить по коду следующее. В каком случае идет обновление данных с датчиков? Или каким образом можно сделать, чтоб данные с датчиков обновлялись раз в минуту.
Где T0 - Температура датчиков на шине 1-wire
ATI и HW - температура и влажность на датчике DHT11
GND HUM - влажность почвы
Ардуино установленно в теплице, и управляет автоматическим поливом.
Вод код вывода !!!
Собственно вам можно просто сделать вот так: T0:23.75;ATI:36.00;HW:31.00;GND HUM:46;
И все значения упадут в таблицу. Выложите пожалуйста весь код.
вот мой код.
Данные с датчиков думаю обновлять как раз через опрос, который по расписанию будет запускаться раз в 10 минут.
Для моих задач это достаточно.
Что касаемо curl
php страница с кодом
Скажите, а вы никогда не замечали разницы между кодом который выкладываете вы и кодом который выкладывают другие?
да, замечал, но при попытке выложить код в нормальном формате, форум выдаёт ошибку.
Инструкцию http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii прочитал.
Но всё равно не получается.
Сорри.
подправил страницу с выводом curl
вот что теперь выдаёт
CURL_VERSION_IPV6 есть CURL_VERSION_KERBEROS4 нет CURL_VERSION_SSL есть CURL_VERSION_LIBZ есть
Собственно CURL_VERSION_KERBEROS4 не нужен. Сейчас посмотрю чтоб просто отоброжало.
За отображение кода, прошу понять и простить ))
Не забудь, что тебе нужно сделать Датчик:Значение;Датчик1:Значение;
Что бы разобраться с этой проблемой я сделал проще.
Я загрузил Ваш код в свою тестовыю Arduino MEGA 2560 R3.
Браузер по запросу http://192.168.3.201/getdev
выдаёт показания 2871C4DC04000001:27.62;
А вот PHP пока не хочет.
Так как у меня разные датчики и разные показания, мне их нужно записывать в разные SQL таблицы, но с этим позже.
Для начала мне нужно их получить !!! И хотябы распечатать на странице :-).
Я не совсем понимаю как работает curl.
IP адрес у меня http://192.168.3.201/
Что я должен вставить в строку :
CURLOPT_URL=>
'<a href="">http://*******</a>'
,
При попытке вставить CURLOPT_URL=>'<a href="">http://192.168.3.201/getdev</a>',
ничего не выводится.
Вообщем-то странно. Если вы "для просмотра" используете скетч из #29 , что-то увидеть вы просто обязаны.
Или данные, или сообщение об ошибке.
Если, перед
Воткнуть что-то типа:
То хоть эту надпись видно?
А если в браузере, там где вы php-дергаете, сделать View Source, там тоже пусто?
А еще смущает
CURLOPT_PORT=>6050
Если мы браузером дергаем ардуину, не указывая никаких портов, то.... по логике номер порта должен быть дефолтным. то есть - 80-тым.
Но... даже если мы ошиблись, то все равно должны что-то увидеть от
die
(
'Error['
.curl_errno(
$ch
).
']: '
.curl_error(
$ch
));
Или он не на страницу плюет ошибку, а куда-то в лог? Просто я с php 10-ть лет назад последний раз общался... не помню :)
Если "куда-то в лог", то искать где же эти логи...
Или заменить die на echo... и все-таки увидеть эту ошибку.
Можно даже специально что-нибудь в адресе напутать. Что-бы убедится что хотя-бы диагностинка работает верно. Невозможно "работать с тишиной".
Ни тебе ошибок, ни отвеченный хедеров я вам в #16 зачем ссылочку давал? Показать как я умею ссылки втавлять? ;)
Всем ОГРОМНОЕ СПАСИБО !!!
Разобрался.
Код из #29 оказался для меня очень сложным. Поэтому немного погуглив и спросив товарищей получилось вот что :
при запросе http://192.168.3.177/getdev
получаем T0-23.75 ATI-42.00 HW-29.00 GND HUM-503
конечно формат не правильный, но пока так. Потом эти данные я буду записывать в разные SQL таблицы.
php код который у меня заработал.
CURLOPT_URL=>'http://192.168.3.201/getdev', Без а href
Curl port можете убрать, это просто у меня так.
Плюс попробуйте так, это просто отображение, без записи:
Посмотрите PHPINFO, там что пишет про библиотеку CURL, у меня вот так вот:
Пожалуй спрячу в код
Собственно у меня остался вопрос по данному коду. В какой именно момент происходит повторный опрос с датчиков. Т.к. данные у меня не обновляются.
Пока не разбирался, но думаю как то так :
в гугле набрал "запуск php страницы по расписанию"
Понравилась эта статья.
http://php.ru/forum/viewtopic.php?t=21166
Ещё не пробовал. Но с помощью отзывчивых людей (таких как Вы), форумов и гугла мне кажется всё получится.
Ещё раз ОГРОМНОЕ Вам спасибо за помощь !!!
Не совсем меня правильно поняли.
Меня интересует в коде от Сергея Очкасова, в какой момент происходит обновление данных.
Просто у меня температура статична, если не нажать Reset на устройстве (ардуине). Собственно мне не понятно след. строка:
Вот что это значит. Или как можно сделать опрос датчиков раз в минуту.
С этим еще проще, если у вас nix сервер, то просто в /etc/crontab добавляем
0-59 * * * * root /usr/bin/curl http://server_ip/script.php
И будем опрашивать датчики каждую минуту. По крону можно много где почитать. Если стоит Денвер, то можно через планировщик, или тот-же crontab для win
Это значит, что в loop() ардуина ждет приходящие запросы и их обрабатывает.
Дальше нужно смотреть, что происходит в processConnection
При обработке каждого запроса она перечитывает датчик или нет (скорее всего - на каждый).
Следовательно что-бы получать актуальную инфу, вам нужно, как минмум регулярно слать запросы к самой ардуине.
Либо F5 в браузере нажимая, либо каким-то планироващиком запуская свой скрипт. Либо... вообще отказаться от PHP. Сделать html страничку, в ней написать маленький скриптик на javascript.... с помощью setInterval, вызывать jQuery.get() | jQuery API Documentation
Парсить полученные данные, и с помощью того jQuery выводить их на эту страничку. В резульатет - открили этот Html-льчик и смотрите на нем актуальные данные (актуальность зависит от того какой интервал задали в setInteval).
P.S. весь javascript путь, это "само-собой" если вы хотите именно "смотреть данные". если нужно в базу ложить... то изначальный php+cron довольно оптимальный вариант.
Я так понимаю, что опрос датчиков происходить только по команде
http://192.168.3.201/getdev
Я не разбирался в коде (опыта не хватит :-) ). Только добавил в код несколько других датчиков и дописал вывод их результатов.
а почему бы просто не использовать ардуину как клиент а не как сервер?
извиняюсь если это обсуждение уже было выше - из-за простыней кода читать трудно :)
Я не знаю какие задачи решает Arduino у "Divest", но у меня задача такая :
Собрать данные с датчиков, записать их в БД (для статистики и анализа)
Управлять Arduino через браузер, внутри локалки и из "внешнего мира".
Так что мне подойдёт только arduino-server.
Ещё раз прошу прощения за "простыни кода".
Ещё раз прошу прощения за "простыни кода".
Поробуйте другой браузер. Посмотрите не включенна ли у вас какая-нибудь "баннеро-резалка" которая скрипты коцает....
По крайней мере в chrome, если не обвешивать его 100 и одним плагином - все нормально.
А то часто попадаются "любители Оперы" (или еще какой "экзотики"), который "самый лучший браузер", только проблемы вылазять то тут, то там.... и все равно "он самый лучший".
Я не знаю какие задачи решает Arduino у "Divest", но у меня задача такая :
Собрать данные с датчиков, записать их в БД (для статистики и анализа)
Управлять Arduino через браузер, внутри локалки и из "внешнего мира".
Так что мне подойдёт только arduino-server.
Блин, а я не знал что так нельзя делать :( Пойду сниму свои Ардуины.
Так что мне подойдёт только arduino-server.
Блин, а я не знал что так нельзя делать :( Пойду сниму свои Ардуины.
[/quote]
Перевод: раз у вас крутится php, то можно php сделать "сервером". Что-бы "ардуина его дергала" посылая ему свежие данные с какой-то периодичноситью. А он их принимал и ложил в базу.
Если быть точным: даже когда Вы что-то посылаете на сервер, то Вы можете получать ответ от него.
Да, конечно я так изначально и хотел, но что то не пошло. А пошло пока так :
События происходящие на ардуино (например нажатие кнопки) у меня так уже реализованно.
А вот как снимать показания с датчиков с некой переодичностью и отсылать их на server (Ubuntu + LAMP), я как и "Divest" не знаю. Он задавал именно этот вопрос в этой теме. #34 и #36.
На данный момент так :
События происходящие на ардуино отправляются на Server и заносятся в БД.
С Servera приходят комманды на arduino (php код)
$handle = @fopen("http://192.168.3.177/command?4=ON", "r");
Сбора показаний с датчиков по запросу от Servera (вся эта тема)
Пока такие результаты, с учётом того, что опыта программиста у меня нету, языков программирования я не знаю, и ардуиной начал заниматься совсем недавно.
А вот как снимать показания с датчиков с некой переодичностью
А потому что начинать нужно не с "космических кораблей", а с кнопок и светодиодов.
Смотреть базовые примеры, про мигание светодиодом. С delay() и без.
Когда это будет "элементарно", то вместо "включить/выключить светодиод" подставляете "опросить датчик". И все.
И делаете это все не сразу с кучей "неизвестных", php, сервера, шилды, а обычным Serial.println отправляете на комп, переодически, состояние датчиков. По Serial.
Когда так заработает, тогда уже думаете как же это по http отправить, вместо Serial. (тем более, судя по "кнопки так и работают" - это вы уже умеете). Если не умеете - смотрите примеры где Arduino выступает http клиентом.
Конечно, на примерах я кое чему научился.
Буду дальше читать и изучать. Спасибо за подсказки и помощь.
на Уно уходит около 0,5 на чтение датчика ДХТ22, и пару секунд на соединение с сервером. Таким образом дуня шлет показания каждые 3 секунды (это если больше ничего нет в цикле). Периодичность посылки можно ограничить таймером. Сервер в любом (нормальном) случае пришлет ответ, но Вам ничего не мешает добавить свой текст к ответу и отловить на Ардуине.
К месту это будет сказано, или нет. Но при выборе структуры при построении концепции системы опроса датчиков и управления конечными устройствами, мне показалось такой способ намного лучше. Да, я реализовывал конечные устройства с посылкой данных на сервер, и это даже проще, чем их опрашивать (хотя особой разницы нет). Скорее у меня отсутсвует опыт программирования микроконтроллеров для решения всех моих желаний. И я собственно пошел по более простому пути для меня. Для меня это более удобно\привычно. В целом, микроконтреллер должен выполнять все алгоритмы сам, без участия компьютера, а компьютер необходим лишь для визуального контроля и ручного управления. Собственно перекладывать функцию опроса датчиков на сам датчик, не особо практично. При условии, что в квартире будет 10-20 датчиков, и уже вшитых в стены, на сколько практично будет их перепрограммировать на новые адреса сервера? Или после изменения свойств в таблице баз данных, не проще переписать скрипт на сервере, чем каждый отдельный датчик. Нужна универсальность и масштабируемость, но если эти данные писать в железку, то ничего этого не будет.
И да, в большой степени, lamp/apache сервер, это визуализация, упрощение ввода/вывода данных.
Сервер в любом (нормальном) случае пришлет ответ, но Вам ничего не мешает добавить свой текст к ответу и отловить на Ардуине.
Нафига? Если цель - положить показания датчика в базу? Зачем еще что-то отвечать, городить парсинг ответа на ардуине и т.п.? Послали данные - и все. Ну максимум проверили что http 200 вернулся (если нет - зажгли какую-то красную аварийную лампочку). И то... уже "по желанию".