きっかけ
IoT工作をしていて、センサからの値が基準を超えたらLINE botを通じてPushメッセージを送りたくなった。 メッセージの中身は固定にした。
コード
#include <WiFiClientSecure.h> WiFiClientSecure client; const int HTTP_PORT = 443; const char* HOST = "api.line.me"; String url = "/v2/bot/message/push"; String pushMessage(){ Nefry.print("connecting to "); Nefry.println(HOST); if (!client.connect(HOST, HTTP_PORT)) { Nefry.println("connection failed"); return "connection failed"; } String json = R"({ "to": "UUID","messages": [{"type": "text","text": "Hello, world!"}]})"; String auth = R"(Authorization: Bearer YOUR_TOKEN)"; client.println("POST " + url + " HTTP/1.1"); client.println("Host: " + String(HOST)); client.println("Content-Type: application/json"); client.println("Connection: Keep-Alive"); client.println("Content-Length: "+ String(json.length())); client.println(auth); client.println(""); client.println(json); client.println(); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Nefry.println(">>> Client Timeout !"); client.stop(); return "Client Timeout" ; } } String line = ""; while(client.available()) { line = client.readStringUntil('\r'); Nefry.print(line); } Nefry.println("closing connection"); return line; }
ハマりどころ
Raw文字列を使う
String json = '{\"to\":\"UUID\",\"messages\"[{\"type\":\"text\",\"text\":\"Hello, World!\"}]}';
としていたがうまく送れなかったためRaw文字列を使った。
Raw文字列
R"()"で囲った中の文字列はエスケープしなくてもよいというもの参考−生文字リテラル
あとがき
curlのログを見てそのとおりに一行ずつ出力してやれば動いた。 HTTPリクエストの理解が進んだ。
参考
[Web] HTTPリクエストの中身を学んでみた。GETやPOSTの違いなど HTTP通信でリクエストを投げる HTTPとPOSTとGET