アオカケスの鳥かご

日々の出来事を綴っていきたい

ラズパイとl2pingで入退室管理する

一昨日あたりに息抜きがてら作りました。

動機

ずっと大学の研究室やサークルの部室に誰がいるのかリアルタイムで分かるようなものを作りたいと思っていました。

お手軽(?)な入退室管理には色々な手法があるかと思います。
今パッと思いつくだけでも...

  • 入退室時にラズパイに接続されたNFCカードリーダーにICカードをかざす
  • ラズパイにLINE Beaconを入れて検知
  • スマートロック(セサミなど)

でもこれらの手法にはそれぞれ割と深刻な問題があります。


まず1つ目のカードリーダーのやつ。
よく会社とかでやるやつですね。

入退室するたびにICカードで鍵を開けないといけないような場所であればこれで十分入退室管理ができそうです。
しかし、今回私が導入したい環境は最初の1人が鍵を開ければずっと開きっぱなしです。

鍵が開いているのにわざわざICカードを取り出してカードリーダーにかざしてくれる人は私の周りにはいません。
なんというか、可能な限り無駄なことをしたくない人が多いようです。

そもそも研究室の鍵はいわゆる鍵を使って開けるようにしているので却下です。


2つ目のLINE Beacon。
前からずっと気になっていました。

実はこれを使ってある程度は作ったのですが、途中でモチベーションが無くなって放棄してしまいました。
こちらはLINEでボット用のアカウントを作ってそれを利用者(入退室する人)に友達登録してもらわないといけないとかで非常に面倒です。
LINEのトーク上で表示するのは簡単そうですが、webページ上でリアルタイム表示させるとかしようとするとかなり面倒臭そうな印象です。
というわけで実装に結構時間かかりそうなのでひとまず却下。


そして3つ目のスマートロック。

他の研究室で導入されていました。
でもその研究室の人たちは面倒くさそうにしていました。

ドアの前でBluetoothで接続して解錠のボタン押すという一連の動作が手間のようです。
普通の鍵であれば歩きながら鍵を取り出しておけば数秒でドアを開けることができますからね。

まぁスマートロック自体が高価過ぎるので何にせよ却下。


どの手法にもメリットはありますが、私にはデメリットが目立ちすぎました。
そこで他に何かないのかと頑張ってggった結果、タイトルにもあるl2pingにたどり着いたのです。

l2pingが何かを雑に説明しますと、L2のpingです。そのままですけど。
普通のpingはだいたいIPアドレスでやるかと思いますが、l2pingはIPアドレスではなくMACアドレスです。

察しの良い方は既にお分かりでしょう。
そう、端末にpingして死活監視みたいなことをするのです。

pingして帰ってきたらその人はその場にいるわけです。
今の世の中スマホを持っていない人はほぼ皆無でしょうから、スマホpingしてやればほぼリアルタイムで誰がその場にいるのか分かるようになります。


ここまで長々と書いてきましたが、ようやく実装に入ります。

使用機材

実装

まずはl2pingを使えるようにします。

$ sudo apt update
$ sudo apt install bluetooth

l2pingが正常に動作するか確認します。

$ sudo l2ping -c 1 40:40:a7:a4:39:1d

Wi-FiMACアドレスではなく、Bluetoothのアドレスを指定します。
たぶんやり方が違うだけだと思いますが上記のコマンドではWi-Fiだとうまく動きませんでした。

Bluetoothのアドレスの確認の仕方については各自で調べてください。
Androidならたぶん端末情報とかそのへんにあります。


あらかじめ利用者にBluetoothアドレスを聞いておきます。
そしてそのアドレスを指定してl2pingするスクリプトを書きます。
言語はpython3。

mac_listに利用者の名前とBluetoothアドレスを入れておきます。
reserchersではl2pingの結果を0か1で表すことにします。すなわち、研究室に居るか居ないかです。
0→居ない
1→居る


最後に、l2pingして1だった人(pingが返ってきた人)をreserchersというファイルに書き出します。
このファイルをブラウザから研究室に居る人を確認するときに参照します。


webページから見れるようにするためにphpでページを用意します。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="refresh" content="60">
<title>研究室</title>
</head>
<body>
<h2>研究室</h2>
<hr>
<?php
$filename = 'reserchers';
$reserchers = file($filename);
if (empty($reserchers)) {
	echo 'ただいま研究室には誰もいません。';
	echo "\n</body>\n</html>";
	exit();
} else {
	echo "現在\n<br>\n<br>";
}
foreach ($reserchers as $resercher) {
	echo $resercher.'<br>';
}
?>
<br>
がいます。
</body>
</html>

てきとうです。凝る必要もないと思うので。
先ほどpythonから吐き出されたreserchersというファイルを読み込んで表示してるだけです。


ローカルだけで確認できればいいのであればラズパイにapacheとかいれて終わりです。
今回は外からも確認できるようにしたいのでラズパイとは別にサーバを用意します。

例によってさくらのサーバに置きます。
phpファイルは最初からサーバに置いておけばいいですが、reserchersはラズパイでスクリプトを実行するたびに送信してあげなければなりません。

送信にはscpを使います。
とはいうものの、scpは標準入力でのパスワード入力を自動化するのが大変です。
そこでsshpassを導入します。

$ sudo apt install sshpass

sshpassを使う前にまずは一度普通にsshとかで手動で接続します。
初めて接続するとたぶんyes/no聞かれるのでyesと入力。これでsshpassが使えるようになります。

sshpassは以下のような感じで実行します。

$ sshpass -p "[サーバのパスワード]" scp -r [送信したいファイル名] [サーバのユーザー名]@[サーバのユーザー名].sakura.ne.jp:/home/ユーザー名/www/アップロードしたいフォルダ名

適宜変更して入力してください。



以上で主要部分は完成ですが、このままだと毎回手動で実行しなければならないのでcrontabを使って毎分実行するようにします。
とりあえずこの辺を参考に初期設定。
qiita.com

一連の流れをシェルで作っておきます。

#!/bin/sh
python3 /home/pi/bluetooth-scan/scan.py
sshpass -p "[サーバのパスワード]" scp -r [送信したいファイル名] [サーバのユーザー名]@[サーバのユーザー名].sakura.ne.jp:/home/ユーザー名/www/アップロードしたいフォルダ名

crontabに設定します。

$ crontab -e
*/1 7-23 * * * bash /home/pi/bluetooth-scan/send.sh

この設定の場合、7時から24時まで毎分send.shを実行します。


これでwebからも確認できるようになりました。

まとめ

予想以上に簡単にできてしまいました。
やっていることはかなり単純ですが、意外と使えるものが作れました。

毎分Bluetoothpingすることによるバッテリー消費はたぶん気にする必要は無いレベルです。

よりリアルタイム性を重視したい場合は実行間隔を短くすればいいですが、正直無駄な気がします。
毎分出入りするなんてことはまずありませんし、5分間隔とかでも十分だと思います。


今回は入退室管理とか言ったわりに管理は全くしていませんが、ログに書き出したりとかすればそれっぽいことはいくらでもできます。
あくまでも「今」誰がいるのか分かるようにしたかっただけなので...

おまけ

ちょっと分かりにくくて申し訳ないですが、研究室のドアのガラス部分にスマホの画面が見えるようにして置いてみました。
f:id:aokakes:20181221231648j:plain

これで来客者も中に誰がいるのか分かります。

テスト用に購入した中華スマホで、今までは画像にあるインターホンが押されたときに通知音が鳴るだけの存在だったので有効活用します。

安いわりにスペック良いので地味にありがたい存在です。



おわり。