enebularとラズベリーパイを利用してLINE Beaconを高速プロトタイピングしてみた


[micro:bit と LINE Beacon と Botを組み合わせたハンズオン]
(https://linedevkyushu.connpass.com/event/157340/?utm_campaign=event_message_to_selected_participant&utm_source=notifications&utm_medium=email&utm_content=title_link)に参加してきました。興味深かったのでラズベリーパイとenebularを利用して再現してみました。
<img width="853" alt="スクリーンショット 2019-12-23 1.22.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/e9ed233e-33b9-83a6-d725-7fabf35f8ddd.png">

enebularやラズベリーパイは自由に使える前提で話していきます。

＜使用機器＞
ラズベリーパイ3B+
MacBook Pro
Android携帯
Google Chrome

＜方法＞
LinMessagingAPI登録
enebularを利用してLINE Bot作成
ラズベリーパイをLINE Beacon化
動作確認

LinMessagingAPI登録
[こちらのサイト](https://developers.line.me/ja/services/messaging-api/)で今すぐ始めようをクリックして、LINEアカウントでログインします。
![スクリーンショット 2019-12-22 22.31.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/31dc3c1d-eb43-1829-d41b-719ca25242ef.png)



MessagingAPIのチャネルを作成します、
プロバイダーを新規に作成する前提で説明していきます。
providerでcreate a new providerを選択して、名前をつけていきます。
Channel name, Channel descriptionも任意に名前をつけてください。
このときlineという単語は使用できませんので注意してください。
カテゴリーとサブカテゴリーはプルダウンで任意に設定してください。
Email addressは使用しているアドレスを入力してください。
利用規約に同意して「作成」ボタンを押します
![スクリーンショット 2019-12-22 22.43.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/412b9387-d163-9a27-03a0-0f430ec1e385.png)


MessagingAPIの設定をしていきます
MessagingAPI設定タブに移動して、QRコードを利用して友達を追加します。

そこから下にスクロールしていくと
webhookの
設定がありますが、一旦おいておきます。

ここからenebularの設定にうつります
http inノードと http responseノード debugノードをつなげてデプロイします。
![スクリーンショット 2019-12-22 19.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/65655627-22f0-ba6e-3e6f-9fa840bd3bb5.png)

このときhttp inノードのメソッドはPOSTを選択して、URLには/lineをつけます。
![スクリーンショット 2019-12-22 22.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/58358689-0b5f-f253-f76d-c3abbffd5aa5.png)

右上のデプロイボタンの横のiボタンを押すとURLが表示されますのでメモしておいてください。
![スクリーンショット 2019-12-22 22.56.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/892902cd-8885-4340-4460-81ee3dcb2461.png)

LinMessagingAPIの設定に戻ります。
MessagingAPIの設定のwebhookに先程メモしたurlの最後に/lineをつけて入力します
(例)htps://example/line
![スクリーンショット 2019-12-23 1.02.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/9f1fe949-8e51-335b-d058-8673dd3cf677.png)

updateボタンを押してかくていして、Verifyボタンを押してwebhookが動いているかチェックします。
webhookを有効にするのを忘れないようにしてください
（自分は有効にするのを忘れていて、少しだけハマりました）

ここからはLINE Beaconの設定をしていきます
https://manager.line.biz/beacon/register
に接続して、LINE Simple BeaconのハードウェアIDを発行をクリックします。
アカウントリストの中から先ほど作成したMessagingAPIのアカウントを選択します。
ハードウェアIDの発行をクリックして発行されたIDはメモしておいてください。

ここからラズベリーパイの操作になります。
まずはパッケージをアップデートします
$sudo apt update

それからLinux向けのBluetoothに関連するパッケージをインストールします。

$sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev

インストールが終了したらコマンドを入力していきます。

基本的には[公式サイト](https://engineering.linecorp.com/ja/blog/detail/117/)からコピペします。

//発行されたHWIDを2桁ごとにスペースで区切ったものを指定
//ここは先程メモしたハードウェアIDを入力していきます
HWID='01 DE AD BE EF'
//ここから下はそのままコピペで大丈夫です
ADVERTISE_DATA="13 02 01 06 03 03 6F FE 0B 16 6F FE 02 ${HWID} 7F 00"
//Bluetooth HCIを有効にし、初期化します
sudo hciconfig hci0 up
//LE Controller Commands(OGF: 0x08), HCI_LE_Set_Advertising_Data(OCF: 0x0008) を実行し、
//出力データを設定します
sudo hcitool -i hci0 cmd 0x08 0x0008 ${ADVERTISE_DATA}
//Non connectable undirected advertising(3)で、Bluetooth LEのアドバタイズを有効にします
sudo hciconfig hci0 leadv 3

もしも
LE set advertise enable on hci0 returned status 12
が表示されたときはラズベリーパイを再起動してください

これで設定完了です。


スマートホンのLINEでビーコンの利用と位置情報の利用を許可をして
BLEをオンにすれば、ビーコンとして使用できるようになります。

自分の場合はenebularのフローにレスポンスを足して、ラズベリーパイに近づくと
botにメッセージが送信されるようにしました。
![スクリーンショット 2019-12-23 0.34.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/6c5d4b73-1361-ba45-e4ac-6eee956019e3.png)



＜まとめ＞
ラズベリーパイとenebularを使用することで、LINE Beaconのプロトタイプが高速で作れます。

更にenebularのフローを利用することで、botの連携やデータベースとの連携も簡単に利用できるので、近づいた回数に応じてメッセージを変更したり、時間に応じたメッセージを送信したりと、使い方は広がりそうです。

＜参考情報＞
https://qiita.com/yuukikawasaki/items/bf78d96e298bb947cba6
https://engineering.linecorp.com/ja/blog/detail/117/
https://qiita.com/torisankanasan/items/e258ee0ecfc10fb442a7