LINE Beaconの擬似無限プッシュでLINE公式アカウント無料枠の制限に立ち向かう話 #linedc #iotlt


こんにちは！ 12月ですね。IoTLTアドベントカレンダーの1日目の記事になります。

LINEビーコンを使うことで本来は有料なプッシュ機能の擬似無限プッシュがやれることをご存知でしょうか？今回はその辺の話を書いていきます。

> ![スクリーンショット 2022-12-01 14.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/0b996383-8639-4292-fa7c-ac8d9b34878f.png "スクリーンショット 2022-12-01 14.15.47.png")

作ったものとしては`LINEビーコンで無限プッシュなメンヘラ女子BOT`で、前回のIoTLTで発表した内容を記事化していきます。

> [![スクリーンショット 2022-11-30 23.55.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/a3f92ab9-e43a-673f-8a45-b9e9bbe1f32e.png "スクリーンショット 2022-11-30 23.55.11.png")](https://speakerdeck.com/n0bisuke2/linebikondewu-xian-putusiyunamenherabot-number-iotlt-number-esp32-number-linedc)
> ↑イラストのさおりちゃん、一発で生成した割には可愛いよ。

## LINE公式アカウントの無料枠の制限

### LINE Messaging APIのおさらい

LINE Botを開発する際に使えるAPIです。LINE公式アカウントの挙動などを自身でプログラムすることができます。

> https://developers.line.biz/ja/services/messaging-api/

まずはLINE Botを作りたいって方はこちらの記事をどうぞ

> [1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d)

LINE Messaging APIには大きく分けるとプッシュとリプライがあり、プッシュメッセージを使うことでユーザーに対してキャンペーンの通知などを行えるのでプッシュをみんな使いたいという印象です。

- プッシュ: アプリケーション側起点でユーザーにメッセージを配信
- リプライ: ユーザーがBOTに話しかけると返信

**リプライは無料で、プッシュは無償アカウントだと1000件/月メッセージを送れました。**

### LINE公式アカウントの改悪問題

改悪ってのは僕が言ったわけではなく世の中の記事が言ってます。はい。

> [公式LINEが超改悪へ！無料メッセージ数1000→200に！有料プランもメッセージ数激減！](https://jyurin-hack.com/it/?p=8304)

2022/10/31のニュースです。 **2023年6月以降**はこうなるみたいですね。

> ![スクリーンショット 2022-12-01 13.33.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/be8c85fb-2595-22ea-028a-1e3edfdbaf44.png "スクリーンショット 2022-12-01 13.33.52.png")

**従来は1000件/月まで無料でしたが、200通まで**となります。

> ![スクリーンショット 2022-12-01 13.36.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/93f418bf-47d5-1a23-056a-0003aa211c50.png "スクリーンショット 2022-12-01 13.36.59.png")

ということでLINE Beaconを使うとなんとかなるかもしれないというのが今日の話です。

## LINE Beaconを使うと...

### LINE Beaconって？（おさらい）

そもそもLINE ビーコンが最近あまり聞かないので初耳の人もいるかもしれませんが、LINE Messaging APIの機能の一部のような立ち位置で、登録しているビーコンデバイスとLINEアプリ（をインストールしているスマホ）が近づくと反応してメッセージを配信してくれる仕組みです。

ローソンやユニクロなどに行くとLINEで通知が来たりしますがLINEビーコンを使っているものだと思います。

> ![スクリーンショット 2022-12-01 13.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/0f2e7450-1b7b-0f8b-dbd8-c20c5d75ad95.png "スクリーンショット 2022-12-01 13.49.15.png")

### LINE Beaconのマイナー仕様

LINE Beaconに近づいた際に送信されるプッシュ通知は実は内部的にはリプライメッセージの扱いになっていて、 **何通送っても無料**の枠になっています。

> ![スクリーンショット 2022-12-01 13.51.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/cd316997-97f0-0478-de83-eda696534c2f.png "スクリーンショット 2022-12-01 13.51.05.png")

なので200通/月の制限は気にせずに **無限にプッシュメッセージを送れます。**

これが **擬似プッシュ**ってやつですね。僕が勝手に言ってます。

### LINE Beaconは自分で作れます。

また、法人向けのプランなどもあるのですが、簡易的に始める分にはLINE Beaconは自分で作ることもできます。

> ![スクリーンショット 2022-12-01 13.49.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/acc0f4f8-8b80-9579-0f00-38fb079dd49c.png "スクリーンショット 2022-12-01 13.49.38.png")

[LINE Simple Beacon](https://github.com/line/line-simple-beacon)という仕様が公開されいて、こちらをM5StackやObnizなどBLEが扱えるマイコンボードに実装できます。

ちなみに、少し高いですが公式のビーコンデバイスを購入することにより自分で実装しなくてもLINE Beaconを使うことができます。以前はLINE Beacon対応デバイスを販売している事業者があったのですが最近買えるのかは不明です。

> ![スクリーンショット 2022-12-01 13.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/97e55f0f-3ea5-7ce3-52a1-9a970fecc1f0.png "スクリーンショット 2022-12-01 13.57.34.png")
> https://beacon.theshop.jp/items/6617930

### LINE Simple Beaconとサードパーティライブラリ

通常は[この辺りを読んで](https://github.com/line/line-simple-beacon/blob/master/README.ja.md)ビーコンの実装していくと良いのですがサードパーティライブラリを作ってくれている人がいるので今回はライブラリを使わせてもらいます。

ちなみに公式GitHubでは以下のサードパーティライブラリが紹介されています。手持ちの

- microbit版: https://github.com/pizayanz/pxt-linebeaco
- obniz版: https://github.com/9wick/obniz-line-simple-beacon
- ESP32版: https://github.com/taichunmin/line-simplebeacon-esp32
- linkit7697版: https://github.com/taichunmin/line-simplebeacon-linkit7697

今回僕はうこ氏が作っている[Green Beacon](https://github.com/ukkz/green-beacon-esp32)というライブラリを使ってみました。中身分からなくても使えてありがたいです。

> [【ESP32 × LINE】たった2行でLINEビーコンが作れるライブラリをリリースしたよ](https://xor.hateblo.jp/entry/20200821/1598011200)

## 今回作るメンヘラ女子BOT

擬似無限プッシュを使って何ができるか考えた時にこんなものが思いついたので作っていきます。

> ![スクリーンショット 2022-12-01 17.25.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/2e86f8ec-d571-2c5d-cbe1-5eb2d0edca39.png "スクリーンショット 2022-12-01 17.25.17.png")

ちなみにさおりという名前ですが、"メンヘラ女子の名前"などでググると謎なランキング記事が出てくるのでそこから取って来てます。全国のさおりさんごめんなさい。僕ではなくその記事が言ってます。

> ![スクリーンショット 2022-12-01 17.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/222ff8bc-d18b-e150-e2ed-39daedede6f2.png "スクリーンショット 2022-12-01 17.27.30.png")

ちなみにアイコン画像は話題のお絵描きAIに描いてもらいました。

> ![スクリーンショット 2022-12-01 17.28.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/10087e3e-0dbd-af8f-29bb-c78b5f8c7cbc.png "スクリーンショット 2022-12-01 17.28.43.png")

## Seeed Studio XIAO ESP32C3でLINE Beaconを作る

実際に作っていきます。

今回は割と最近電子工作界隈で流行っているSeeed Studio XIAO ESP32C3を使って実装しました。

> ![スクリーンショット 2022-12-01 14.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/44c42a49-4e3b-046c-d380-dd0e24603b6e.png "スクリーンショット 2022-12-01 14.28.14.png")
> https://akizukidenshi.com/catalog/g/gM-17454/

940円でWi-FiもBluetoothも使えてめちゃ小さくて良いですね。
センサー類を扱う場合はピンをはんだ付けしないといけなくて面倒ですがビーコンとして使うのにはちょうど良い気もしています。

このサイズ帯だとM5Atom LiteやMatrixなどもありましたが、それらよりもまた一段と小さくて安いですね。

### ボードライブラリのインストール

[Seeedさんのブログ](https://lab.seeed.co.jp/entry/2022/08/22/120000)を参考に、Arduinoで開発していきますが、Arduino IDE 2系（v2.0.2）で解説します。
ちょっと前までの1系とはUIがかなり変わってますね。

設定の`Additional boards manager URLs`に`https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json`を追加します。

> ![スクリーンショット 2022-12-01 16.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/31847824-c43b-61c2-11b8-cc19c971f515.png "スクリーンショット 2022-12-01 16.29.22.png")

複数既にある場合は1番最後に追記しましょう。

> ![スクリーンショット 2022-12-01 16.29.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/282f6bd6-22ca-86f5-87a6-74e2d913ca18.png "スクリーンショット 2022-12-01 16.29.06.png")

次にボードマネージャーでesp32で検索し`esp32 by Espressif Systems`をインストールします。2.0.5が最新バージョンでした。

> ![スクリーンショット 2022-12-01 16.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/b6babe44-3916-70d6-df22-b4516209884a.png "スクリーンショット 2022-12-01 16.33.38.png")

### CPU温度を図るスケッチを書いてみる。

まずはXIAOの書き込みが問題ないかをチェックします。ケーブル、USBコネクタ、端末、色々とトラブルが起きることがあるので小さく試します。

Lチカを試したいところですが、以下のブログに書いてあったCPU温度を測るサンプルの方がパッと試せそうだったので試してみます。

> [Seeed Studio XIAO ESP32C3でBLE ① Arduino IDEで準備](https://www.denshi.club/cookbook/arduino/xiao-esp32c3/seeed-studio-xiao-esp32c3ble-1-arduino-ide.html)

```cpp
void setup() {
  Serial.begin(115200);
  Serial.println("Starting ");
}

void loop() {
  float temp = temperatureRead();
  Serial.println(temp);
  delay(2000);
}
```

パソコンとXIAOを接続します。

> ![スクリーンショット 2022-12-01 16.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/39e41ea3-7506-a60c-5f0f-9bfaecf30936.png "スクリーンショット 2022-12-01 16.43.51.png")


ボード選択で、Tools > Board > esp32 > XIAO_ESP23C3を選択します。

> ![スクリーンショット 2022-12-01 16.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/193327f5-300e-a6cc-96fb-d9f9292074f3.png "スクリーンショット 2022-12-01 16.39.09.png")

ここまで準備できたら、`チェックマーク`でまずはプログラムに問題がないか確認し、最後に`→マーク`から書き込みを行います。

> ![スクリーンショット 2022-12-01 16.45.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/83f3e729-131f-e32c-2a1f-7c947b2dc050.png "スクリーンショット 2022-12-01 16.45.51.png")

少し待つと問題なく書き込みできた模様です。

> ![スクリーンショット 2022-12-01 16.47.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/48c706af-e587-262d-e8e9-1a3f9ad50a79.png "スクリーンショット 2022-12-01 16.47.34.png")

右上の虫メガネのようなアイコンからシリアルモニタを開くとCPU温度が表示されます。

> ![スクリーンショット 2022-12-01 16.48.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/f313bd38-22f3-0a0c-7271-1803f9c10491.png "スクリーンショット 2022-12-01 16.48.06.png")

> ![スクリーンショット 2022-12-01 16.48.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/b0d6061d-e9f0-08ee-94ba-d3370e238e62.png "スクリーンショット 2022-12-01 16.48.14.png")

### LINE Simple BeaconのハードウェアIDを発行する

XIAOの書き込みがうまくいったので、いよいよライブラリをインストールしてLINE Beaconを作ってみたいですね。

ただその前にハードウェアIDというものを発行する必要があります。

（ここではLINE Botを作っておく必要があるので作ったことがない人は[こちらの記事](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d)などをみて作っておきましょう。）

まずは[LINE Official Account Managerのビーコンページ](https://manager.line.biz/beacon/register)にアクセスしてビーコンの登録をします。

> ![スクリーンショット 2022-12-01 16.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/4ddc8f93-3142-6826-d185-1e2c69061486.png "スクリーンショット 2022-12-01 16.53.25.png")

下の`LINE Simple BeaconのハードウェアIDを発行`を選択して進みます。

次にどのLINE Botと紐付けるかを聞かれるので紐付けるアカウントを選択しましょう。

> ![スクリーンショット 2022-12-01 16.54.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/4864af50-d574-8827-dbdd-768dbcf4f5e1.png "スクリーンショット 2022-12-01 16.54.47.png")

最後に`ハードウェアIDを発行`を選択しIDを発行しましょう。

> ![スクリーンショット 2022-12-01 16.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/dd2eb1ff-374c-d45c-bc31-4fed28e5ca62.png "スクリーンショット 2022-12-01 16.56.05.png")

### XIAOをLINE Beacon化する

いよいよプログラムの書き込みです。

Arduino IDE(2系)の左のサイドバーの本のマークからライブラリマネージャーを開きます。

`line beacon`と入れて検索すると`Green Beacon by uko`というライブラリが表示されるのでインストールしましょう。

> ![スクリーンショット 2022-12-01 16.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/dd35de8a-9625-7c84-3cab-afadb2f557be.png "スクリーンショット 2022-12-01 16.59.12.png")

インストールができたら以下のようなプログラムを書きましょう。

```cpp
#include "GreenBeacon.h"

void setup() {
  Serial.begin(115200);
  Serial.println("Starting ");  
  GreenBeacon beacon = GreenBeacon("016847ff51");
  beacon.start("Hello!");
}

void loop() {
  Serial.println("ビーコン起動中...");
  delay(2000);
}
```

`GreenBeacon()`の関数部分では発行したハードウェアIDを書き換えましょう。
`GreenBeacon beacon = GreenBeacon("0123456789");`みたいな書き換えになります。

書き換えることができたら`→マーク`からXIAOに書き込みをします。

書き込みが完了すると`ビーコン起動中...`とシリアルモニタに表示されます。

> ![スクリーンショット 2022-12-01 17.06.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/dcea56c3-94c4-e2e4-4c75-01855eef802f.png "スクリーンショット 2022-12-01 17.06.26.png")

確認用で書いてるだけなので実際にはloop関数内は何も書かなくてOKです。

これでLINE Beaconを作ることが出来ました。

### LINE Bot側の実装

もう少しです。LINE Bot側も少し変更する必要があります。

> ![スクリーンショット 2022-12-01 17.25.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/2e86f8ec-d571-2c5d-cbe1-5eb2d0edca39.png "スクリーンショット 2022-12-01 17.25.17.png")

こんな感じにメッセージをプッシュで送ってきますが、`beacon`イベントが飛んできてそこにreplyMessageで返してる実装になります。

```js
//省略

async function handleEvent(event) {
    if(event.type === 'beacon'){
        const words = ["ねぇ。どこにいるの？","ねぇ","連絡してよ","ねぇってば"];
        const word = words[Math.floor(Math.random() * words.length)];

        return client.replyMessage(event.replyToken, {
            type: 'text',
            text: word //実際に返信の言葉を入れる箇所
        });

    }else{
        
        return client.replyMessage(event.replyToken, {
            type: 'text',
            text: event.message.text //実際に返信の言葉を入れる箇所
        });
    }
}

//省略
```

ここまでで実装は完了です。お疲れ様でした。

## 200通制限からの解放。擬似無限プッシュを試す。

XIAOとスマホを近づけてみると反応してさおり(LINE Bot)が何か送って来ます。

> ![スクリーンショット 2022-12-01 17.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/1eebe591-db14-6b64-3fb0-f24103123067.png "スクリーンショット 2022-12-01 17.34.00.png")

この時LINE Botと友達になってないといけず、友達になってなくても通知っぽいものを出す時は有料になる模様です。

**これで200通の制限から解放(?)されましたね。**

LINE Beaconの圏内にいるという制限がありますが、圏内であれば無限に擬似プッシュが使えます。

## まとめと所感など

チップが若干過去のものと違うのでそのままの実装で動くか心配だったのでシンプルにXIAOシリーズでLINE Beaconが作れたのは嬉しかったです。

SeeedのXIAOは何個かシリーズがあって別のボードをずっと調べててハマったという沼があったのでみなさん気をつけてください。

> ![スクリーンショット 2022-12-01 17.37.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/b8db9865-8eaf-c65a-7cb2-e15cd46db083.png "スクリーンショット 2022-12-01 17.37.24.png")

擬似無限プッシュは半分冗談ですが、利用用途を限定すれば実は使えるシーンもあるような気がします。

> ![スクリーンショット 2022-12-01 17.38.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/3ff1a36a-e8e7-8682-d4fb-23e47e7d2b28.png "スクリーンショット 2022-12-01 17.38.39.png")


よくよく考えるとリアルにビーコン圏内にいるのに「どこにいるの？」はやばいやつですね。

> ![スクリーンショット 2022-12-01 17.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/fe459622-2881-be90-2b75-8f5ad6cab3a9.png "スクリーンショット 2022-12-01 17.41.13.png")

ということでアドベントカレンダー1日目でした！！

明日は@takurxさんの「絶縁ICのADuM1250でハマった話を書きます」とのことです！お楽しみに！