概要
iBeaconを使った社内位置情報取得システムを開発しました。
iBeaconっていうのはアップルが開発した屋内測位システムのプロトコル名で、Bluetoothの電波を使って省電力で位置情報を取得できる仕組みです。
尼崎に本社を移転して、会社が広くなったのは良いのですが、広すぎて社員がどこにいるかわからなくなり、お客様から電話の取次を受けた担当者が困るという問題が発生していました。迅速な対応を謳っている当社でお客様をお待たせするのは良くないとの思いから開発に至ったわけです。概要はこんな感じです。
当社で社員に支給している携帯電話は全てiPhoneです。iBeaconではペリフェラルと呼ばれる発信器から常時位置情報の乗った電波を垂れ流しており、この電波を社員の持っているiPhone(iBeacon受信器、セントラルとも呼ばれます)が受信すると、iPhoneがサーバ上の自分の位置情報を更新するようになっています。
よくIT系の展示会とかで見るやつですね。最近はIoTとか流行ってるみたいなんで、いろんな会社がこれやってるの見ます。
発信器(ペリフェラル)
発信器にはRaspberry Pi 3を使っています。ロビーに1個、1階倉庫に2個、試験場に1個、2階事務所に2個を設置しています。bluez-ibeaconというのを使っています。インストールしてコマンドを打つだけなので、簡単なもんです。
コマンドは
./ibeacon 200 UUID MajorNumber MinorNumber 200 -29
こういう感じになっていて、
./ibeacon 200 3EFD6B5FEDB3493F8C9F99622CA97201 21 1 -29
具体的にはこんな感じ。これで200ミリ秒おきに「3EFD6B5FEDB3493F8C9F99622CA97201」ていうUUIDと21ていうMajorNumberと1ていうMinorNumberを送信してます。最後の-29とかいうのは、1メートル離れた距離での電波の強さとかなんとかなんですが、よく分かっていません。
ポイントは、例えば1階倉庫だと2つのペリフェラルを置いているのですが、これらのUUIDを同じにしておくこと。でないと、セントラル側のアプリ実装時には拾った電波の情報はデリゲートメソッドで処理されるんですが、UUIDが違っていると別リージョンのビーコンだと見なされて、まとめて処理できなくなってすごく不便なんです。うまく説明できないんですがやってみればわかるはず。すごく困る。これって意外とネットで情報が乗ってなくて、気づくのにすごく時間を無駄にしましたね。
以下実際に設置したところ。
受信器(セントラル)
受信側はiOSアプリで実装します。当社では行先掲示板(よく社内に置いてある出先と戻り時間が書いてあるホワイトボード)をアプリ化しているので、この行き先掲示板アプリにiBeaconセントラル機能を持たせることにしました。
iOSでiBeaconを受信する場合、アプリがバックグラウンドであってもリージョン間の移動を勝手に検知してくれて、デリゲートメソッドが起動します。その後15秒だか動いてくれるので、その間にサーバと通信をして位置情報を書き換えるようにしています。位置情報はこのアプリからでもみられるし、Webでもみられるようにしています(iPhoneを持っていない人もいるので)。
ただ、デリゲートメソッドをどこに実装するねんという問題があります。シングルビューでもなければUIViewControllerが常に存在している保証はないように思うので、私はUITabBarControllerのサブクラスを作ってそこに書きました。実装はほとんどここを参考にしました。なんでもインターネットで出てくるので便利な世の中になりましたね。詰まったところといえば同じリージョンではUUIDを揃えるってことだけです。
サーバはNiftyCloudのmobile backend(mBaaS)を使いました。認証には社内でGSuiteを使っているのでGoogle認証を使ったんですが、mobile backendではGoogleのアプリケーションキーを1個しか登録できず、iOSとWebの両方で使うことができません。仕方ないので、まあ色々工夫してやりましたが、変なところで苦労してしまいました。次からはFireBaseを使おうと思っています。
Web画面
Webから見た画面はこんな風に見えます。
この現在位置が、実際の位置に合わせて自動的に書き換えられるわけですね。外に出たらBeacon圏外なので社外になりますし、iPhoneを使っていない人のステータスは不明になっています。rakumoというのはGoogleカレンダーのフロントエンドで、サイボウズとかそういう部門ごとの一覧が見られたりする昔ながらのグループウェアっぽいスケジュール画面を用意してくれる外部サービスです。この画面からrakumoスケジュールへのリンクに飛べるようにしているわけですね。心憎い。
他にもいろいろ工夫はあるのですが、それはまたおいおい。
三友工業は非常用発電機の会社ですが、ビーコンもできるということで、うちもビーコンで位置情報把握やりたいけど自分で作るのはめんどくさいわ、という方がいらっしゃったらぜひご相談ください。