M5Stack で LINE通知

- [前回](https://qiita.com/ryo_naka/items/4707cfd870819278f37f)

技術書典6で購入した[プリン本](https://anoken.jimdo.com/products/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%92%E5%AE%88%E3%82%8B%E6%8A%80%E8%A1%93/)を参考にいろいろと試してみる

# 通知
通知の機能としてLINEへ送信させてみる。
## LINE-BOT トークン作成
https://notify-bot.line.me/ja/

トークルームを選択するひつようがあるみたいなので、とりあえず1:1用のルームにする


## WiFi接続
LINEに送信するために通信がひつようなので、WiFiでの接続確認

が、つながらない。。

Aはダメなのかな。
Gに変更したら接続できたような感じがする。
でも実際に接続できているのかどうかはよくわからない。。


## Notify
LINEに対してNotify。
処理は正常に流れていそうなのだが、LINE側に通知が来ない。
WiFiの接続が上手くいっていないのか、それともLINEの方がおかしいのか。

トークンを別のものに変えてみてリトライ。

やはりだめ。
WiFiを変えてみる。
WiFiMulti.hを使った処理に変更
参考
https://www.mgo-tec.com/blog-entry-trouble-shooting-esp32-wroom.html/2


```
void wifi_connect() {  
  const char* ssid = "<SSID 2.5GHzのやつ>";
  const char* pass = "pass";
  M5.Lcd.println(ssid);

  WiFi.disconnect(true);
  M5.Lcd.printf(".");
  delay(1000);
  M5.Lcd.printf(".");
  WiFiMulti wifiMulti;
  wifiMulti.addAP(ssid, pass);

  while (wifiMulti.run() != WL_CONNECTED) {
    delay(500);
    M5.Lcd.printf(".");
  }
  M5.Lcd.println("wifi connect ok");
}
```
こんな感じの処理になった。

ログも追加させたことで接続できてそうかの確認はわかりやすくなった。
ということで、やっぱりWiFiは大丈夫そうな気がする。
※接続できているかどうかを簡単に確認できればいいんだけどな。

あとはAPIからのレスポンスを見てみないとようわからん。


## APIを直接実行してみる
curlで直接APIをたたいて、トークンが思ったように作成できているのかどうかを確認してみる。
https://notify-bot.line.me/doc/ja/

LINEに対してトークンで通知できるかを試す。

```
https://notify-api.line.me/api/status
Authorization:Bearer <token>
```
トークンが有効かを確認
200が返ってくるので大丈夫。

```
curl -X POST -H 'Authorization: Bearer <token>' -d 'message=foobar' \
https://notify-api.line.me/api/notify
```
通知もされる。
ということで、トークンはちゃんとできていることが確認できた。

この呼び方を[WiFiClientSecure client]に食わせてあげているのであればいいはず。
※要するにここの食わせ方が間違っているってことなんだろうな。


公式のドキュメントがどれなのかよくわからないので、適当にググって調査。
以下を参考にしてみる。
https://dotstud.io/docs/nefrybt-network-http-post/

```
curl -d '{"color":"green","message":"test","notify":false,"message_format":"text"}' -H 'Content-Type: application/json' https://xxxxxx.hipchat.com/v2/room/4651875/notification?auth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
これが、

```
String url = "/v2/room/4651875/notification?auth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  url += "&color=green&message=test&notify=false&message_format=text";

  Serial.print("connecting to ");
  Serial.println(HOST);

  if (!client.connect(HOST, HTTP_PORT)) {
    Serial.println("connection failed");
    return;
  }

  client.println("POST " + url + " HTTP/1.1");
  client.println("Content-Type: application/json");
  client.println("Content-Type: application/x-www-form-urlencoded");
  client.println("Host: " + String(HOST));
  client.println("Connection: close");
```
になるみたいなので

```
curl -X POST -H 'Authorization: Bearer <token>' -d 'message=foobar' \
https://notify-api.line.me/api/notify
```
は以下のようになるはず

```
String url = "/api/notify";
url += "&message=sample";
client.println("POST " + url + " HTTP/1.1");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Host: notify-api.line.me");
client.println("");

client.println("Connection: close");
```


client.println() で順番に食わせてあげればいいってだけなのかな。

が、400エラー。
[messageがないぞ]って怒られる。


ハマりすぎてよくわからなくなったので、別アプローチ。

https://qiita.com/sk_nimo/items/03e17059c0df703a5042

```
HTTPClient http;
http.begin("https://notify-api.line.me/api/notify?message=" + message);
http.addHeader("Authorization", "Bearer <トークン>");
int httpResponseCode = http.POST("POSTING from M5stack");
```

これで試してみたところ通知が送信されることは確認できた。
ただ、URLエンコードしてないと日本語は送信できない。
C++？でURLエンコードってどうやるんだろう？

ただ、とりあえず送信はできそうなので、次に行ってしまうことにする

というところでいったん終了。

次は音声を出力させたい。