парсинг текста с arduino server
- Войдите на сайт для отправки комментариев
Чт, 31/07/2014 - 16:48
здравтвуйте, создал сервер на ардуино он отправляет клыенту дание( температура влажность...) на сервере(покашто денвер) пробую еты дание парсить и втавлять туда куда мне надо. есле брать оддельно html документ тот што в ардуино работает то всьо норм, php справляетса с задачей, но когда прбую парсить уже то што идьот с ардуино, вилитает ошибка
Warning: file_get_contents(http://192.168.10.123/$0) [function.file-get-contents]: failed to open stream: HTTP request failed! <!doctype html> inF:\home\localhost\www\arduino\asistant.phpon line 136
в чом проблема, может потому что ардуино отсилает каждую строчку html кода оддельно??
client.println("<!doctype html>"); client.println("<html>"); client.println("<head>"); client.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />"); client.println("<title>DATE</title>"); client.println("</head>"); client.println("<body>"); client.println("<div id='T_tepliza_1'>"); client.println(t); client.println(" </div>"); client.println("<div id='T_Server'>"); client.println(Whole); client.println("."); if (Fract < 10) { client.println("0"); } client.println(Fract); client.println("\n"); client.println(" </p>"); client.println("</div>"); client.println("<div id='T_Vul'>"); client.println(t1); client.println("</div>"); client.println("<div id='T_Dat_1'>"); client.println(t2); client.println("</div>"); client.println("<div id='T_Dat_2'>"); client.println(t3); client.println("</div>"); client.println("<div id='Vologa_1'>"); client.println(h); client.println("</div>"); client.println("<div id='Napruga_1'>"); client.println(V); client.println("</div>"); client.println("</body>"); client.println("</html>"); client.stop();
извените за ошибки ((
извлекаю дание таким способом
незнаю как удалить сообщения тут вставил не тот код и немогу его изменить поместил коментом више правельний код
IMHO в корне не верный подход... парсить Html страницу предназначенную "для воспрития человеком".
К чему создавать себе излишние сложности?
Человеку отдавать "красивую страницу".
А для Php-шного робота "чего попроще...". В том виде в котором "парсить удобней бедет".
Хотите xml, хотите json (что-бы сразу php-шные либы можно было юзазать).
Или в виде urlEncode, если от ардуины будет приходить строка типа "t_dat_1=12.5&td_dat2=15.6" -ее же всяко проще будет распарсить?
Или каждое значание, просто отдельной строкой:
Берешь каждую отделную строку, разбиваешь ее по знаку "равно". Первый элемент - имя параметра. Второй - значение.
Вообщем советую "изобрести свой формат ответа". Который парсить будет легче.
А то с html-лем.... замучаетесь в regex-сах :) А потом, захочится чуток дизайн сменить, дописать какому-нибудь div-чику css-класс и "весь парсинг пошел лесом".
Или еще один параметр передавать заходите... через пол-годика.... поверте, заново написать регексы может оказатся проще чем проадейтить имеющиеся (то есть "переписать парсер с нуля"). Поддерживать регексы - ОЧЕНЬ трудно.
P.S. А судя по ошибке, похоже у вас не с парсингом проблема, а вообще с получением ответа от ардуины. Прежде чем браться за парсинг, просто сохраните то что пришло от ардуины в файлик. И посмотрите что-же там в реальности приплыло.... Кстати на этом файлике и парсер отлаживать будет удобней...
http://192.168.10.123/$0 - WTF?
да и в адресе у Вас не имя файла, а весь тэг "а"
Кстати наличие знака $-доллара в урле - мягко говоря "странно". Если он там реально есть, если это не выбрыки "форумный движок покоцал урлы" - обратите на это внимание. Ваш вызвыаемый Url - выглядит странновато.
$ ето знак для ардуино после которого есле чтото приходит он формирует новую страницу с даними, или виполняет действие, например нажимаем на силку 192.168.10.123/$1 включитса релюшка на виводе 5, 0 - ардуино отправляет клиенту дание от датчиков, их я думл парсить на другом сервере и всталять дание на красивую страницу потомушто ардуино нетянет то што я создал)) я так понял для него максимум пару табичек и пару кнопок больше нетянет)) а также парсить их дание в андроид приложение. Вот такя мисль, может ето очень плохой способ нз я только учусь) знак $ бил в примере "управление ардуино силками", там можна и без него а можно и заменить но я так оставил.
а можете дать какието силке как лутше зделать?))
"да и в адресе у Вас не имя файла, а весь тэг "а""
я каждие дание поставил в оддельний div
file_get_contents('file.php'); - хорошо
file_get_contents('< href="sdsd">sdsds</a>'); - плохо, не будет такого файла
$ - это либо пременная в php, либо данные для $_GET, но тогда должно быть 192.168.10.128/?$
вот что приходит с ардуино по слке 192.168.10.123/$0
и вот что приходит на ардуино
вот код ардуино чтоби вы могли хоть чтото видить) но сразу говорю много лишнего и нелепого, необращайте внимание главное ето веб часть. спасибо что помогаете)
А для Php-шного робота "чего попроще...". В том виде в котором "парсить удобней бедет".
Хотите xml
заінтересовало)) попробовал xml действительно проще и удобней, но опять же та ошыбка, тоесть создал пробний файл
и начал его парсить вот так:
всьо отлично работает когда xml файл на компе , но с ардуино непрогружает его, тоесть несохраняет в переменную видает ошыбку
Warning: simplexml_load_file(http://192.168.10.123/A0) [function.simplexml-load-file]: failed to open stream: HTTP request failed! in F:\home\localhost\www\arduino\DATE.php on line 9
Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://192.168.10.123/A0" in F:\home\localhost\www\arduino\DATE.php on line 9
Fatal error: Maximum execution time of 30 seconds exceeded in F:\home\localhost\www\arduino\DATE.php on line 9
прошу помощи.
PS: когда иду по адрису к ардуино (192.168.10.123/А0) то вижу страницу с xml файло, тоесть какби всьо ок должно бить((
вот код ардуино
Во первых
date - число (календарная дата), свидание, деловая встреча
data - данные.
Во вторых... я уже вам говорил: вначале получите данные от ардуины, сохраните в файл. Вы же упорно пытаетесь парсить данные, не решив проблему их получения.
Из php. Это по Php мануалам нужно рыть как внешние данные получать.
Или... буквально в начале недели... по сайту поищите, вы же не пырвый сталкиваетесь с необходимостью читать с помощью php. Буквально три дня назад была тема родственная: majordomo-arduino не получается снять показания | Аппаратная платформа Arduino
Уверен, при желании и еще найти можно...
А еще лучше - на Php-шных сайтах искать ответ. Раз "браузер открыват", а Php-нет, то проблема именно в php-коде. Как-то не так запрос шлет. Вначале не обязательно парсить ответ ардуины. Вначале можно и xml-льку, отдавать тоже с компа... научится ее ПОЛУЧАТЬ.
Или научится получать любую первую попавшуюся страничку из интернета...
извените я может неправильно обяснил, php работает как вы сказали "Вначале можно и xml-льку, отдавать тоже с компа... научится ее ПОЛУЧАТЬ". так вот он получает когда скомпа и обрабативает нормально, а с ардуино нет(
Я с php не работает, но вот три минуты гугления дают такие направления "копания":
http://php.net/manual/en/function.simplexml-load-file.php
Note:
Libxml 2 unescapes the URI, so if you want to pass e.g. b&c as the URI parameter a, you have to callsimplexml_load_file(rawurlencode('http://example.com/?a=' . urlencode('b&c'))). Since PHP 5.1.0 you don't need to do this because PHP will do it for you.
Или
http://stackoverflow.com/questions/11335187/simplexml-load-file-error-in-php-5-3
ini_set('allow_url_fopen', 'on');
или
Вообщем нужно просто задаться целью: "научиться что-то получать с помощью Php". И рыть в этом направлении.. php-шные ресурсы.
Да и вообще, просто учится разбираться с http протоколом.
извените я может неправильно обяснил, php работает как вы сказали "Вначале можно и xml-льку, отдавать тоже с компа... научится ее ПОЛУЧАТЬ". так вот он получает когда скомпа и обрабативает нормально, а с ардуино нет(
Давайте посмотрим что я писал:
P.S. А судя по ошибке, похоже у вас не с парсингом проблема, а вообще с получением ответа от ардуины. Прежде чем браться за парсинг, просто сохраните то что пришло от ардуины в файлик. И посмотрите что-же там в реальности приплыло.... Кстати на этом файлике и парсер отлаживать будет удобней...
Вообщем вначале нужно, все-таки "научится с помощью Php получать от ардуины ответ".
А "файлик с компа", можно открывать тоже по разному.
Можно "как локальный файл" (и, действительно, с этого стоит начинать, так как это проще. так что "глупой работы" - вы не сделали).
А можно получать его именно "как веб-ресурс", через апач (или что-там у вас стоит).
Обращаться к нему именно по Http
Как-то так к нему будет выглядеть путь http://localhost/mytestdata/adruinoAnswer1.xml
Как-то так к нему будет выглядеть путь http://localhost/mytestdata/adruinoAnswer1.xml
вот так я к нему и обращаюсь, всьо работает
я так понял php неудаетса записать дание из ардуино в переменную, даже когда иду напрямую по силке к ардуино, в мониторе порта ардуино вижу что он чтото принял, а вслучае запуска скрыпта через денвер я невижу запроса к ардуино
а может бить что денвер не работает с локальними ip ??
Как-то так к нему будет выглядеть путь http://localhost/mytestdata/adruinoAnswer1.xml
вот так я к нему и обращаюсь, всьо работает
Именно в php "так обращаетесь"? Или в браузере?
Если "в php", то....
Все равно вам нужно добиться "получать ответ от ардуины" (я выше давал вам ссылочки где обсуждается подобное). И сохранять в файл. ДО ПАРСИНГА. Просто получить все "как строку". И сохранить в файл. Не анализируя.
Потом "ответ" от
http://localhost/mytestdata/adruinoAnswer1.xml сохраните в localResponse.txt
А ответ от
http://192.168.10.123/A0 сохранить в arduinoResponse.txt
потом открываете оба эти файлика и ищите "в чем между ними разница".
да действительно денвер неработает с домашней сеттю, извените за потраченое время, буду искать ришение))
а может бить что денвер не работает с локальними ip ??
Если верить вашим словам, что вы файлик получаете как http://localhost/...., то как раз с локальными - все работает. Вы же сказали что получая файлик именно таким образом у вас все работает.
А вот 192.168..... - это уже "внешний", и действительно настройки секьюрности могут помешать (опять-таки в сообщении #13 была ссылка где и эта версия упоминается. allow_url_fopen)
спасибо вам за помощ!!))
А вот 192.168..... - это уже "внешний", и действительно настройки секьюрности могут помешать (опять-таки в сообщении #13 была ссылка где и эта версия упоминается. allow_url_fopen)
Нда? Все интересней и интересний! И давно 192.168 стало внешней подсетью? Она конечно может быть ДРУГОЙ подсетью, но она все равно зарезервированна для внутрених нужд, также как две других.
Нда? Все интересней и интересний! И давно 192.168 стало внешней подсетью? Она конечно может быть ДРУГОЙ подсетью, но она все равно зарезервированна для внутрених нужд, также как две других.
Контест-то не теряйте. По отношению к текущему компу, любой адресс кроме 127.0.0.NNN это уже ВНЕШНИЙ.
Речь-то шла о разнице между ЛОКАЛЬНЫМ файлом. С ЭТОГО же компа, и получением ресурса с ДРУГОГО.
Вот стоит у меня, скажем какой-то злобный вайервол (прямо на компе).
Который проги не выпускает в интернет, если я буду ему писать разрешительное правило, как оно будет называться? А вот так: outgoing connection. Даже если я буду стучаться на соседний комп. В этой же подсети.
При это, при доступе к 127.0.0.1 - никаких проблем у меня не будет. Так как это ЛОКАЛЬНЫЙ адрес.
Вообщем понятие "внешний/внутренний" это субъективная штука. Такая я же как и скорость. Зависит от где мы сидим.
Вы путаете - 127.0.0.х это просто ДРУГАЯ подсеть. Вот ведь как, у меня локальный хост на 192.168.2.1
Если ТС без всяческих изменений накатил XAMP, то у него наверняка будет 127.0.0.1, но и от этого 192. не станет внешней.
outgoing - исходящий, тоже мимо :) Я могу свой фаерволл настроить что он на 127.0.0.2 пускать только по разрешению будет, и это правило будет называться outgoing - я буду менять сеть?
Вы путаете - 127.0.0.х это просто ДРУГАЯ подсеть. Вот ведь как, у меня локальный хост на 192.168.2.1
Да. 192.168.2.1 у вас тоже будет "локальным". Потому что этот "этот же компьютер". И большинство политик секьюрити, по дефолту, будут разрешать доступ к нему.
А вот на другие компы - будет не пускать. По дефолту.
И контекст обсуждения был именно таков. В чем может быть различие между доступом на Localhost, и 192.168.XXX.XXX. Даже если этот комп находится в этой же подсети.
Кстати слово "подсети" - употребили вы первым. А изначально шло про "адресс". Локальный и не локальный.
Хотите - изобретите другой термин.
Или вы хотите сказать что доступ на локальный комп, и на комп в локальной подсети не имеет никаких различий? И говотить что в этом и могла быть причина - не нужно?
Или различия, все-таки, есть? А если есть, то откуда они берутся? Вот мой ответ имено в этом и состоит: потому что 192.168.10.123, по отношению к компу на котором является php является ВНЕШНИМ ресурсом. НЕ ЛОКАЛЬНЫМ. Не потому что он 192.168... а потому что это другое устройство. Пусть даже и из этой же подсети. Поэтому с Localhsot он может открывать его спокойно, а с 192.168.10.123 - иметь проблемы.
outgoing - исходящий, тоже мимо :) Я могу свой фаерволл настроить что он на 127.0.0.2 пускать только по разрешению будет, и это правило будет называться outgoing - я буду менять сеть?
Речь шла не про то кто вы можете настроить своим файерволом и как извратиться...,а про то как называются, в принципе эти соединения. Исходящие и входящие (в случае русской винды). Какая терминология используется для их описания.
всьотаки проблема неищерпана, настроил денвер, тепер к ардуино идет запрос от php, но всьоравно ошибка
Warning: simplexml_load_file(http://192.168.10.123/A0) [function.simplexml-load-file]: failed to open stream: HTTP request failed! <?xml version='1.0' encoding='utf-8'?> in F:\home\192.168.10.239\www\DATA.php on line 9
всьотаки проблема неищерпана, настроил денвер, тепер к ардуино идет запрос от php, но всьоравно ошибка
Warning: simplexml_load_file(http://192.168.10.123/A0) [function.simplexml-load-file]: failed to open stream: HTTP request failed! <?xml version='1.0' encoding='utf-8'?> in F:\home\192.168.10.239\www\DATA.php on line 9
Перечитайте сообщение №17
Почему, судя по ошибке, вы пытаетесть загрузить с помощью simpletexml-load-file?
Речь шла не про то кто вы можете настроить своим файерволом и как извратиться...,а про то как называются, в принципе эти соединения. Исходящие и входящие (в случае русской винды). Какая терминология используется для их описания.
Ага, у меня значит это "извращения", а у Вас файервол с зачатками разума и сам настраивается?
В чем может быть различие между доступом на Localhost, и 192.168.XXX.XXX. Даже если этот комп находится в этой же подсети.
Кстати слово "подсети" - употребили вы первым. А изначально шло про "адресс". Локальный и не локальный.
Хотите - изобретите другой термин.
Вы можете и дальше "давить авторитетом", но хоть почитайте про обозначения и классы сетей. И от том как подсети обозначаются, из чего состоит IPv4. А то человек Вам поверит, на профильный форум зайдет и ни за что получит.
Вы можете и дальше "давить авторитетом", но хоть почитайте про обозначения и классы сетей. И от том как подсети обозначаются, из чего состоит IPv4. А то человек Вам поверит, на профильный форум зайдет и ни за что получит.
Ну так раскажите, со своим авторитетом как правильно называть.
Только не нужно про "классы сетей". Еще раз:
Кстати слово "подсети" - употребили вы первым. А изначально шло про "адресс". Локальный и не локальный.
Дайте свою терминологию. Я действительно в сетях "поверхностно". согласен. ровно на уровне "решить текущую проблему и забыть". не админ. девелопер, но... по опыту знаю, что открывать http://localhost и http://какой-то комп (пусть даже и в локальной сетке) - довольно часто бывают "два разных анекдота". И часто по дефолту, секьюрность ничего не имеет против localhost, 127.0.0.1 и проч. IP шники, которые навешены на локальный комп, но не пускает на любой внешний IP. Который не "текущий комп". Вот про эту мысль я и пытался сообщить. Что на профильных форумах нужно помотреть как настраивать секуьюрность для того что-бы иметь взможность "получить что-то снаружи" (снаружи компа!!!!)
Ну вот я их называют "внешний" (по отношению к текущему). Просто потому что когда в Outpost-те, или виндовом файерволе привык что в случае подобных проблем я настраиваю правила именно для входящих и исходящих соединений. И когда включаю их в режим "обучения", то мне выскакивает алерт типа "программа запрашивает ИСХОДЯЩИЕ соединине, разрешить?" даже когда я стучусь на 192.168.0.0
Есть более правильный термин? OK. Назовите.
Только не нужно опять про "подсети" начинать. Дайте название двум IP-шникам. Что-бы их можно было различить в контектсе текущей проблемы.
:D
Объясняю:
192.168.2.1 - IP
192.168.2.XXX - подсеть, мать её! Как бы Вас это не раздражало :)
так же как 192.168.ХХХ.ХХХ и 192.ХХХ.ХХХ.ХХХ
Второй возможностью описания подсети является завершающий ноль: 192.168.2.0
это стандартные обозначения. Если я напишу что у меня потребление бойлера 1,5тВ и буду подразумевать что это 1,5 тысячи Ватт что Вы мне ответите?
127.0.0.1 — это адрес локального компьютера. Он используется для тестирования сетевых программ и взаимодействия сетевых процессов. При попытке отправить пакет по этому адресу данные не передаются по сети, а возвращаются протоколам верхних уровней, как только что принятые. При этом образуется как бы «петля» - loopback. В IP-сети запрещается использовать IP-адреса, которые начинаются со 127. Любой адрес подсети 127.ХХХ.ХХХ.ХХХ относится к локальному компьютеру.
Существует также специальные адреса, которые зарезервированы для несвязанных локальных сетей — это сети, которые используют протокол IP, но не подключены к Интернет. Вот эти адреса:
10.0.0.0 (сеть класса А, маска сети 255.0.0.0) 172.16.0.0 — 172.31.0.0 (16 сетей класса В, маска каждой сети 255.255.0.0) 192.168.0.0 —- 192.168.255.0 (256 сетей класса С, маска каждой сети 255.255.255.0)
То что существуют подсети... и для них есть название... и классы... совсем не означает что "про них обязательно нужно упоминать в любом разговоре". И использовать именно термины сетей.
Вы не поленились, подробно расписали про сети. Но... на сам вопрос - вы так и не ответили. Как называть IP-шники?
Ну попробую еще раз, на примерах.
На компе у меня крутиться процесс.
ipconfig /all
говорит что у него есть такие адреса:
10.14.6.114
192.168.1.151
192.168.56.1
Процесс что-то пытается "достать по http".
Если он делает обращение на адреса
"192.168.1.151","192.168.56.1","10.14.6.114","127.0.0.1" - все замечательно, на дефолтных настройках.
если же он пытается обратиться к 192.168.1.150 - уже облом. И к 8.8.8.8 - тоже, и к 192.168.1.10 - тоже не проходит. "Что-то мешает".
То есть у меня есть два множества IP-шников. "с которыми работает" и "с которыми не работает". Что-бы решить проблему я пытаюсь понять "в чем между ними разница". И для этого, естественно, я пытаюсь как-то их обозвать. Каждое множество - своим термином.
Я заметил, что те адреса с которыми работает, все принадлежат тому-же компу с которого запускается процесс. Поэтому их я назвал "локальные". Все остальные - не является адресом компа на котором выполняется процесс. Поэтому их я назвал "внешние". Адреса, а не подсети!!! Они принадлежать к разным подсетям. К связанным и не связанным. Но назвать их мне нужно одним словом.
Ну или так:
Дано: комп с адрессом 192.168.1.150. на нем крутиться процесс.
ардуина с адресом 192.168.1.10
Как вы назовете, по отношению к процессу, адресс 192.168.1.150? А адресс 192.168.10?
IP это IP, от Вашего желания называть это по своему ясности для ТС не прибавится.
при маске 255.255.255.0 - назову "пофигу" потому как они в одной подсети ))))
я искренне верю что в самом последнем адресе неумышленно "1" упустили. Иначе получится разговор двух глухих. За сим откланиваюсь - Вы так и не ответили на мой вопрос про бойлер мощностью 1,5тВ
Вы так и не ответили на мой вопрос про бойлер мощностью 1,5тВ
А что тут не понятно, на каждой атомной электростанции такой есть.
IP это IP, от Вашего желания называть это по своему ясности для ТС не прибавится.
А я IP и называю IP. Вопрос в том что IP-тоже разные бывают.
Квартира - это тоже квартира. Только если когда сижу в своей квартире, то это "дом", а все остальное "другие квартиры". "Другие" и в доме, и в райное и проч. И принципиальная отличие что я имею право делать в кватире зависит от этого. От того "моя" она или нет.
А не от того к этом же доме она, или через два квартала от меня.
я искренне верю что в самом последнем адресе неумышленно "1" упустили.
Конечно. Тем более на пару строк выше этот же адресс фигурировал в более расширенном примере.
Который вы - проигнорировали.
Вообщем, в итоге, получилось вы не имеете различных названий для этих двух IP-шников.
И почему с одним работает, а с другим - нет, вы даже обсуждать не можете.
Потому что и то и другое "просто IP".
Иначе получится разговор двух глухих. За сим откланиваюсь - Вы так и не ответили на мой вопрос про бойлер мощностью 1,5тВ
Конечно глухих, я уж не знаю сколько. Сколько раз я сказал что речь идет про IP-шник, а вы все сети лепите.
А про бойлер, так это, простите, вы привели "анти-пример". Вы проиллюстрировали именно свой подход.
"Если я напишу что у меня потребление бойлера 1,5тВ и буду подразумевать что это 1,5 тысячи Ватт что Вы мне ответите?"
Так вот, я в "бойлерной терминологии". Янаписал про бойлер. На 1.5кВ, а вы тут же начали рассказывать про то как нужно организовывать работу ТЕЦ обслуживающий город миллионник, отправлять читать как грамонтно подстанции организовыать, логистику подвоза топлива и т.п.
И верно вы все, про ТЕЦ рассказываете, только проблема в том, что пробки выбивает у меня в квартире. От бойлера на 1.5кВ. И энциклопедичность на уровне Тепло-Энергетического-Фактультета - мне совершенно, в данном случае, не нужна.
Возвращается к баранам, скорее всего нужно будет либо где-то в файерволе просто разрешить для процесса делать исходящие соединения, либо где-то в настройках php сделать какое-нибудь allow_что-то-там=true
Без всяких подсетей, масок, классов сетей и т.п.
Вот это упертость! Маладца! Комментировать "это" нет желания.
Возвращается к баранам, скорее всего нужно будет либо где-то в файерволе просто разрешить для процесса делать исходящие соединения, либо где-то в настройках php сделать какое-нибудь allow_что-то-там=true
Без всяких подсетей, масок, классов сетей и т.п.
Угу. Если не поможет - протирайте монитор, пыль на нем иногда не дает обращаться к адерсу 192.ХХХ.656.ХХХ.