VIVITABLOG

VIVITAで活躍するメンバーの情報発信サイト

忘れ物防止タグをハックして入退室管理システムを作ってみた

ハードウェアエンジニアの嶋田(@shozaburo)です。今回ははじめての工作ネタです。

(利用は自己責任でお願いします)

入退室管理システムとは

突然ですがみなさんはオフィスの戸締まりは完璧でしょうか?これまで弊社では誰が最終退室なのかを判断する術は目視という人為的な確認方法しかありませんでした。

人為的な確認だけではうっかり忘れて出ていってしまうということもあると思います。

そこで「高価なゲートシステムを使うことなく部屋への出入りを自動で確認するシステム」を作ってみました。

忘れ物防止タグについて

なぜ入退室管理システムに忘れ物防止タグを利用したのか?というと忘れ物防止タグにはBluetooth Low Energy(以下BLE)という技術が使われているからです(以降、忘れ物防止タグを、ただ単に"タグ"と呼びます)。

具体的にBLEをどう利用したのかは以下で説明します。

まずはBLEの2つの動作モードを理解する

まずはBLEについての簡単な説明をします。

BLEには大きく「コネクション前」「コネクション後」の2つの動作モードがあります。

コネクション前

このモードではブロードキャスターと呼ばれるデバイスが自分を見つけてもらうためにアドバタイズパケットというデータを定期的に送信します 。アドバタイズパケットには自分自身のデバイス名やコネクションに必要なMACアドレスなどが含まれています。

他方、オブザーバーというデバイスは、ブロードキャスターから送信されるアドバタイズパケットを受信し、コネクションへ移行する準備をします。当然、データの流れは「ブロードキャスターからオブザーバー」への一方通行、そして1対多の通信です。

一般的には、タグなどの小さいデバイスがブロードキャスターで、スマホやタブレットなどがオブザーバーです。

f:id:shozaburo:20190304151950p:plain

コネクション後

先程までのやりとりでコネクションが成立するとこのモードに入ります。このモードでは送受信の双方向通信で、1対1通信となります。また、先程まで必要だった自分を見つけてもらうためのアドバタイズパケットの送信は不要となります1

このモードでは通常、タグなどの小さいデバイスがサーバー、スマホやタブレットなどがクライアントと呼ばれる役割になります。サーバー、クライアントの動きについては割愛します。

f:id:shozaburo:20190304152231p:plain

タグの動作モードを把握する

実際に手元のタグのBLE状態を確認してみます。それにはAndroidアプリのBLE ScannerやiOSのLight Blue® Explorerがおすすめです。ここではBLE Scannerを使って説明します。

タグの初回起動後のBLE Scannerでの表示です。黒で塗りつぶしているもの2が今回起動させているタグです。3。起動直後はどの端末ともコネクションをしていないので、このようにアドバタイズパケットを送信しコネクション待ち(ブロードキャスター)をしています。

f:id:shozaburo:20190306135634j:plain

次に、タグの公式アプリをダウンロードしそのアプリ経由でコネクションをします(この種のタグは必ず自社の公式アプリでコネクションを求められます)。コネクション後、BLE Scannerを起動すると、デバイス一覧からタグのデバイス名が消えているはずです。

これは上記で説明したとおり、タグが端末とコネクションが成立したためアドバタイズパケットを送信しなくなった(ブロードキャスターからサーバーへ移行した)ためです。

さらに一歩進み、今度はコネクションしたタグとスマホを通信できない距離まで物理的に離します。そうするとタグは、自身が取り付けられているものが忘れ物になったと判断し警告音を発します。つまりタグはこの「コネクションが切断されたかどうか」によって、忘れ物になったのかどうかを判断しています。

この状態でコネクションをしたスマホとは別のスマホ4でBLE Scannerでタグの状態を確認します。また、タグのデバイス名が見えるはずです。つまり、通信できない距離まで引き離されコネクションが切断されると、再度タグはアドバタイズパケットを送信し自分を見つけてもらうのを待ちます(ブロードキャスターにもどる)。

この一連の流れを状態遷移図にしてみました5

ここでようやく本題ですが、今回の入退室管理に利用するのはこの忘れ物状態のタグ(ブロードキャスター)から発せられるアドバタイズパケットで、これを各人に配布し部屋に設置したオブザーバーで「検出できれば入室」「検出できなければ退室」と判断します。

どのタグが誰かについては、タグのアドバタイズパケットに含まれるMACアドレスを使って判断することができます。

初回コネクション待ちの状態もブロードキャスターなのでその状態を利用すればよいと思われる方もいるかもしれませんが、この状態では消費電力削減のため一定時間後勝手に電源OFFする端末がありました。入退室管理用のタグとして使うためには常時起動してもらわねば困るため忘れ物状態を利用します。

f:id:shozaburo:20190304153309p:plain

実装

ということで、タグのアドバタイズパケットを検出して人の出入りを管理するオブザーバーマシンを作成します。 ハードウェアとしてはスマホでもよいですが、部屋に常時設置することを考えると大変コスパが悪いです。よって今回はRaspberryPi3を使いました。Pi3はPi2までとは違いBLEを内蔵しており、BLEを使うにあたり外付けが必要ありません。

ソフトウェアの仕様ですが、以下のようにしました。

  • タグを検出したら、そのMACアドレスに紐付けられたひとを入室にする
  • タグが一定期間検出できなくなったら、そのMACアドレスに紐付けられたひとを退室にする。
  • 入室と退室の状態はGoogle Spreadsheetに書き込んで、皆が見えるようにする。

f:id:shozaburo:20190304160850p:plain

  • すべての人が退室になったら、最後に退室した人にSlackで戸締まりをするようにリマインドを投げる

f:id:shozaburo:20190304161207p:plain

ソースコードはこちらです。 ソフトウェアは専門ではないのでソースコードの詳細な説明は割愛しますが、以下のようなフローで作成しています。

f:id:shozaburo:20190304163440p:plain

最後に

今回はタグのBLEを利用して、本来の用途とは別の入退室管理システムを作ってみました。忘れ物防止タグもいろいろな種類がありかなり安く入手できるものもありますし、RaspberryPiも数千円なのでシステムとしてはかなり安価に構築できたと思います。

弊社ではこのBLE技術を利用したハードウェアを開発しています。BLEやモバイルデバイスなどIoT技術に興味のある方のエントリーをお待ちしております!

recruit.jobcan.jp


  1. 実装自体はできるかもしれないですが、普通はやる意味がないのでやりません

  2. 今回使ったタグのデバイス名が具体的な商品名になっていたため隠しています。またデバイス名下のMACアドレスは本来は「XX:XX:XX:XX:XX:XX」という形式ですが、こちらにもぼかしをいれています

  3. これ以外にも色々なデバイスが表示されていますが、これはスマホが検知しているその他のBLEデバイスです。身の回りにはこのように多数のBLEデバイスが存在しています

  4. タグの状態を確認するのに公式アプリを入れている同じスマホを使うと再度コネクションしてしまうので、コネクションしていない状態(忘れ物状態)がどうなっているか把握できないためです

  5. これは今回使ったタグに限らずいくつか同種のタグを試しましたが概ねこのようになっていました。