Чтения данных из WWW

format
Offline
Зарегистрирован: 27.06.2012

Здравствуйте коллеги, у меня вопрос. Хочу сделать такую вещь: на сайте есть РНР страница которая возвращает число от 0 до 9999 и есть ардуино которое через w5100 подключен к сайту и с LCD дисплеем, я хочу чтобы это число отображалось на дисплее с частотой раз в минуту. Подскажите как реализовать считывание данных с странички?

.c8r
.c8r аватар
Offline
Зарегистрирован: 15.11.2011

Тестовым примером из библиотеки Ethernet. Только поправьте адрес гугла на свой хост.

Ну, еще конечно, придеться парсить ответ сервера, чтоб вытащить искомое число. Как то так.

На дисплей тоже есть библиотечки с примерами. Соеденяйте! =)

format
Offline
Зарегистрирован: 27.06.2012

да точно ;) спасибо))) 

link26
Offline
Зарегистрирован: 28.06.2012

 Кстати делаю похожую вещь, если у вас полуичтся, напишите плз сюда как получилось

format
Offline
Зарегистрирован: 27.06.2012

хорошо, если не потеряю вас из виду, или оставте свои контакты 

leshak
Offline
Зарегистрирован: 29.09.2011

format пишет:

хорошо, если не потеряю вас из виду, или оставте свои контакты

link26 имел ввиду, скорее всего, не что "лично ему нужно", а "для будущих других". Типа думать о других, возможно будущих. Так что такие вещи "лучше сюда", а не в контакты.

>Ну, еще конечно, придеться парсить ответ сервера,

Общая идея "парсинга" ответа проста как угол дома (если не нужно проверять заголовки и т.п.). Найти "тело" самого ответа и в этом теле найти "интересующую инфу". Со вторым пунктом, конечно, уже зависит от конкретного случае а с первым - несложно.

По протоколу http признаком "конца заголовка ответа" (вообщем конец служебной инфы) являтся пусткая строка. Строка содержащая только "перевод строки" и больше ничего. Вообщем нужно найти первую подобную строку. Все что "дальше" - искомое тело (то что мы видим нажимая View Source в браузере).

Примерно так (просьба не плеватся на качество кода, не оптимален и крив... пока еще не проходил стадии codeReview и refactoring)

 // find reply body
	         boolean bodyFound=false;
			 boolean current_line_is_blank=false;
			 const char* body;
			 bool c;
			 for(int i=0;i<(int)strlen(reply);i++){
				 char c=reply[i];
				 if(c=='\n'){
					 if(current_line_is_blank) { // html body found
						 bodyFound=true;
						 body=reply+i+1; 
						 
						 break;

					 }
					 current_line_is_blank=true;
				 } else  if (c != '\r'){
					 current_line_is_blank = false; 
				 }

				

			 } // end find body



		         if(bodyFound){
			      Serial.print("Body:");
			      Serial.println(body);
                              // вот тут уже ищем нужные нам данные
			 } else Serial.print("Body not foudn");

На входе у нас reply - ответ сервера, на выходе bodyFound - признак получилось-ли найти тело, body - строка с ответом без служебной информации. Писалось для другого чипа, но подход тут не сильно отличается.

Иногда на "поиск тела" можно "забить". Например если в ответе нужно найти подстроку "SomeData=132", то можно тупо ее искать сразу во всем "ответе целиком". не заморчиваесь "разделением". Где найдется там и найдется.

И еще порекомендую к использованию такую тулзу как http://fiddler2.com/fiddler2/  - помогает подергать сервер, посмотреть что ему шлется "в сыром виде" и как он "отвечает", поигратся с заголовками и т.п. мденьню.

А еще многие сайты сейчас имеют всякие API. И уменю отвечать в JSON формате - его легче парсить чем "настоящий html". Можно загуглить "arduino json"

Ну либо, если сервер собственный, то можно изначально отвечать "как можно проще". С оглядкой на то как это легче парсить на ардуине.

Если хочется и "и браузером и ардуиной", можно, при запросе, посылать заголовки указывающие что "это арудуина" (User-Agent:arduino и Accept:text/plain), тогда обычному браузеру можно отдавать "красивый html", а ардуине "жутко упрощенную версию".

Я, в своем проекте, так и делаю - если запрос пришел от браузера - отдают xml (удобней читать глазами), если от javascript-а - отдаю ему данные в виде json, от ардуины - просто текстовую строку, максимально упрощенную.