2015-06-07 56 views
2

我想做一個arduino天氣警報,從this website 我需要找到「主要」後的「天氣」中的引號內容。我找了一個文本查找程序,但是找到了一個arduino website,但它非常具有說服力,所以它可能不存在。arduino在網頁中找到文本

目前我的代碼看起來是這樣的:

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
char server[] = "api.openweathermap.org"; 

IPAddress ip(192,168,1,77); 

EthernetClient client; 

void setup() { 
    Serial.begin(9600); 
    while (!Serial) { 
    ; 
    } 

    if (Ethernet.begin(mac) == 0) { 
    Serial.println("Failed to configure Ethernet using DHCP"); 
    Ethernet.begin(mac, ip); 
    } 
    delay(1000); 

    if (client.connect(server, 80)) { 
    client.println("GET /data/2.5/weather?q=Melbourne,au HTTP/1.1"); 
    client.println("Host: api.openweathermap.org"); 
    client.println("Connection: close"); 
    client.println(); 
    } 
    else { 
    } 
} 

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

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

    while(true); 
    } 
} 

,並返回:

HTTP/1.1 200 OK 
Server: nginx 
Date: Sun, 07 Jun 2015 21:17:44 GMT 
Content-Type: application/json; charset=utf-8 
Transfer-Encoding: chunked 
Connection: close 
X-Source: redis 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Methods: GET, POST 

1d2 
{"coord":{"lon":144.96,"lat":-37.81},"sys":{"message":0.0117,"country":"AU","sunrise":1433626204,"sunset":1433660872},"weather":[{"id":800,"main":"Clear","description":"Sky is Clear","icon":"01n"}],"base":"stations","main":{"temp":284.532,"temp_min":284.532,"temp_max":284.532,"pressure":1011.27,"sea_level":1030.68,"grnd_level":1011.27,"humidity":80},"wind":{"speed":4.43,"deg":331.501},"clouds":{"all":0},"dt":1433711139,"id":2158177,"name":"Melbourne","cod":200} 

0 

這個輸出,我希望它說:Clear

+0

我不確定是否已經有一個文本查找器。但是你總是可以自己創造一個。所有你需要做的是逐個分析字符逐個解析緩衝區。不應該很困難。這將是一個嵌套ifs夫婦,例如,如果(buff [i ++] ==''''){if(buff [i ++] =='m'){...} – dhruvvyas90

回答

1

一個非常簡單的方法來獲得你需要的數據是來自Arduino遊樂場的TextFinder。我相信這應該起作用。請注意,我沒有測試它,所以手指交叉。

在開始時

#include <TextFinder.h> 
#include <String.h> 
String result = ""; 
TextFinder finder(client); 

然後修改你的循環()如果你有興趣加入這個這個

if (client.connected()){ 
    finder.find("\"weather\""); 
    finder.find("\"main\":\""); 
    char c = client.read(); 
    while(c != '\"'){ 
    result += c; 
    c = client.read(); 
    } 
    Serial.print(result); 
} 
if (!client.connected()) { 
    Serial.println(); 
    client.stop(); 
    while(true); 
} 

更多信息如下。

你得到的響應是json,爲了正確解釋它,你需要一個json解析器。我在github上發現了一個庫:ArduinoJson,用於解析arduino上的json。這似乎也很容易使用。如果您需要幫助,可以瀏覽它wiki

在開始分析json之前,您需要首先從響應中剝離標題。要做到這一點,你可以繼續閱讀字符,直到你得到一個雙重CRLF(\ r \ n \ r \ n)

+2

警告:我不是很高級! – Hazzdood

+0

我嘗試了它,但它說: weather.ino:7:20:錯誤:'客戶端'沒有在此範圍內聲明 weather.ino:函數'void loop()': weather.ino:44: 17:error:ISO C++禁止在指針和整數之間進行比較[-fpermissive] 編譯錯誤 – Hazzdood

+0

好吧,現在只是說: weather.ino:在函數'void loop()'中: weather.ino:44:17 :錯誤:ISO C++禁止指針和整數之間的比較[-fpermissive] 編譯錯誤。 – Hazzdood