Я использую 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()
{
}
Почему вы печатаете только один символ? Вы должны получить полный ответ, чтобы узнать, что произойдет. Имейте в виду, что вам нужно разобрать заголовки от ответа. Чтобы найти это, найдите последовательность \ r \ n \ r \ n. После этого у вас есть данные вашего тела с XML. – tilz0R
Является ли ваш компьютер в той же сети и доступен для доступа в Интернет? Если да, перейдите в cmd и введите команду «ipconfig». Проверьте маску подсети на Arduino и убедитесь, что она соответствует вашему компьютеру. Если он отличается от других частей вашей сети, вы можете иметь только частичную связь. – mberna
Спасибо, я изменил код после вашего предложения. Я также проверил маску подсети, все устройства находятся в одной подсети, я отредактировал исходное сообщение, чтобы объяснить. – quackers1