ESP8266 / Slack > Slackのチャネルにメッセージを投稿する ( SSL認証失敗版 )

```txt:使用機材
ESP-WROOM-02 ユニバーサル基板実装
```

ESP8266からSlackへの投稿をしようとしている。

参考 http://qiita.com/kiyopikko/items/4c525103700f52cb2894
参考 http://www.iotforest.com/2016/3/4/esp8266-arduino-feather-huzzah-using-slack-integration
参考 http://nyanko-omori.hatenablog.com/entry/2016/08/14/144918

## v0.1

### code > WiFi設定

WifiConfig.h : 
自分のアクセスポイントを記載したファイル。
**<font color=red>注意: GitHubなどにチェックインしないこと</font>**

例

```
static const char *kSsid = "pi-31415-g";
static const char *kPass = "47voyager";
```

### code > Slack設定

slackConfig.h :
Slackのチャネル、Incoming WebHooksなどの設定ファイル。

**<font color=red>注意: GitHubなどにチェックインしないこと</font>**

例

```
static const char *kSlackUrl = "/services/PIPIPI/NAPIER/3141592653589793228";
static const String kSlackChannel = "#amazon_dash";
static const String kSlackUsername = "7of9";
```

kSlackUrl にはIncoming WebHooksのURLの`/services/`から始まる文字列を設定する。

### code > 本体

参考のリンクのコードをもとに以下としました。

```c:esp2866_161230_slack
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include "WifiConfig.h" // for [kSsid],[kPass]
#include "slackConfig.h" // for [kSlackUrl]

/*
 * v0.1 Dec. 31, 2016
 *   Based on:
 *   http://qiita.com/kiyopikko/items/4c525103700f52cb2894
 *   http://www.iotforest.com/2016/3/4/esp8266-arduino-feather-huzzah-using-slack-integration
 * 
 */

static const char *kSlackHost = "hooks.slack.com";
static const int kHttpsPort = 443;

void WiFi_setup()
{
  WiFi.begin(kSsid, kPass);
  while( WiFi.status() != WL_CONNECTED) {
    delay(500); // msec
  }
  Serial.println(WiFi.localIP());
}

void slack_submit()
{
  WiFiClientSecure client;

  // connect
  if (!client.connect(kSlackHost, kHttpsPort)) { 
    Serial.println("slack connection failed");
  } else {
    Serial.println("slack connection: OK");    
  }

  // SSL Certificate finngerprint for the host
  const char* fingerprint = "‎‎‎‎ab f0 5b a9 1a e0 ae 5f ce 32 2e 7c 66 67 49 ec dd 6d 6a 38";
  // verify the signature of the ssl certificate
 if (client.verify(fingerprint, kSlackHost)) {
   Serial.println("ssl cert matches");
 } else {
   Serial.println("ssl cert mismatch");
 }

  // submit
  String message = "test from ESP8266";
  String payload="payload={\"channel\": \"" + kSlackChannel + "\", \"username\": \"" + kSlackUsername 
  + "\", \"text\": \"" + message + "\", \"icon_emoji\": \":ghost:\"}";
  Serial.println(payload.c_str());

  client.print("POST ");
  client.print(kSlackUrl);
  client.println(" HTTP/1.1");
  client.print("Host: ");
  client.println(kSlackHost);
  client.println("User-Agent: ArduinoIoT/1.0");
  client.println("Connection: close");
  client.println("Content-Type: application/x-www-form-urlencoded;");
  client.print("Content-Length: ");
  client.println(payload.length());
  client.println();
  client.println(payload);

  // リクエストを受け取る前に5秒以上は待った方がいいらしい
  delay(7000);

  while(client.available()) {
    String line = client.readStringUntil('\r');
    Serial.println(line);
  }
  client.stop();
}

void setup() {
  Serial.begin(115200);
  Serial.println(""); // to separate line

  WiFi_setup();
  slack_submit();
}

void loop() {
  // put your main code here, to run repeatedly:
}
```

ESP8266を起動すると1回だけSlackへ投稿します。

```txt:結果

192.168.10.2
slack connection: OK
ssl cert mismatch
payload={"channel": "#amazon_dash", "username": "7of9", "text": "test from ESP8266", "icon_emoji": ":ghost:"}
```

以下のように、投稿ができた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ef889833-217b-da87-bb93-55280123e655.png)


`ssl cert mismatch`となっている点は来年の課題だ。