2016-04-21 28 views
0

私のArduino Ethernet接続をクライアントとしてASP.NET Web APIAzureに接続しようとしています。 POSTにはAPIのデータが格納されており、MSSQL DBに保持されます。Arduino EthernetClientがWeb APIに接続できません

私はそれを動作させることができなかったので、私は基本的なEthernetClientの例に戻り、それらを動作させることを選択します。当初ArduinoがGETというリクエストを私のWebページに送り、その応答でHTMLデータを取得しました。そこに問題はありません。しかし、Web APIからJSONデータを取得しようとすると、エラーが発生します。

私はそれがダミーのJSONデータを送信するjsonplaceholder.typicode.comと呼ばれる公開テストAPIを見つけたので、それは私のWeb APIかもしれないと思った。これはどちらもうまくいかなかった。以下は、私は今で働いていたコードです:

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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x69, 0xE6 }; 
byte ip[] = { 192, 168, 0, 20 }; 
char server[] = "http://jsonplaceholder.typicode.com"; 

EthernetClient client; 

void setup() { 
    Serial.begin(9600); 
    if (Ethernet.begin(mac) == 0) { 
    Serial.println("Failed to configure Ethernet using DHCP"); 
    Ethernet.begin(mac, ip); 
    } 
    delay(1000); 
    Serial.println("connecting..."); 
    Serial.println(client.connect(server, 80)); // Returns -5. 
    if (client.connect(server, 80)) { 
    Serial.println("connected"); 
    client.println("GET http://jsonplaceholder.typicode.com/posts/1 HTTP/1.1"); 
    client.println("Host: jsonplaceholder.typicode.com"); 
    client.println("Connection: close"); 
    client.println("Content-Type: application/json"); 
    client.println(); 
    } 
    else { 
    Serial.println("connection failed"); 
    } 
} 

void loop() 
{ 
    if (client.available()) { 
    char c = client.read(); 
    Serial.print(c); 
    } 

    if (!client.connected()) { 
    Serial.println(); 
    Serial.println("disconnecting."); 
    client.stop(); 

    while (true); 
    } 
} 

Arduinoのは、私はシリアルモニターに次の出力を取得し、サーバーに接続しようとすると:

coconnecting... 
-5 
connected 

disconnecting. 

if (client.connect(server, 80))文の戻り-5それは不可能ではありません。 www.arduino.cc/en/Reference/ClientConnect可能な戻り値に応じて以下のように考えられる:

  • SUCCESS 1
  • TIMED_OUT -1
  • INVALID_SERVER -2
  • TRUNCATED -3
  • INVALID_RESPONSE -4

したがって、-5が返される可能性はありません。ああ、途中で。実際の例で自分のWebページに接続してHTMLデータを取得すると、同じ行から0が返されますが、これも可能な値ではありません。しかし、それはとにかくifステートメントに入ります。私はそれが1に入るために戻らなければならないと信じていただろう??

Web APIに接続できない理由について、誰もがわかりますか?私は違いがあってはならないということですか?前もって感謝します。

答えて

1

FacebookのArduinoユーザーグループのユーザーの助けを借りて、私はこの問題を幾分解決しました。だから、将来同じ問題に遭遇する人は、私の解答の説明があります。

問題は、ホスト名を渡すときにDNS解決にあるように見えます。 EthernetClient.connect()は、URLを解決するためにDNSClient.getHostByName()を呼び出します。なんらかの理由でこれはうまくいかない。私のC/C++能力の欠如は、私がなぜその理由を理解するのを妨げるのですか?しかし、最後にEthernetClient.connect()は、を返します。どちらもEthernetClientライブラリで未処理であり、文書化されていません。したがって、ArduinoはWeb APIに決して接続しません。

私の次の実験では、サーバーのIPアドレスをEthernetClient.connect()の代わりに渡すと接続することがわかりました。 HTTPヘッダーでは、要求のURLとHostヘッダーフィールドを渡すことができます。コード以下の作業溶液を示しています。

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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x69, 0xE6 }; 
byte ip[] = { 192, 168, 0, 20 }; 
byte serverIP[] = {54, 243, 62, 12}; // Get server IP address by running TRACERT on server hostname. 

EthernetClient client; 

void setup() { 
    Serial.begin(9600); 
    if (Ethernet.begin(mac) == 0) { 
    Serial.println("Failed to configure Ethernet using DHCP"); 
    Ethernet.begin(mac, ip); 
    } 
    delay(1000); 
    Serial.println("connecting..."); 
    if (client.connect(serverIP, 80)) { // Remember to pass IP address for server since DNS resolution apparently doesn't work. 
    Serial.println("connected"); 
    client.println("GET http://jsonplaceholder.typicode.com/posts/1 HTTP/1.1"); 
    client.println("Host: jsonplaceholder.typicode.com"); 
    client.println("Connection: close"); 
    client.println("Content-Type: application/json"); 
    client.println(); 
    } 
    else { 
    Serial.println("connection failed"); 
    } 
} 

void loop() 
{ 
    if (client.available()) { 
    char c = client.read(); 
    Serial.print(c); 
    } 

    if (!client.connected()) { 
    Serial.println(); 
    Serial.println("disconnecting."); 
    client.stop(); 

    while (true); 
    } 
} 

をしかし私は、DNS解決が動作しない正確な理由を見つけるしたいと思います。

https://github.com/arduino/Arduino/blob/master/libraries/Ethernet/src/EthernetClient.cpp

https://github.com/arduino/Arduino/blob/master/libraries/Ethernet/src/Dns.cpp

:誰もがここにも関連するライブラリであるならば
関連する問題