笔者所在的天外天工作室是天津大学影响力最大的网络工作室,工作室网络文化氛围浓厚,成员 Geek 范十足。但由于工作室钥匙掌握在少数人手里,所以经常会发生兴高采烈地去工作室了,却发现门没开的情况,让人十分的失落。所以大家每次想去工作室,都提前在群里问:“工作室有人吗?”。为了解答这个疑问,在一次开会的时候,和同事的交流中被激发了灵感:我们可以通过路由器做一些事情。
确定了这个想法的可行性之后,我们迅速立项,开发出了一代产品,并开始了试运行。截止目前,该系统运行良好,时间统计数据被用做「最常驻工作室奖」评比的依据上。
本系统需要一台有无线网卡的 Linux 设备(路由器、树莓派…)、服务器,前者用于提供数据源,后者用于数据统计和提供前端所用的接口。实现统计某个区域的设备总在线时长和周在线时长,提供 Web 端显示当前在线设备以及 iOS 客户端显示在线设备和排行情况。
-
路由器 (Phicomm K2 PandoraBox 17.09)
作为一台路由器,很明显可以获取链接到自身的设备。在工作室初版「有人吗」的可行性探究过程中,我们发现了路由器的管理页面中 device list 中,有着设备的 DHCP Lease 表,但因为租约还没有到期,不在场的设备也会出现在其中。经过一段曲折的过程(一直盯着一个刚走同学的设备,等了半个小时就是没有下线。之后发现他在隔壁…),还好发现了一个规律,在线的设备会显示连接强度,所以只需过滤一下数据就好。于是就通过 Chrome 的开发工具获取了前端页面调用的接口,在路由器上调用时,能够成功获取设备数据。其实可以在路由器上处理保存数据作为服务器,但由于路由器没有 USB 接口、存储容量比较小而且没有动态域名,所以方便起见,把数据发送到用一台有固定 IP 的机器上进行处理。
调用前端的接口固然可以,但很不 Geek。既然前端可以获取到数据,直接在机器上肯定也有方法拿到。于是 Google 了一下。发现
/tmp/dhcp.leases
保存着租约,2.0 的版本里使用的就是这个文件里的 mac 地址和 IP 和设备名,但租约的时间是 24h,如果使用这个数据的话,所有设备就会一直在线(因为我没有一天一夜都不回宿舍的情况)。所以这个数据源也是不能用的。继续 Google,在 OpenWrt 的 FAQ 找到了相关的方法:# Proprietary Broadcom (wl) wl -i wl0 assoclist # Proprietary Atheros (madwifi) wlanconfig ath0 list sta # MAC80211 iw dev wlan0 station dump # Universal iwinfo wlan0/wl0/ath0 assoclist
在我的机器上使用的是
iwinfo rai0/ra0 assoclist
,从中截取 mac 地址,并且和/tmp/dhcp.leases
中的 mac 地址取交集,就可以获取需要的设备名、设备 IP、设备 mac 的数据了,并且是实时更新的。之后再用 curl 发送到服务器的某个接口上,就完成了数据采集的过程。 -
服务端
服务端使用 Node.js + Express + MySQL 的设计。
-
Web
采用 React.js 框架,采用 Material Design ,极简设计风格,支持响应式。
-
iOS 客户端
使用 Swift 语言,采用 Material Design 设计风格,支持查看在线人员和总时间排名。
本项目借助路由器来统计某个室内区域出席人员和在线时间,在此基础上可以实现更多东西,比如借助 iptables 统计每个设备对应的流量使用情况、利用长时间无流量的状况剔除作弊者、实现无感知签到等。现有版本并没有管理后台,如果不想用设备默认的名字,需要到数据库里修改,这一点也给使用者造成了麻烦。此外,在我们实际的使用过程中,存在着部分同学抱怨工作室的网速太慢,不想连接路由器,还想被统计的情况。考虑到这种情况,后续版本也可以尝试基于 arp 实现。本方案最让人烦躁的就是需要收集使用者的 mac 地址,但暂时没有更好的办法。
最后我要感谢的就是我的路由器,不仅要忍受被刷坏的痛苦,还为我的宿舍生活中提供了非常大的便利,为此项目做出了不可磨灭的贡献。