前提・実現したいこと
arduinoでslackに投稿したいです。
当方はWEB系プログラマーをしていますが、arduinoに関しては初めて触るため、知見がありません。
基本的なところから分っていないと思いますので、確認方法なんかも教えていただけると嬉しいです。
- arduino自体はwifi付きの互換機を使用しています。
https://www.amazon.co.jp/gp/product/B07H7F4KW3/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1
- arduino側は、wifiのスポットをスキャンするプログラムの動作確認ができてるので、本体と、wifiのチップには問題ないと認識しています。
- slackはワークスペースにアプリを作成済みで、vscodeのrest crientから投稿は出来ています。
POST /services/xxxxxxxxxxx/xxxxxxxxxxx/xxxxxxxxxxxxxxxxxx Content-type: application/json Host: hooks.slack.com:443 { "text": "xxx" }
発生している問題・エラーメッセージ
以下のコードの箇所で正常とならず、connection failedと扱われます。
client.connect(kSlackHost, kHttpsPort)
log
1setup start=== 2WiFi_setup start === 3connecting... 4connecting... 5connecting... 6connecting... 7connecting... 8connecting... 9connecting... 10192.168.32.129 111 120 13WiFi_setup end === 14setup ------ 15slack_send start === 16slack connection failed 17ssl cert mismatch 18 19kSlackHost:hooks.slack.com 20kSlackUrl:/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxx 21payload:payload={"text": "test from ESP8266", "icon_emoji": ":ghost:"} 22 23slack_send end === 24setup end===
該当のソースコード
C++
1#include <ESP8266WiFi.h> 2#include <ESP8266Ping.h> 3#include <WiFiClientSecure.h> 4 5static const char* kSlackUrl = "/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxx"; 6static const char* kSlackUsername = "arduino_bot"; 7static const char* kSsid = "xxxxxx"; // WifiのSSID 8static const char* kPass = "xxxxxx"; // Wifiのパスワード 9static const char* kSlackHost = "hooks.slack.com"; 10static const int kHttpsPort = 443; 11 12void WiFi_setup() 13{ 14 Serial.println("WiFi_setup start ==="); 15 WiFi.begin(kSsid, kPass); 16 while ( WiFi.status() != WL_CONNECTED) { 17 Serial.println("connecting..."); 18 delay(500); // msec 19 } 20 Serial.println(WiFi.localIP()); 21 Serial.println(Ping.ping("www.google.com")); 22 Serial.println(Ping.ping(kSlackHost)); 23 24 Serial.println("WiFi_setup end ==="); 25} 26 27void slack_send() 28{ 29 Serial.println("slack_send start ==="); 30 WiFiClientSecure client; 31 32 // connect 33 if (!client.connect(kSlackHost, kHttpsPort)) { 34 Serial.println("slack connection failed"); 35 } else { 36 Serial.println("slack connection: OK"); 37 } 38 39 // SSL Certificate finngerprint for the host 40 const char* fingerprint = "xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx"; 41 42 // verify the signature of the ssl certificate 43 if (client.verify(fingerprint, kSlackHost)) { 44 Serial.println("ssl cert matches"); 45 } else { 46 Serial.println("ssl cert mismatch"); 47 } 48 49 // submit 50 String message = "test from ESP8266"; 51 String payload = "payload={\"text\": \"" + message + "\", \"icon_emoji\": \":ghost:\"}"; 52 Serial.println(); 53 Serial.println(String("kSlackHost:") + kSlackHost); 54 Serial.println(String("kSlackUrl:") + kSlackUrl); 55 Serial.println(String("payload:") + payload.c_str()); 56 Serial.println(); 57 client.print("POST "); 58 client.print(kSlackUrl); 59 client.println(" HTTP/1.1"); 60 client.print("Host: "); 61 client.println(kSlackHost); 62 client.println("User-Agent: ArduinoIoT/1.0"); 63 client.println("Connection: close"); 64 client.println("Content-Type: application/x-www-form-urlencoded;"); 65 client.print("Content-Length: "); 66 client.println(payload.length()); 67 client.println(); 68 client.println(payload); 69 70 delay(7000); 71 72 while (client.available()) { 73 String line = client.readStringUntil('\r'); 74 Serial.println(line); 75 } 76 client.stop(); 77 Serial.println("slack_send end ==="); 78} 79 80void setup() { 81 Serial.begin(9600); 82 Serial.println("setup start==="); 83 WiFi_setup(); 84 Serial.println("setup ------"); 85 slack_send(); 86 Serial.println("setup end==="); 87} 88 89void loop() { 90 // put your main code here, to run repeatedly: 91}
試したこと
原因として疑ったのは
- fingerprintが正しくない
→PCのchromeのdev toolにあるslack.comの証明書から指紋SHA-1を取得して使っていて、問題ない認識です
- インターネットに接続できていない
→ 接続後にwww.google.comへpingを送って通っているように見えますので問題ない認識です。
補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。