Wi-Fi打刻作ったお話
打刻
僕はよく忘れます。
1ヶ月打刻忘れてしまい、バックオフィスの人に「あのー、打刻ちゃんとしてください(怒)」って言われたことがあります(汗)
それほど、よく忘れます。
最近、転職をしまして、打刻のやり方が変わりました。
ICカード、またはSlackより打刻できるようになりました。
ICカードで端末にタッチするのは、身体でやる方法だから忘れないだろうっと安心してたら...
また1週間以上やりませんでした...orz
これは、自分で対策しないとどうしようもないなと思い、いい感じにオフィスにいれば自動で打刻してくれるサービスを探し始めました。
そして、こちらのブログを見つけました。
Wi-Fiで打刻!その手があったか!
ということで、作りました。
構成は、こんな感じです。
使用したものは、こちらになります。
- Mac mini
- Azure Functions
- SQL Database
- svelte
どういう風に作ったか詳しく書いていきます。
①Wi-Fi打刻の概要
Wi-Fi打刻とは、個人のスマホが会社のWi-Fiにつながると自動で出社・退社の打刻するシステムのことです。
②MACアドレス取得
Wi-Fi打刻するには、個人のスマホを特定する必要があります。そこで、スマホのMACアドレスで個人を特定しました。
Wi-Fiルーターにつながっている端末のMACアドレスを取得するのに、arp-scanを使いました。
brew install arp-scan
そして、以下のようなシェルスクリプトを作りました。
#!/bin/bash
sudo arp-scan -l --interface en0
このシェルスクリプトをnode.jsのexecを使い、実行させてMACアドレスを取得するnodeサーバーを作りました。
作ったnodeサーバーは社内に余っていたMac miniで動かしました。
ここで得られたMACアドレスをAzure Functionsで作成したAPIに送ります。
MACアドレス取得で起きた問題が...
arp-scanで叩くと、こう返ってきます。
14:10:28:0:3:69
iPhoneの設定画面のMACアドレスはこのように表示されています。
14:10:28:00:03:69
「0:3」、「00:03」、「0」が多いですね。
対策として、以下のライブラリを参考に0を補正しました。
次に問題があったのが、MACアドレスがとれないという現象です。
最初、「arp -a」で取得していたのですが、このコマンドだと一部のものしかとれませんでした。
検索した結果、上記で書きました「arp-scan」を使うと、簡単に取れることがわかったので、「arp-scan」を使うことにしました。
③MACアドレス確認
DBには、名前と個人のスマホのMACアドレスを事前に入れています。
登録にはこのようなページを作り、各自で登録できるようにしています。
※MACアドレスを自動で取るか迷ったのですが、自動でとるのって、何か気持ち悪いなと思い、自分で入れるようにしました。
さて、出社と退社時間をどのようにして判定しているかを書きます。
出社の場合は、Wi-Fiに初めて繋がった時を、出社時刻とすればいいので、そこまで難しくはないです。
問題は、退社時刻です。
お昼休みのときや外での打ち合わせなどで、スマホをもって外出し、またオフィスに戻ってくるということがよくあります。つまり、繋がったら出社、切れたら退社とはできないです。
退社時刻をどうしたかというと、出社した日の最後に繋がった時間を退社時間としました。
最後に繋がったのが10月20日19:00だったら、10月20日の退社時間は、19:00としました。
ちなみに、10月21日25:00に退社した場合は、10月20日23:59を退社として、10月21日25:00が出社となります。
ただ、こういった日をまたいで仕事するケースは弊社の場合「ない」ので、あまり考慮していません。
④打刻時間結果出力
その月の打刻時間は、webページでこんな感じに見れるようにしました。
弊社では、最終的にMFクラウド給与を使って勤怠と給与を結びつけています。
MFクラウドの勤怠はCSVで更新ができるので、MFクラウドに読み込ませるCSVを出力するようにしています。
月末にこのCSVをMFクラウドに読み込ませたら、その月の勤怠は完了です。(この作業も自動化したいのですが、それはまた別の時間で作ります)
運用後の課題
運用してみて課題に上がったのが...
1.別のWi-Fiルーター(ゲストWi-Fiとか)に接続した状態でMACアドレス登録した。
2.MACアドレス?なにそれ?おいしいの?
3.Wi-Fiに繋がっていなくて、打刻できなかった。
1は、違うWi-Fiに繋がっていたら、登録時に教えるとかになるのかなっと思いますが、ブラウザで取れるのかな...
2は、自動でMACアドレスを取得する形がいいのかなと。たしかに、MACアドレス調べてねって、なかなか詳しくないとできないです。
3は、これは、どうしようかなと...お昼までにつながっていなかったらSlackで教えるとかかな...
まとめ
今の所、打刻忘れていません!
現在、arp-scan を使ってMACアドレスを取得していますが、これでいいのか。この辺のネットワーク周りは疎くて...もっと他にいい方法があれば教えてください。
あと、svelteを使っている理由は...何にしようかなって考えていた時に、一年くらい前に「svelte触ったぞー」っていう知人の言葉が頭をよぎって、決めただけです。
今後、社員が増えていったら、他のやつに変えるかも....
ということで、エンジニア募集中です!
もう少し詳しくお話を聞きたい場合は、オフィスに来てくれたら、お菓子と一緒にお話します〜