2017-02-06 27 views
0

私はOpenWeatherMap.orgからXMLデータを引き出すためにArduino Unoとイーサネットシールドを使用しています。私は、APIリンクとキーを持っており、それはすべてWebブラウザ上で正常に動作します。私のコードは以下の通りですが、GETコマンドからの応答を読むと、私が得るのは "ÿ"です。私が期待するものではありません。Arduinoイーサネット解析XML

サーバとして使用しているときにarduinoに接続できます。コマンドプロンプトからpingして、ネットワーク上にあり、ボードに問題がないことを知っているので、自分のコードで何かする必要があります。私は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

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

は、のようなものであるべき?あなたは何が起こるかを見るために完全な応答を得なければなりません。 応答からヘッダーを解析する必要があることに注意してください。これを見つけるには、\ r \ n \ r \ nシーケンスを検索してください。その後、あなたはXMLを使って身体データを持っています – tilz0R

+0

あなたのコンピュータは同じネットワーク上にあり、インターネットにアクセスできますか?もしそうなら、cmdに行き、 "ipconfig"コマンドを入力してください。あなたのArduinoのサブネットマスクを確認し、あなたのコンピュータに合っていることを確認してください。それがネットワークの他の部分と異なる場合、部分的な接続しか持たない可能性があります。 – mberna

+0

ありがとう、私はあなたの提案の後にコードを変更しました。私はまた、サブネットマスクをチェックして、すべてのデバイスが同じサブネット上にある、私は説明するために元の投稿を編集しました。 – quackers1

答えて

0

、あなたのホストヘッダーが間違っている、唯一のドメイン名を使用します。私はここを参照してください

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

第二の問題は、あなたが全体のサーバーからの応答が、1文字を読んでいないということです。 応答データが利用可能になるのを待ってから、すべてのデータを読み込んで解析したり、開始時に印刷しなければなりません。

この部分は間違っている:あなたは、単一の文字を印刷するのはなぜ

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

2番目のループを修正しました。すべきではない!あなたがデータを読むことができる間にループしているからです。 – tilz0R

+0

ありがとう、それは同じループだったことは奇妙に思えました!しかし、それはまだGETコマンドからの応答を待つことに固執して、私は明らかに元の投稿を編集しました – quackers1