スイッチサイエンスさんで売り切れだったので、Aliexpress から M5Stackを買いました。ってことで、どうせならば Slack に投稿してみようとして挑戦中
M5Stackでビットコインの価格を表示 – Qiita
https://qiita.com/eggman/items/36d30e01bf64f4a71516
Arduino – ESP32 WiFiClientSecure ライブラリで、安定して https ( SSL )記事をGETする方法 | ページ 3 / 3 | mgo-tec電子工作
https://www.mgo-tec.com/blog-entry-arduino-esp32-ssl-stable-root-ca.html/3
このあたりを参考にして
- WiFi に接続させる
- slack.com の証明書をプログラムに埋め込む
- slack.com に https で POST する
ってことをやります。
下記は、まだ投稿ができていないけど、途中までのコード。
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include <Arduino.h> #include <WiFi.h> #include <WiFiMulti.h> #include <HTTPClient.h> #include <WiFiClientSecure.h> #include <M5Stack.h> WiFiMulti wifi; #define WIFI_SSID "<WiFiのSSID>" #define WIFI_PASS "<WiFiのパスワード>" 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" ; WiFiClientSecure client; 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 const char *server = "hooks.slack.com" ; const char *postdata = "{\"text\":\"from arduino m5stack message.\",\"icon_emoji\":\":ghost:\",\"username\":\"m5stackpost\"}" ; M5.Lcd.println( "connect slack.com" ); client.setCACert(slack_root_ca); if (!client.connect(server, 443)) { M5.Lcd.println( "Connection failed!" ); return ; } else { M5.Lcd.println( "Connected to server!" ); // client.println("POST /services/XXX/XXX/XXX HTTP/1.1"); client.println( "POST https://hooks.slack.com/services/XXX/XXX/XXX HTTP/1.0" ); client.print( "Host: " ); client.println( server ); client.println( "Content-Type: application/json" ); char buf[20]; client.print( "Content-Length: " ); // client.println("Connection: close"); client.println(); client.println( postdata ); Serial.println( postdata ); M5.Lcd.println( "post slack.com" ); } } void loop() { // put your main code here, to run repeatedly: } |
WiFiに接続させる
WiFiMultiを使って、addAP でアクセスポイントに接続する。WEP しか繋がらないような気もするので、WEP で用意しておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <WiFi.h> #include <WiFiMulti.h> #define WIFI_SSID "<WiFiのSSID>" #define WIFI_PASS "<WiFiのパスワード>" WiFiMulti wifi; void setup() { M5.begin(); M5.Lcd.println( "send slack" ); wifi.addAP(WIFI_SSID, WIFI_PASS); while (wifi.run() != WL_CONNECTED) { delay(500); M5.Lcd.printf( "." ); } |
HTTPSで繋げるための準備
Slackに投稿するのに https が必要なので、相手の証明書をプログラムに埋め込む。
Arduino – ESP32 WiFiClientSecure ライブラリで、安定して https ( SSL )記事をGETする方法 | ページ 2 / 3 | mgo-tec電子工作
https://www.mgo-tec.com/blog-entry-arduino-esp32-ssl-stable-root-ca.html/2
を参考にして、slack.com の証明書を slack_root_ca として保存する。
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 | 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" ; WiFiClientSecure client; client.setCACert(slack_root_ca); if (!client.connect(server, 443)) { M5.Lcd.println( "Connection failed!" ); return ; } else { M5.Lcd.println( "Connected to server!" ); ... } |
443ポートにWiFiClientSecureで接続すればok. ちなみに証明書が違っている場合は、client.connect がエラーを返す。
SlackへPOSTする。
hook.slack.com へは JSON形式で POST するので、HTTPプロトコルのヘッダを真面目に作る。
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 | void setup() { ... const char *server = "hooks.slack.com" ; const char *postdata = "{\"text\":\"from arduino m5stack message.\",\"icon_emoji\":\":ghost:\",\"username\":\"m5stackpost\"}" ; M5.Lcd.println( "connect slack.com" ); client.setCACert(slack_root_ca); if (!client.connect(server, 443)) { M5.Lcd.println( "Connection failed!" ); return ; } else { M5.Lcd.println( "Connected to server!" ); // client.println("POST /services/XXX/XXX/XXX HTTP/1.1"); client.println( "POST /services/XXX/XXX/XXX HTTP/1.0" ); client.print( "Host: " ); client.println( server ); client.println( "Content-Type: application/json" ); char buf[20]; client.print( "Content-Length: " ); // client.println("Connection: close"); client.println(); client.println( postdata ); Serial.println( postdata ); M5.Lcd.println( "post slack.com" ); } } |
POST するときのアドレスは、
C# で Slack に投稿する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/9117
で作った Incoming WebHooks ものを流用。
で、結果は?
このコードを M5Stack に転送して動かすと、slack.com に繋がって POST しているように見えるのだが…
slack のほうには送られてこないんだよね orz 同じ JSON データを C# で送った場合は大丈夫なので、SSL あたりが違うか、ヘッダ部分が違うのか。
ひとまず、いきなり HTTPS は段階が大変なので、一度 HTTP で繋げられるWEB APIサーバーを作って再開してみる。