Arduino以太网解析XML

时间:2017-02-06 22:40:56

标签: http get arduino

我正在使用Arduino Uno和以太网盾来从OpenWeatherMap.org提取xml数据。我有api链接和一个密钥,它在Web浏览器上运行正常。我的代码如下,但是当我从GET命令读取响应时,我得到的只是“ÿ”,而不是我期望的任何内容。

我可以在使用它作为服务器时连接到arduino,我可以从命令提示符ping它,所以我知道它在网络上并且主板没有错,所以它必须是我的代码。我已经按照arduino网站上的教程并将示例加载到GET数据,但这也不起作用,我得到的只是“没有连接”的消息。

有人可以查看我的代码,看看我做错了吗?

编辑:我添加了额外的循环来打印所有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()
{

}

1 个答案:

答案 0 :(得分:0)

首先,您的主机标头错误,仅使用域名:

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

我在这里看到的第二个问题是你没有从服务器读取整个响应但只读取一个char。 您必须等待响应数据可用,然后读取所有数据并解析它或在开始时打印。

这部分错了:

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);
}