出退勤管理ソフトを作ってみた ～その１～ 監視サーバー編

# シリーズ目次

- 出退勤管理ソフトを作ってみた ～その１～ 監視サーバー編
- [出退勤管理ソフトを作ってみた ～その２～ Google Spreadsheet編](https://qiita.com/sasaco/items/e68fc9f9e938907c49cc)

# 趣旨

うちの会社は、最近手伝ってもらう従業員さんが増えまして
出退勤管理をしなければならなくなったのですが、
どうせなら「プログラミングの勉強がてら全自動の出退勤管理システムを自作しよう」
ということで、作ってみました

## 仕組み

全自動の出退勤管理システムの仕組みがこちら

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/c79bb247-f52a-9250-cc6d-7a34cb097555.png)

1. 従業員のスマホを社内サーバーと同じ wifi につなぐ
2. 社内サーバーが 15分おきに 従業員のスマホに ping を送る
3. ping が返ってきたら Google Apps Script に通知する
4. 通知を受け取った Google Apps Script は、Google Spreadsheet に打刻する

4 の処理は[次回](https://qiita.com/sasaco/items/e68fc9f9e938907c49cc)解説します。今回は 1～3 の流れを説明します。

## 用意するもの

今回のシステムに必要なものは

- スマホのIP アドレスを固定できる wifi 環境
- 定期的にスクリプトを実行できるサーバー
- google のアカウント

# 手順

## スマホのIP アドレスを固定できる wifi 環境 の構築

### 従業員のスマホの MAC アドレスを確認する

まず、スマホのIP アドレスを固定にあたって各スマホを識別しなければなりませんので、
各スマホを識別のに MACアドレスを利用します。
MAC アドレスの確認方法は、[この辺の記事](https://enjoy.sso.biglobe.ne.jp/archives/mac_adress/)を参考にしてください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/513f0235-07b3-e419-2a2a-43163ab7c06b.png)

### DHCP サーバーの設定

弊社の DHCP サーバーは [Aterm WG シリーズ](http://www.aterm.jp/product/atermstation/product/warpstar/wg2600hp/) を使っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/4c3092cf-044d-1737-ab81-0a27b2fabe04.png)

これには **DHCP固定割当機能**が付いているので、下図のように従業員のスマホに IPアドレスを固定割当設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/ff49bdf4-69d3-5ee0-e884-db83e128dc06.png)

## サーバーから定期的にスマホが同じ wifi に存在しているか確認するスクリプトを実行する

弊社の ファイルサーバーは [Synology Disk Station](https://www.synology.com/ja-jp/products/DS218) を使っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/171f98ab-4fda-98db-9133-9599257be667.png)

### Synology ファイルサーバー の設定

これには、定期的に シェルスクリプト を実行できる**タスクスケジューラー**が付いています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/4703ffa2-9847-ae17-9dab-d5a1b9ea2b86.png)

１5分毎にシェルスクリプト を実行する設定にしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/359e8946-4d05-d6f5-1c93-8e019cc0b2e4.png)

### シェルスクリプト

ファイルサーバーから 以下のシェルスクリプトが １5分毎に実行されます。

``` bash:〇〇.sh
#!/bin/sh

#〇〇君の端末を検知
ipaddr="192.168.1.17"

ping -c 1 $ipaddr > /dev/null 2>&1

if [ $? -eq 0 ]; then
  curl -X POST -H 'Content-Type:application/x-www-form-urlencoded' -d "value=〇〇" https://script.google.com/macros/s/AKfycbzf7fiB8QGK47r_mjey4lxb_AwRfJsMZWbm6jTx/exec

fi

```

**`ipaddr=`** 固定した IPアドレスで従業員毎に[前の手順](https://qiita.com/sasaco/items/fe3afb25790cf9482cea#%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%AEip-%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B-wifi-%E7%92%B0%E5%A2%83-%E3%81%AE%E6%A7%8B%E7%AF%89)で割り当てたIPアドレス
**`ping -c 1 $ipaddr`** で 固定した IPアドレス 宛てに ping を一回送信します。
**`if [ $? -eq 0 ]; then`** でping に応答があった場合の処理を行います
**`curl -X POST`** [次回](https://qiita.com/sasaco/items/e68fc9f9e938907c49cc)解説する Google Apps Script に通知しています。
**`-d "value=〇〇"`** 従業員のID 
**`https://script.google.com/macros/s/asdfasfrabafdthsdfg/exec`** Google Apps Script のアドレスで、これも [次回](https://qiita.com/sasaco/items/e68fc9f9e938907c49cc)解説します。


# 次回

通知を受け取った Google Apps Script が、Google Spreadsheet に打刻する部分を解説します。
[Google Spreadsheet編](https://qiita.com/sasaco/items/e68fc9f9e938907c49cc)