前回、M5Stack から Slack へ投稿する挑戦中 やっていたものから、slack.com に投稿ができたので、ひとまず解決。
起動時に送信するだけなので、setup 関数に全て埋め込んでしまっているが、本来は M5Stack のスイッチを押したときとか、定期的なタイミングで温度センサーから読み込んで投稿、みたいなのを考えている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <Arduino.h> #include <WiFi.h> #include <WiFiMulti.h> #include <HTTPClient.h> #include <M5Stack.h> WiFiMulti wifi; #define WIFI_SSID "<SSID名>" #define WIFI_PASS "<SSIDパスワード>" const char *server = "hooks.slack.com" ; const char *json = "{\"text\":\"from arduino m5stack message.\",\"icon_emoji\":\":ghost:\",\"username\":\"m5stackpost\"}" ; const char * slack_root_ca= \ "-----BEGIN CERTIFICATE-----\n" \ "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n" \ "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" \ "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n" \ "QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n" \ "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n" \ "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n" \ "9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n" \ "CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n" \ "nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n" \ "43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n" \ "T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n" \ "gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n" \ "BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n" \ "TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n" \ "DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n" \ "hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n" \ "06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n" \ "PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n" \ "YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n" \ "CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n" \ "-----END CERTIFICATE-----\n" ; HTTPClient http; void setup() { // put your setup code here, to run once: wifi.addAP(WIFI_SSID, WIFI_PASS); Serial.begin(115200); M5.begin(); M5.Lcd.println( "send slack" ); while (wifi.run() != WL_CONNECTED) { delay(500); M5.Lcd.printf( "." ); } M5.Lcd.println( "wifi connect ok" ); // post slack M5.Lcd.println( "connect slack.com" ); http.begin( server, 443, "/services/XXXX/XXXX/XXXX" , slack_root_ca ); http.addHeader( "Content-Type" , "application/json" ); http.POST((uint8_t*)json, strlen(json)); M5.Lcd.println( "post hooks.slack.com" ); } void loop() { // put your main code here, to run repeatedly: } |
ポイントは,
- WiFiMulti でアクセスポイントの接続
- HTTPClient を使う。
- HTTPClient::begin で hook.slack.com に https 接続する。このとき、slack.com の証明書を指定する。
- HTTPClient::POST() で JSON 形式のデータを POST する。
ESP32 絡みで、HTTP プロトコルを作る例はいくつかあるのだけど、きちんと POST できるのは「HTTPClient」であった。標準で「HttpClient」ってのがあるけど、これは動かない。
Windows ではじめるM5Stack – Qiita
https://qiita.com/xzr_tw/items/3363a500b4503e424d8b
espressif/arduino-esp32: Arduino core for the ESP32
https://github.com/espressif/arduino-esp32
の中にある https://github.com/espressif/arduino-esp32/blob/master/libraries/HTTPClient/src/HTTPClient.h を見ると、HTTPClient の各種メソッドが想像できる。マニュアルがあるかどうかわからないのだけど、まあ、github で HTTPClient.cpp を見ればよい。
内部で、WiFi.h と WiFiClientSecure.h がインクルードされているので、WiFiClientSecure を使って HTTP プロトコルのヘッダ部をちまちま作るよりもベターかもしれない。
slack に送る json の形式と URL アドレスは、
C# で Slack に投稿する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/9117
で作ったものを使っている。
起動して、アクセスポイントに接続、その後 slack に投稿する。
PC の slack クライアントにリアルタイムに表示されるので、なかなか面白い。
何に使うか?
データ蓄積ならば、azure か aws の IoT Hub を使って情報蓄積するところで、それだと HTTP の GET で十分だったりする。ただ、何かの閾値を超えた(高温になったとか、ドアが開いたとか)場合には、何らかの警告をユーザーに示しておきたいわけで、大抵の場合はメール通知を使うか、専用のクライアントアプリを使うのだが(スマホの通知とか?)、もっとお手軽&試作的なところでは slack の通知を使うと便利だろう。まあ line でもいいんだけど、line の場合は電話番号が必要なので slack のように捨てメールアドレスで作れると便利だったりする。
M5Stack の場合は LCD が標準で付いているので、定期的に web api を叩いて表示するってのもできる。同じことはラズパイやPC等でもできるのだが、電力が少なくて済む(5V0.5A程度の範囲でよい)ってのがよい。ああ、Orange Pi でもいいんだけど、そっちのほうは別途ためしてみる。