WiFiClientSecure でなく HTTPClient を使って M5Stack から HTTPS で AirTable にデータを書き込むメモ
WiFiClientSecure でなく HTTPClient を使って M5Stack から HTTPS で AirTable にデータを書き込むメモです。
背景
https://www.1ft-seabass.jp/memo/2021/10/07/m5stack-airtable-api-connect/
以前、こちらの記事を書いたのですが、HTTPClient というライブラリも使いやすそうなので、試してみます。
コードを書いていく中で、以下の記事が参考になりました。ありがとうございます。
- ESP8266でHTTP GETするならWiFiClientじゃなくてHTTPClientのほうが良い - Androidのメモとか
- 【ESP32】JSONをPOSTするには?HTTPClientがおすすめ! | ばすにっきTips
- M5Stick-CでJsonをPOSTする - Qiita
- HTTPClientライブラリリファレンス
Arduino ソースコード
ソースコードはこちらです。HTTPClient は追加インストールすることなく ESP32 で使えます。
また、コード内で設定するものは、以前の M5Stack から HTTPS で AirTable にデータを書き込むメモ のときと同じです。くわしくはそちらをご覧ください。
#include <M5Stack.h>
#include <HTTPClient.h> // WiFiClientSecure から HTTPClient 変更
// Wi-FiのSSID
char *ssid = "<Wi-FiのSSID>";
// Wi-Fiのパスワード
char *password = "<Wi-Fiのパスワード>";
void setup() {
// init lcd, serial, but don't init sd card
// LCD ディスプレイとシリアルは動かして、SDカードは動かさない設定
M5.begin(true, false, true);
// スタート
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(10, 10);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(2);
// Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す
Serial.print("START"); // Arduino のシリアルモニタにメッセージを出す
M5.Lcd.print("START"); // M5Stack LCDディスプレイにメッセージを出す(英語のみ)
// WiFi 接続開始
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
// Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す
Serial.print(".");
M5.Lcd.print(".");
}
// WiFi Connected
// WiFi 接続完了
M5.Lcd.setCursor(10, 40);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(2);
// Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す
// 前のメッセージが print で改行入っていないので println で一つ入れる
Serial.println(""); // Arduino のシリアルモニタにメッセージを出し改行が最後に入る
M5.Lcd.println(""); // M5Stack LCDディスプレイにメッセージを出す改行が最後に入る(英語のみ)
// Arduino のシリアルモニタ・M5Stack LCDディスプレイ両方にメッセージを出す
Serial.println("WiFi Connected."); // Arduino のシリアルモニタにメッセージを出す
M5.Lcd.println("WiFi Connected."); // M5Stack LCDディスプレイにメッセージを出す(英語のみ)
}
void send_message(String msg) {
// AirTable ホスト
String airtableHost = "api.airtable.com";
// AirTable の自分のトークン
// https://airtable.com/account から自分の API Key を反映します。
String airtableToken = "<AirTable の自分のトークン>";
// AirTable の Base 名
// https://airtable.com/api に各Baseでの HTTP 仕様が確認できるので、そこから Base ID を反映します。
String airtableBaseName = "<AirTable の Base 名>";
// AirTable の Table 名
// Table 名は、AirTable の表示上では Table 1。
// %20 はスペースを HTTP で送るためにエンコードしているので Table%201 と指定しています。
String airtableTableName = "Table%201";
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(10, 10);
M5.Lcd.println("-> AirTable send data");
Serial.println("-> AirTable send data");
M5.Lcd.print("msg: ");
Serial.print("msg: ");
M5.Lcd.println(msg);
Serial.println(msg);
// 送るデータを JSON で。
String queryString = "{\"records\": [{\"fields\": {\"Name\": \"" + msg + "\"}}]}";
// URL 作成
String url = "https://" + airtableHost + "/v0/" + airtableBaseName + "/" + airtableTableName;
HTTPClient httpClient;
// URL 設定
httpClient.begin(url);
// Content-Type
httpClient.addHeader("Content-Type", "application/json");
// Authorization
httpClient.addHeader("Authorization", "Bearer " + airtableToken);
// ポストする
int status_code = httpClient.POST(queryString);
if( status_code == 200 ){
String response = httpClient.getString();
M5.Lcd.println("sended.");
Serial.println("sended.");
M5.Lcd.println("response:");
M5.Lcd.println(response);
}
httpClient.end();
delay(2000);
}
void loop() {
M5.update();
if (M5.BtnA.wasReleased()) {
// A ボタンを押したらテキストメッセージを送る
send_message("Pushed A");
} else if (M5.BtnB.wasReleased()) {
// B ボタンを押したらテキストメッセージを送る
send_message("Pushed B");
} else if (M5.BtnC.wasReleased()) {
// C ボタンを押したらテキストメッセージを送る
send_message("Pushed C");
}
}