LINEビーコンの使い方memo

#はじめに

コロナの中において、混雑の判定などにビーコンの技術が使われ始めました。

>「横浜スタジアム技術実証でLINE Beaconを活用したトイレ等の混雑度計測・可視化にスイッチスマイルが技術協力」
https://prtimes.jp/main/html/rd/p/000000039.000023122.html

私も以前 「SwiftとiBeaconを使ってお母さんが自分の部屋に近づいて来た事を警告するアプリをつくる」
https://qiita.com/oggata/items/5de43d71692d1abcff7c
というような記事を書いたりしていましたが、2014年で、あれから6年も経過して様々なユースケースが出てきたのではないかと思います。

他にもLineビーコンに対応した自販機などが出てきており、自動販売機の操作によってポイントの付与などを行うことが可能となります。
![Image from iOS (19).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/1ccf3658-78bf-a3ab-1299-4c8e15fa7801.jpeg)



#前提条件

Webhookビーコンのイベントを受け取るためには...

1.LINEのプライバシー管理->LineBeaconのチェックボックスがON
2.ボットが紐付けられている公式アカウントを友達に追加

が必要。

#注意点

注意点は、この仕様に記載されているが、leaveが廃止予定であることと、bannerとstayにおいては別途申し込みが必要とのこと。上記の記事で書いてある混雑情報などはおそらくstayが必要であると考えられるが、おそらく負荷の問題が考えられるため、事前にLINE側に申請が必要と思われる。

https://developers.line.biz/ja/reference/messaging-api/#beacon-event

>ビーコンイベントのタイプ
beacon.type	説明
enter	ユーザーがビーコンの電波の受信圏に入りました。
leave	【2020年末に廃止予定】ユーザーがビーコンの受信圏から出ました。
banner	ユーザーがビーコンバナーをタップしました。
stay	ユーザーがビーコンの電波の受信圏に滞在しています。
このイベントは、最短10秒間隔で繰り返し送信されます。
bannerおよびstayイベントの利用をご希望の場合は、LINE for Business (opens new window)ウェブサイトからお問い合わせください。


#手順
##1.ビーコン端末を購入
電池を入れるとすぐにランプが点滅して10秒ほどで消える。壊れているのかと思ったが、これで正常な動作。

![Image from iOS (17).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/6d1e38fd-22a0-aef9-57aa-b94f7e303067.jpeg)
ここで購入できます。
https://beacon.theshop.jp/items/6617930

##2.Webhook用の環境を構築
npmなどであらかじめ環境を用意しておきます

```
$ npm init
$ npm install --save express @line/bot-sdk
$ touch index.js
```

##3.ビーコンのIDを連携する
![スクリーンショット 2020-11-27 10.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/17ae2b25-1cce-553e-da61-ccd8950d3dcd.png)

##4.MessageingAPIを設定する
TOP -> MessageingAPIのページを開き各種設定を行う

WebhookURL > 自分のサーバーアドレスを入れる

Allow bot to join group chats  > Enabled

Auto-reply messages  > Enabled

Greeting messages  > Enabled

Channel access token　> メモする


![スクリーンショット 2020-11-27 15.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/20b7805f-01c4-7bd9-474e-d654b638bdc9.png)


##5.LINE_ACCESS_TOKEN /  LINE_CHANNEL_SECRETを確認する

1.LINE_ACCESS_TOKEN -> 4.Channel access token　> メモするの手順の箇所
2.LINE_CHANNEL_SECRET -> BasicSettingsの中にあるchannel secret

##6.コードを記述する

最低限のコードはこのような感じ。

```index.js
const server = require("express")();
const line = require("@line/bot-sdk");
const line_config = {
    channelAccessToken: process.env.LINE_ACCESS_TOKEN;
    channelSecret: process.env.LINE_CHANNEL_SECRET;
};
server.listen(process.env.PORT || 3000);
const bot = new line.Client(line_config);
server.post('/bot/webhook', line.middleware(line_config), (req, res, next) => {
    res.sendStatus(200);
    let events_processed = [];
	if (event.type === 'beacon') {
		if (event.beacon.type === 'enter') {
            events_processed.push(bot.replyMessage(event.replyToken, {
                type: "text",
                text: "hello."
            }));
		}
	}
    Promise.all(events_processed).then(
        (response) => {
            console.log("${response.length} event(s) processed.");
        }
    );
});
```


#Conclusion

自宅で、ビーコンをonにしたまま、数日使ってみました。注意点は下記の通り。

+ バックグラウンドでは反応しないので、LINEを立ち上げたままにしておく必要がある
+ 一度enterが捕捉されてしまったら、範囲から一度でないと再度enterは呼ばれないが、leaveが廃止になったことで、範囲から出たことがわかりにくい。(enterの箇所にelseでleave相当の処理を記述しても、補足するときとしない時があるの正確ではなさそう)
+ 
範囲内で、再度LINEを立ち上げなおすと再度enterが走る(立ち上げなおすことでユーザーは無限にenterを呼ぶことができる)
+ ibeaconのようにビーコンからの距離が得られない。ビーコンからの距離が何メートルかという情報が得られないので、より狭い範囲で補足したい場合は、ビーコン側で届く範囲を調整する必要があるのでは？ (この記事で購入したビーコン端末は10mの範囲で補足してしまう）

何かサービスで利用する場合は、イベントタイプ的には、bannerなどでユーザーが自発的に呼ぶのが良いのかなと思いましたが、こちらは、申請が必要とのことでまだ確認できていません。