力あるインフラエンジニアを目指して

IT初心者が人前にインフラエンジニアですと言っても恥ずかしくないようになる日を目指します。

BLE Beaconで入退場管理しようとしてみた

2年前、BLE ビーコンとAndroid端末を使ってある場所への入退場を管理しようと試みました。

BLEビーコンはBluetooth Low Energy という電力消費を極力抑えたBluetoothの規格の電波発信機のことですね、簡単に言うと。下のサイトにわかりやすく解説載ってます。

beaconlabo.com

本当は入口付近にビーコンを置いてビーコンとAndroid端末との距離に応じてDB上の入退場ステータスを更新って感じにしたかったですが、結構距離判定の調整が難しく、エリア全域をBLEビーコン電波圏内とし、電波圏ないから出たら退場処理をするとした方が高い精度が得られました。

私が取り組んでるときはそこそこ盛り上がりを見せてて、GoogleからEddyStoneが発表され、アプリなしでURLを送信できるとか1部で話題に上がってました。

dev.classmethod.jp

紹介記事も多くは上にリンク貼っている記事も層ですが、2015年がピークみたいです(ほぼ出た直後)。

確かにたまに目にしますが、あんまり進歩していないというか、やはり私が体験したように電波の制御に苦しめられるからですかね…

当時、AltBeaconというライブラリ使ってました。

AltBeacon - The Open Proximity Beacon

MySQL JDBCドライバ入れて、Android端末からローカルネットワーク内にいるDBを直接更新するってプログラムで検証してました(セキュリティ的にありえないです笑)。

private static final String URL = "jdbc:mysql://192.168.1.13:3306/test";
private static final String USER = "root";
private static final String PASS = "";
(略)
@Override
public void didDetermineStateForRegion(int i, Region region) {
  // 領域への侵入/退出のステータスが変化したときに実行
  Log.d(TAG, "didDetermineStateForRegion");
  try {
    //Data Base へ接続
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection(URL, USER, PASS);
    //Statement を作成
    Statement stmt = con.createStatement();
    //SQL 文を作成.ログイン状況を反転させる.
    String sql = " UPDATE memberlist SET in/out = ~in/out, time = now() WHERE accont = test ";
    //Update 文を実行
    int num = stmt.executeUpdate(sql);
    //接続を閉じる
    stmt.close();
    con.close();
  }
  catch(Exception e) {
    e.printStackTrace();
  }
}

このやり方、普通じゃないのでご注意を。