Raspberry pi 3 model B x Line beacon


Raspberry pi 3 Model Bを利用して、Line Beacon化をしてみます。

Raspbian　Stretch　がリリースされた後に挑戦されている方々が少ないようでしたので、
実践メモとして記録します。

#環境：
スマホ　Hauwei P10 lite
Raspbian Pi 3 Model B
Rasbian　Stretch lite
>Version:September 2017
>Release date:2017-09-07
>Kernel version:4.9

#手順：
1. LINEのアカウントを作成する。電話番号とユーザーIDをリンクさせないといけないので、
注意。

2. Developerとして登録する。登録については[LINE Developersのサイト](URL "https://developers.line.me/ja/")参照のこと

3. プロバイダーを作成後、Channelを作ってその中にBOTアプリを作り、作ったbotと友達になります。
用語としては、以下のイメージです。
>プロバイダー≒サービス提供者
>Channel≒サービス提供者が提供するサービス

4. WebhookのURLを指定する
今回は検証用なので、
公開しているphpサーバーにアクセスするとレスポンスをそのまま受け取り、
ファイルとしてテキストへ書き出すページへフックします。
ブラウザでの接続確認用にechoで”OK”と返すようにしています。

```php:webhooktest.php
ob_start();
$get_raw = file_get_contents('php://input');
var_dump(json_decode($get_raw,1));
$get_raw = ob_get_clean();
file_put_contents('dump.json', $get_raw."\n*****************************************************\n", FILE_APPEND);

echo "OK";
```

５. [LINE@Managerのサイト](URL "https://admin-official.line.me")でBeaaconのIDを払い出します。
ログインした後、左側のペインにて”LINE Beacon”を選択します。
一つのbotに対して一つしか検証用のIDを発行できないので注意してください。
![WS000850.JPG](https://qiita-image-store.s3.amazonaws.com/0/208434/9b8ad414-0cb1-4711-d76c-25f833b2b712.jpeg)

６. Raspbery pi側でBluetoothの設定を行う
今回実施したOSは、Raspbian　Stretch lite（Version:September 2017）です。
OSのバージョンによって同じことを実施しても動作結果に差がありますので、ご注意ください。
6-1. RaspbianのOSをダウンロードし、microSDカードにコピーします。
6-2. コピーした後、microSDカードを差しこみ、電源をONします。
6-3. インストールを実行
<b>*ここで注意したいのは、下にある言語選択は変更しないことです。変更すると日本語化がややこしくなります。</b>

6-4. インストールが終わるとOSが起動するので、ID（pi）とPass（raspberry）を入力してログイン
6-5. raspi-configからSSHを有効化、パスワードを変更、ロケール変更を実施したり、無線/有線のLAN設定をしたりしてください。sambaを入れようと考えましたが、SCPを使えるので今回は入れませんでした。
` #sudo apt-get update`
` #sudo apt-get upgrade`
` #sudo raspi-config` 

6-5. Beacon化するためのパッケージを導入します。
stretchではBluezは入っているようでしたが、、、
` #sudo apt-get install bluetooth bluez libudev-dev libbluetooth-dev` 

6-6. 導入が終わったらBluetoothの状況を確認します。
画面ショットのような結果が出力できれば問題ないはずです。

-MACアドレスや現在の状態（DOWN/UP）を確認できます。
` #hciconfig`  
![WS000862.JPG](https://qiita-image-store.s3.amazonaws.com/0/208434/ef75d867-c42b-2d2b-763c-4eb8f1c01e5c.jpeg)

-Bluetoothのスキャンを実施します。実施完了後MACアドレスと端末名（設定している場合）を出力します。
` #hcitool scan`
![WS000863.JPG](https://qiita-image-store.s3.amazonaws.com/0/208434/d86fef64-d2d3-1749-eba6-444170e8e569.jpeg)

6-7. terminalから以下コマンドを実行します。
 -HWIDのシグルコーテーションで囲った中にLINE@Managerで発行したHWIDを追記すること
` #HWID='FF FF FF FF FF'` 
` #ADVERTISE_DATA="13 02 01 06 03 03 6F FE 0B 16 6F FE 02 ${HWID} 7F 00"` 
` #sudo hciconfig hci0 up`   <-ここでのhci0等は端末ごとに違う可能性があるので、hciconfigでの結果をもとに変更してください。
` #sudo hcitool -i hci0 cmd 0x08 0x0008 ${ADVERTISE_DATA}` 
` #sudo hciconfig hci0 leadv 3` 

6-8. 端末側のBluetoothをonにして、bot経由でwebhookで指定した処理が実施できるか確認します。今回のwebhook先のURLでは、以下のようなJSONファイルを保存します。

```json:dump.json
array(1) {
  ["events"]=>
  array(1) {
    [0]=>
    array(5) {
      ["type"]=>
      string(6) "beacon"
      ["replyToken"]=>
      string(32) "文字列が入ります。"
      ["source"]=>
      array(2) {
        ["userId"]=>
        string(33) "文字列が入ります。"
        ["type"]=>
        string(4) "user"
      }
      ["timestamp"]=>
      int(1509163876994)
      ["beacon"]=>
      array(2) {
        ["hwid"]=>
        string(10) "指定したHWIDが入ります"
        ["type"]=>
        string(5) "enter"
      }
    }
  }
}
```
動作確認ができたら、Raspberry piの電源ON時に自動的にBeaconになるようにします。
毎回このコマンドを打ち込むのは手間なので・・・

７. 起動時に”6-7. ”で打ち込んだコマンドを実行するように”/etc/rc.local”に追記します。
7-1. viでrc.localへ追記し上書き保存します（:wq!）。
`#sudo vi /etc/rc.local`

```text:rc.localに書き込む内容
echo sudoのパスワード | sudo hciconfig hci0 down #念のためblutoothのデバイスを再起動します。
HWID='FF FF FF FF FF'
ADVERTISE_DATA="13 02 01 06 03 03 6F FE 0B 16 6F FE 02 ${HWID} 7F 00"
echo sudoのパスワード | sudo hciconfig hci0 up
echo sudoのパスワード | sudo hcitool -i hci0 cmd 0x08 0x0008 ${ADVERTISE_DATA}
echo sudoのパスワード | sudo hciconfig hci0 leadv 3
```
7-2. raspiを再起動して、IDとパスワードを入力する前に”sudo hciconfig hci0 leadv 3”の結果が出力されていることを確認します。以下画面ショットのような出力です。
![WS000864.JPG](https://qiita-image-store.s3.amazonaws.com/0/208434/cb9e6aa9-4485-6678-7d9b-d8e5927dc9fc.jpeg)


7-3. スマホのBluetoothを有効にして、再びBeaconを認識するか？を確認し、Webhook先の処理が実施できていれば（今回はファイルができていれば）成功です。

#余談：
初期段階、全く認識してくれませんでした。
・スマホ側でBluetoothの設定不備!?
Bluetoothの接続で周辺のすべてのBluetoothデバイスに表示を有効にしないと認識しないのかな？と思ったり、
raspiのBluetoothの電波が途切れるのが原因ができていなかったりなのでは？と
推測していますが、明確な切り分けはできておらず・・・

・定期的なスキャン
cronで定期的にBluetoothのスキャンを実施しないといけないのか？とも思っていますが。。。
`#hcitool scan`