讀取開放資料並顯示在「序列埠監控視窗」。範例檔:「7.OPENDATA_Json_Sample.ino」。
1.連線環保署: https://data.epa.gov.tw/api-term,申請API KEY。
2.API KEY會在申請完成後,寄到會員帳號所設定的Email。
#include <WiFiClientSecure.h>
char SSID[] = "test"; //請修改為您連線的網路名稱
char PASSWORD[] = "12345678"; //請修改為您連線的網路密碼
char host[] = "data.epa.gov.tw";
//申請API key 環保署: <https://data.epa.gov.tw/api-term>
char url[] = "/api/v2/aqx_p_432?offset=0&limit=1000&format=json&api_key=自己申請的API KEY"; // Server URL
WiFiClientSecure client;
void setup() {
Serial.begin(115200);
//連線到指定的WiFi SSID
Serial.print("Connecting Wifi: ");
Serial.println(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
//連線成功,顯示取得的IP
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
IPAddress ip = WiFi.localIP();
Serial.println(ip);
//client.setInsecure(); //若使用ESP32 1.0.6核心須加上這句避免SSL問題
}
void loop() {
Serial.println("啟動網頁連線");
if (client.connect(host, 443)) {
Serial.println("連線成功,開始讀取內容");
// Make a HTTP request:
client.print("GET "); client.print(url); client.println(" HTTP/1.0"); //1.1改成1.0
client.print("Host: "); client.println(host);//
client.println("Connection: close");
client.println();
//等候回應
delay(2000);
Serial.println("\\n讀取表頭");
while (client.connected()) {
String line = client.readStringUntil('\\n');
Serial.println(line);
if (line == "\\r") {
Serial.println("\\n表頭結束");
break;
}
}
String payload = ""; //作為儲存原始資料使用
Serial.println("\\n讀取原始內容---------");
while (client.connected()) {
client.setTimeout(1000);
//一次讀取一句,如果只使用readString會讀取不完
String line = client.readStringUntil('\\n');
//去除空白字元
line.trim();
line.replace("\\r\\n", "");
//Serial.print(line);
payload += line ;
}
Serial.println("\\n原始內容結束----------");
payload = "[" + payload + "]"; //將JSON物件轉換成JSON陣列
Serial.println("\\nPayload=");
Serial.println(payload);
Serial.println("完成,關閉連線...");
client.stop();//斷線,網站設定同一IP在短時間內只能傳5次
}
else {
Serial.println("連線失敗...請再重試一次");
}
delay(300000);
}