COCOAのビーコンを使って人数計測システムを構築した話

2022年の話。僕は個人開発がしたくてどうしようもできなかった当時、いろんな人にアイデアを聞いて回っていました。

その際にコスプレイベントを主催している「ぷれこす」という団体の代表であるO.T.Aさんと話をすることができたのですが、その際に「会場の人数を計測できるシステムがほしい」という話になりました。

人数を推測する方法と言えばカメラを使用してOpenCVなどで人と思われるオブジェクトを検知したらカウントするのが真っ先に想定できますが、自分は画像処理に関する知識はありません。AIとかを使えばよいのかも知れないですがそのあたりの知識もありません。

どうしようかと悩んでいたところ、大学生の頃にBluetoothのビーコンを使用して入室を通知するシステムを開発していたのを思い出しました。この仕組みを応用して一つの方法を思いつきました。

また、当時のiOS/Android搭載のスマートフォンは新型コロナウイルス対策のため、濃厚接触をもっと簡単に検知できるアプローチの一つとして最近肌身離さず持っているスマートフォンのBluetoothのビーコンを使用していたので、これを活用することにしたというわけです。

というわけで、イベント側(wasshoi)と綿密なヒアリングを行い協力しながら今回はシステムの開発を行いました。

ここでまず、COCOAのBluetoothのビーコンの特性について説明をします。

COCOAのBluetoothビーコンについて

筆者は専門家ではないため、COCOAについては詳しく説明しません。新型コロナウイルス感染症に関する詳しい情報を知りたい場合は厚生労働省のウェブサイトをご覧ください。

COCOAとは、新型コロナウイルス感染症対策のために日本政府が推進しているスマートフォンアプリです。Bluetoothビーコンは、このCOCOAアプリの一部であり、感染症対策のために重要な役割を果たしています。

Bluetoothビーコンは、スマートフォンと通信するための短距離通信技術の一種です。このビーコンは、スマートフォンの近くにいる他のスマートフォンに検知されます。

COCOAのBluetoothビーコンには、ハッシュが付与されています。スマートフォンは、Bluetoothビーコンによって発信されるハッシュを受信することで、そのスマートフォンの所有者が近くにいたことを記録することができます。

もしもあなたが感染者と接触した場合、COCOAアプリを使って感染症の通知を受け取ることができます。感染者がCOCOAアプリに登録した情報が保健所に共有され、その情報を元に接触者を特定します。その際に、Bluetoothビーコンが記録された情報が使われます。

ハッシュというのは文字列をある規則に従って別の値に変更したものです。計算後の文字列から計算前の文字列を特定するのは非常に困難という特性があります。たとえば1+2+3=という数式からは6という計算結果を出すことができますが、6からは元の計算式である1+2+3を特定するのは困難なのと似た同屈です。

このビーコン15分に一度値が変わります。もちろん、一定の時刻になったら一斉にかわるのではなく、何から計測をはじめて15分経過後なのはかは機種によって違います。

そこで、1ターン15分として、15分のうちに検知したビーコンの数で人数を推定しようと思いました。

実装

Bluetoothのビーコンを集計するギャザーシステムと、集計したデータをカウントするサーバーに分けて開発しました。

ギャザーシステムではNode.jsを使って開発しました。Bluetoothビーコンを検知するためにnobleというモジュールを使用しました。他にもBlunoなどのモジュールはありますが、nobleでないとCOCOAのUUIDを指定して検知することができませんでした。

サーバはLaravelを使って実装しました。とはいってもやることは単純なCRUDです。Laravelを選定したのは、普段から使い慣れているというのもありますが、artisanコマンドを使ってAPIを爆速で作成することができるというのが理由でした。

またWebフロントはLaravelのviewを使っています。今回は見た目が第一なのでJQueryなどを泥臭く使っています。

ちなみに、実際の稼働中はリアルタイムで値が変化するようにしていたのですが、こちらはPusherを使用しています。Websocketを一から用意するのは大変なので既存のサービスを活用しました。

サーバーは自宅のクラウド環境を使用しました。既存のPaaSだと料金もかかるのと、爆速で構築できる環境がたまたまあったためです。それぞれの環境はSoftEtherを使用してVPNで接続しました。

設置

今回の設置や運用はイベント側と協力して行うことにしました。

ホールの人数を把握するためにRaspberry Piはステージの裏側などに仕込みました。また更衣室でも人数を別にカウントしたいと思い更衣室にも仕込みました。しかし、Raspberry Piを人目のつかない場所に設置するような人物がいたら不審人物に間違えられる可能性があります。そのためスタッフの腕章をお借りしてスタッフとして振る舞っていました。

動かしてみる

画像はテスト稼働の様子です。スマートフォンが一つしか稼働させていなかったので1と表示されていますが、会場では正しく表示されていました。

そういえば

一度設置したら基本的にあれこれ触る必要はないので、途中は着ていました。

スタッフ腕章をつけていた着ぐるみは僕だけだったので、名札をかかなくても僕が着ているとわかる人にはバレてしまうという状態でした。ハハハ、面白いですね。

その後

会場の人数が会場のディスプレイやスマホからでも確認できる状態であったため、スタッフの方からは人数の把握に役立ったというコメントをいただくことができました。

また、今回の手段ならではとしてカメラを使用したりしないので更衣室にも設置できるというメリットがあります。そして、更衣室にも設置したことでスタッフが入らなくても人数のチェックができたというフィートバックもいただけたのでとても嬉しかったです。

当然ながら、現在はCOCOAは無効化されているのでこの方法を使うことはできません。なので、今後同じことをする場合は別の検知方法を考える方法があります。

今後も誰かの不満を解決するものづくりをしていきたい、そう思った日でした。