项目十七--考勤记录仪

来自Microduino Wikipedia
跳转至: 导航搜索

当今智能手机已成为日常生活中标配,一个最简单的考勤方案可通过手机连接公司路由器,判断用户何时到达单位、中间外出以及何时离开单位。

原理

Linux下可通过iw event获取无线连接事件,如下即为某华为手机连接断开路由器的日志:


   root@microwrt:~# iw event
   wlan0: new station 58:2a:f7:84:xx:xx
   wlan0: del station 58:2a:f7:84:xx:xx


如果需要时间信息,可通过iw event -t命令获取。

通过/tmp/dhcp.leases中dhcp信息,即可根据mac地址获取设备名称,或者人工统计设备mac地址与人员对应关系。

示例

为解决pipe问题,需要使用stdbuf,不过官方源中的coreutils-stdbuf缺少libstdbuf.so,不能使用。microwrt官方repo中已提供, 各位可在/etc/opkg.conf文件末尾加入如下一行:

   src/gz microwrt http://repo.microduino.cn/microwrt/

并且移除option check_signature 1,然后运行

   opkg update && opkg install coreutils-stdbuf

在/www目录下添加文件status.html,内容如下:

   <!DOCTYPE html>
   <html>
   <head>
   <title>Wireless Monitor</title>
   </head>
   <body>
   </body>
   </html>

编写脚本monitor.sh并运行

   #!/bin/sh
   iw event | stdbuf -oL grep station | stdbuf -oL cut -d ' ' -f 2,4 | while read line
   do
           cmd=$(echo $line | cut -d ' ' -f 1)
           mac=$(echo $line | cut -d ' ' -f 2)
           if [ "new" == "$cmd" ]; then
                   cmd='online'
           else
                   cmd='offline'
           fi
           inline="<tr><td>"$(date "+%Y-%m-%d %H:%M:%S")"</td><td>"$cmd"</td></tr>"
           if grep $mac /www/status.html > /dev/null; then
                   sed -i "s%%\n$inline%g" /www/status.html
           else
                   hostname=$(grep $mac /tmp/dhcp.leases  | cut -d ' ' -f 4)
                   sed -i "s%<body>%<body>\n<h3>$hostname($mac)</h3>\n<table border=\"1\">\n<!--$mac-->\n$inline\n</table>%g" /www/status.html
           fi
   done

展示