2017-02-06 12 views
0

Я использую Arduino Uno и ethernet-экран, чтобы вытащить XML-данные с OpenWeatherMap.org. У меня есть ссылка api и ключ, и все это прекрасно работает в веб-браузере. Мой код ниже, однако, когда я добираюсь до ответа от команды GET, все, что я получаю, это «ÿ», а не то, что я ожидаю.Arduino Ethernet parsing XML

Я могу подключиться к arduino при использовании его в качестве сервера, и я могу выполнить его из командной строки, поэтому я знаю, что он находится в сети, и плата не виновата, поэтому это должно быть что-то с моим кодом. Я следил за учебником на сайте arduino и загружал пример в данные GET, но это также не работает, все, что я получаю, - это сообщение «не подключено».

Может кто-нибудь, пожалуйста, просмотрите мой код и посмотрите, что я делаю неправильно?

EDIT: Я добавил дополнительный цикл для печати всех данных xml, однако программа все еще застревает на while(!client.available());. Если я прокомментирую это, я доберусь до «ожидания ответа сервера», но никогда не буду дальше этого. Я проверил, что arduino si на той же маске подсети, что и все другие устройства в сети.

// Based on: 
// Read Yahoo Weather API XML 
// 03.09.2012 
// http://forum.arduino.cc/index.php?topic=121992.0 
// 


#include <SPI.h> 
#include <Ethernet.h> 
#include <TextFinder.h> 



int cityID=2644487; //Lincoln, UK 
byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02}; 
byte ip[] = {192, 168, 1, 89}; 
byte gateway[] = {192, 168, 1, 254}; 
byte subnet[] = {255, 255, 255, 0}; 
//Open weather map xml 
char server[] = "http://api.openweathermap.org"; 
int port = 80; //usually 80 for http. 
char APIkey[33] = "HIDDENAPIKEY"; 


EthernetClient client; 
char temperature[30]; 


void setup() 
{ 
    pinMode(10, OUTPUT); 
    digitalWrite(10,HIGH); 
    Serial.begin(9600); 
    Serial.println("Initialising..."); 

    // Start Ethernet 
    if(!Ethernet.begin(mac)){//if DHCP does not automatically connect 
    Serial.println("Invalid Connection"); 
    } 


    Serial.println(""); 
    Serial.print("Connecting to OWM server using cityID: "); 
    Serial.println(cityID); 
    Serial.print("Using API key: "); 
    Serial.println(APIkey); 

    if (client.connect(server,port)) 
    { 
    client.println("GET /data/2.5/weather?id=2644487&appid=HIDDENAPIKEY&mode=xml&units=metric HTTP/1.1"); 
    client.println("HOST: api.openweathermap.org"); 
    client.println(); 
    Serial.println("Connected to XML data."); 

    while(!client.available()); //wait for client data to be available 
    Serial.println("Waiting for server response..."); 
    while(client.available()){ 

     char c = client.read(); 
     Serial.println(c); 
    } 
    } 


} 

void loop() 
{ 

} 
+0

Почему вы печатаете только один символ? Вы должны получить полный ответ, чтобы узнать, что произойдет. Имейте в виду, что вам нужно разобрать заголовки от ответа. Чтобы найти это, найдите последовательность \ r \ n \ r \ n. После этого у вас есть данные вашего тела с XML. – tilz0R

+0

Является ли ваш компьютер в той же сети и доступен для доступа в Интернет? Если да, перейдите в cmd и введите команду «ipconfig». Проверьте маску подсети на Arduino и убедитесь, что она соответствует вашему компьютеру. Если он отличается от других частей вашей сети, вы можете иметь только частичную связь. – mberna

+0

Спасибо, я изменил код после вашего предложения. Я также проверил маску подсети, все устройства находятся в одной подсети, я отредактировал исходное сообщение, чтобы объяснить. – quackers1

ответ

0

Для начала, ваш заголовок узла неправильно, используйте только доменное имя:

client.println("HOST: api.openweathermap.org"); 

Вторая проблема, которую я вижу в том, что вы не читали весь ответ от сервера, но только один символ. Вам нужно подождать, пока будут доступны данные ответа, после чего прочитайте все данные и проанализируйте их или распечатайте при запуске.

Эта часть является неправильным:

char c = client.read(); 
Serial.println(c); 

Должно быть что-то похожее на:

while (!client.available()); //Wait client data to be available 
while (client.available()) { //Print all the data 
    char c = client.read(); 
    Serial.println(c); 
} 
+0

Спасибо за это, я добавил несколько дополнительных серийных отпечатков, чтобы увидеть, где код застревает, похоже, он не получает ответа от команды GET. Я никогда не получаю серийный отпечаток «Ожидание ответа сервера» Serial.println («Подключено к данным XML.»); while (! Client.available()); // ожидание доступности данных клиента Serial.println («Ожидание ответа сервера ...»); while (! Client.available()) { char c = client.read(); Serial.println (c); } – quackers1

+0

Я скорректировал второй цикл while. Не должно быть! потому что вы зацикливаете, пока доступны данные для чтения. – tilz0R

+0

Спасибо, мне показалось странным, что это был тот же цикл!однако он все еще застревает в ожидании ответа от команды GET, я отредактировал исходное сообщение, чтобы уточнить – quackers1