Raspberry Pi Zero W を LINE Simple Beacon にしてしまう

# はじめに
私ごとですが、今秋に新居に引っ越しました。
少しずつ新居で必要な家電を揃えていっているんですが、新居にBeaconがないことに気づきました。

これは問題です！

ということで、家にあったRaspberry Pi Zero W を LINE Simple Beacon にしてしまいたいと思います。

LINE Simple Beaconを選んだ理由は、なんとなく簡単そうだから。

ネット上を探しみても、Raspberry Pi Zero W をLINE Simple Beacon化した記事はまだなさそうだったので、できるかどうかの検証もかねてやってみます。

# LINE Simple Beaconとは？
> Raspberry Piを使って、自分で LINE Beacon 対応デバイスを製作することが出来る新しいオープンなビーコン仕様、それが「LINE Simple Beacon」です。
Bot開発者が、LINEプラットホームを通じて、Botと連携ずみのLINEユーザがビーコンデバイスに近づいたことをwebhookで受け取ることができます。（引用元：[ラズベリーパイでLINE Beaconが作成可能に！「LINE Simple Beacon」仕様を公開しました](https://engineering.linecorp.com/ja/blog/detail/117)）

[https://github.com/line/line-simple-beacon](https://github.com/line/line-simple-beacon)

# 開発
## 前提条件
・LINEのアカウントを持っていること
・初期セットアップが完了したRaspberry Pi Zero Wを持っていること

## 開発の流れ
1. Botの準備
2. ビーコンイベントを受信できるようにLINEアプリの設定
3. LINE Simple Beacon用のHWIDを発行
4. Raspberry Pi Zero W のセットアップ

## 1.Botの準備
まず最初に、LINE Botのアカウントが必要です。
もしまだお持ちでない場合は、[この辺の記事](https://qiita.com/nkjm/items/38808bbc97d6927837cd)とかいいと思いますので、見ながら作ってみてください。

LINE Botのアカウントを作成後、`チャネル基本設定`の画面に、

<img width="1279" alt="LINE_Developers.png (276.7 kB)" src="https://img.esa.io/uploads/production/attachments/3505/2018/08/24/15524/78d0f267-b301-4a3e-8398-456eb1bbdd4e.png">

`Webhook送信` と `Webhook URL` という項目がありますので、`Webhook送信` にチェックを入れ、`Webhook URL`にWebhookの送信先を入力します。

<img width="1279" alt="LINE_Developers.png (201.1 kB)" src="https://img.esa.io/uploads/production/attachments/3505/2018/08/24/15524/d08441a7-7558-491a-b526-4d1079a3b635.png">

今回、私は、Webhookの送信先をGoogle Apps Scriptにし、受信したイベント内容をSlackに飛ばすようにしました。

Google Apps ScriptとSlackの連携は、[この辺の記事](https://qiita.com/torisankanasan/items/6c1d8cd77269053c02fa)とかいいと思います。

## 2. ビーコンイベントを受信できるようにLINEアプリの設定
[公式ドキュメントのMessaging API](https://developers.line.me/ja/docs/messaging-api/)に説明がありますが、

<img width="1279" alt="Messaging_API.png (219.0 kB)" src="https://img.esa.io/uploads/production/attachments/3505/2018/08/24/15524/b946d636-0283-4330-a43b-fc5c23c21dc1.png">

ビーコンイベントを受信できるようにLINEアプリの設定を行う必要があります。

先ほど準備したBotを友だち追加した上で、以下の手順に従って、設定してみてください。
1. スマートフォンのBluetoothをオンにする。
2. LINEアプリで［設定］>［プライバシー管理］> [情報の提供]の順に選択し、［LINE Beacon］のチェックボックスをオンにする。

`プライバシー管理`画面の`情報の提供`をクリックし、

![Screenshot_20180824-193728.png (216.2 kB)](https://img.esa.io/uploads/production/attachments/3505/2018/08/24/15524/db8dd618-cb57-42e6-8b01-b53252402b1f.png)

`LINE Beacon`にチェックを入れます。

![Screenshot_20180824-193737.png (178.0 kB)](https://img.esa.io/uploads/production/attachments/3505/2018/08/24/15524/5053e75d-a395-4faa-80ab-a68601b8e8ed.png)

この`LINE Beacon`のチェックボックスの位置が、公式ドキュメントと異なっており、若干探しました・・・

これで、LINEアプリ側の設定は完了です。

## 3. LINE Simple Beacon用のHWIDを発行
次に、[ここにアクセスして](https://admin-official.line.me/beacon/register)、`LINE Simple BeaconのハードウェアIDの払い出し`ボタンをクリックします。
<img width="1279" alt="LINE_OFFICIAL_ACCOUNT_MANAGER.png (180.7 kB)" src="https://img.esa.io/uploads/production/attachments/3505/2018/08/24/15524/f74a559d-3e4a-414c-b3fd-dfbb91e74c45.png">

さらに、ビーコンと連携させたいBotの`選択`ボタンをクリックし、
<img width="1279" alt="LINE_OFFICIAL_ACCOUNT_MANAGER.png (140.4 kB)" src="https://img.esa.io/uploads/production/attachments/3505/2018/08/24/15524/c0e16e11-b5b7-4a74-95c0-1dba50cfdba3.png">

`ハードウェアID発行`ボタンをクリックすると、以下の画面の通り、IDが表示されるので、これをメモっておきます。
<img width="1279" alt="LINE_OFFICIAL_ACCOUNT_MANAGER.png (145.7 kB)" src="https://img.esa.io/uploads/production/attachments/3505/2018/08/24/15524/5fbf9c4d-811d-4dd4-a194-f81835556644.png">

## 4. Raspberry Pi Zero Wのセットアップ
最後に、Raspberry Pi Zero Wをセットアップします。

Linux向けのBluetoothのプロトコルスタックであるbluezおよび関連するパッケージをインストールします。

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

次に、以下のコマンドを実行します。
以下は発行されたHWIDが`0116b4370c` の場合の例ですので、発行したHWIDに合わせて適宜修正してください。

```
# 発行されたHWIDを2桁ごとにスペースで区切ったものを指定
HWID='01 16 b4 37 0c'

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
```

これで、 Raspberry Pi からのビーコンイベントのwebhookが、先ほど`Webhook URL` に入力したエンドポイントに届くはずです。

# 動作確認
ビーコンの電源が入っていることを確認し、LINEアプリを起動したスマートフォンをビーコンに近づけます。

すると、WebhookがGoogle Apps Scriptに送信され、受信したイベント内容が、無事Slackに飛んできました。

こんな感じで。
![Slack_-_kdl_iot.png (49.3 kB)](https://img.esa.io/uploads/production/attachments/3505/2018/08/24/15524/9ddfa558-b09f-4696-93d9-86d34e34b58c.png)

# まとめ
これで、Botと連携ずみのLINEユーザがビーコンデバイスに近づいたことをwebhookで受け取ることができるようになりました！

帰宅時間でもロギングしてみようかな。

以上