项目十七--考勤记录仪
当今智能手机已成为日常生活中标配,一个最简单的考勤方案可通过手机连接公司路由器,判断用户何时到达单位、中间外出以及何时离开单位。
原理
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