Raspberry Pi & iBeacon ハンズオン レジュメ

# はじめに

以下は、名古屋市にある介護系ベンチャー企業、[株式会社メグラス](https://www.meglus.co.jp/)にて実施したRaspberry Piを使ってiBeacon信号を取り出すハンズオンのレジュメです。
ぜひコメントやツッコミいただけると幸いです。

ハンズオン実施の背景や準備などは[別記事](https://qiita.com/ktshn/items/c30c6cb5cff791a07ea7)にまとめていますので、そちらを参照してください。
→[Raspberry Pi & iBeaconハンズオンを介護系ベンチャー企業でやってみた](https://qiita.com/ktshn/items/c30c6cb5cff791a07ea7)

また、実際のレジュメでは割り振ったIPアドレスやホスト名などを書いていますが、本記事ではそちらの記載を省く or 伏せた形で公開させていただいております。

# ハンズオンのゴール
iBeaconをRaspberry Piに近づけたら何かが起きるようにする
→「百聞は一見にしかず」なので、デモします！(実際のハンズオンでは完成形のデモをしました)

# TOC
1. 必要なもののダウンロードとインストール
2. SDカードへのイメージ焼き
3. Bootと接続確認
4. 環境構築
5. フロー作成

# 1. 必要なもののダウンロードとインストール
- PiBakery(http://www.pibakery.org/index.html)  
※時間がかかるので最初にやる  
インストール完了後起動しない(チェックを外す)
- pibakery-blocks(自作ブロックを利用。詳細は[別記事](https://qiita.com/ktshn/items/c30c6cb5cff791a07ea7)を参照ください)  
PiBakeryインストール完了後下記パスに配置
C:\Program Files (x86)\PiBakery\resources\app\pibakery-blocks
- TeraTerm(https://ttssh2.osdn.jp/)
- SDFormatter(https://www.sdcard.org/jp/downloads/formatter_4/)

# 2. SDカードへのイメージ焼き
1. SDカードのフォーマット
    1. SDFormatterを起動
    2. SDカードのドライブを選択してクイックフォーマットを実行 →ボリュームラベルは何でもOK
2. イメージ焼き
    1. PiBakeryを起動
    2. 主催者が作成したrecipe.xmlをインポート
    3. 必要箇所を変更
        - IPアドレス
        - ホスト名
        - ログインパスワード
    4. Write!(Raspbian Liteを選ぶように注意)


# 3. Bootと接続確認

1. 焼いたSDカードをRaspberry Piに挿入して電源ON
2. スタートアップスクリプトが動いてreboot完了したらログイン
    - ID:pi
    - PW:さっき決めたパスワード
3. IPアドレスの設定確認  
	`ifconfig`  
4. 外部への疎通確認  
	`ping 8.8.8.8`
5. 自分の端末(Windows機)への疎通確認  
	`ping 192.168.***.***`
6. 自分の端末でTeraTermを起動してSSH接続を確認


# 4. 環境構築

1. リポジトリの更新/導入済みソフトのアップデート

	```bash
	sudo apt update
	sudo apt upgrade
	```

2. Node.jsとnpmのインストール(https://github.com/nodesource/distributions/blob/master/README.md)

	```bash
	curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash
	sudo apt install -y nodejs
	```

3. インストール確認

	```bash
	node -v
   	npm -v
	```

4. Node.jsでBLEを扱うライブラリ "bleacon" を導入(https://qiita.com/yuyakato/items/739443960fac2668f4a3)

	```bash
	mkdir iBeacon
	cd iBeacon
	sudo apt install libbluetooth-dev
	npm install bleacon
	```

5. テスト用スクリプトを用意

	```bash
	vi beacon.js
	```

6. 下記のスクリプトをコピペして保存して終了
   →viの使い方は自分で調べてください。心を無にしてやるなら、今回は
   　”i”で編集モードになって、貼り付けて(TeraTermなら右クリック)、”ESC”、”:wq!”で”Enter”ってすればOK
※”wq”は”write”と”quit”

	```javascript
	var Bleacon = require('bleacon');
	// Start scanning
	Bleacon.startScanning();
	// Events
	Bleacon.on('discover', function(bleacon) {
		if (bleacon.proximity==="near"){
			console.dir(bleacon);
		}
	});
	```

7. テスト用スクリプトを動かしてみてiBeaconの信号(BLE)を受信できてるか確認する

	```bash
	sudo node beacon.js
	```

8. iOS端末で "Beacon入門" などのアプリから信号を発信して情報が流れるのを確認→Ctrl+Cで停止
9. Node-REDの導入(https://nodered.jp/docs/hardware/raspberrypi)

	```bash
	cd
	bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)
	node-red-start
	```

10. スタート後、Ctrl+Cで戻る(Node-REDはBGで動く)
11. ブラウザで下記URLへアクセスして動作確認
`http://RaspberryPiのIPアドレス:1880`
12. 問題なければOS起動時の自動スタートを設定

	```bash
	sudo systemctl enable nodered.service
	```

13. Node-REDでBLEを扱えるノードを追加

	```bash
	node-red-stop
	cd $HOME/.node-red
	npm install node-red-contrib-bleacon
	node-red-start
	```

14. 再度ブラウザでアクセス(再読込)してノードが追加されていることを確認

# 5. フロー作成
1. 以下のURLのJSONをコピーしてNode-REDにインポート  
→https://flows.nodered.org/node/node-red-contrib-bleacon
2. このままだとデプロイできないので、scanBeacon側だけのフローにする
3. jsonのノードのところで動作を「常にJavaScriptオブジェクトに変換」にする
4. ビーコン発信して、デバッグ画面みてまずは流れる生のデータを見てみる   →https://developer.apple.com/documentation/corelocation/clbeacon
5. ググったり、下記のURLを参考にしながらフローを作ってみる  
→https://www.1ft-seabass.jp/memo/2017/10/07/node-red-meets-smart-button-switch/  
→http://denshibu.blog.fc2.com/blog-entry-28.html