小手工——动手打造一个更舒适的寝室

本文将介绍一些我本科期间为了让寝室更舒适,动手做过的一些东西,包括利用手机开门和更便捷地看视频。

整个代码见 GitHub

智能门锁

本科时的寝室门锁有点诡异,开门和锁门都需要钥匙;不锁门的话门会被风吹产生很大噪音。这让频繁拿外卖的我觉得很是麻烦。

后来研究了一下这个门锁,这个门锁本支持刷卡开门,但是由于前几届的学长发现,把门口的刷卡器掰开,短接一根线就能开门——这个设计本身就有问题,将控制线路放在了用户输入区域。

之后拆开门锁,引出了12V供电和控制线。这个控制线只需要触发一下即可,不需要外部管理继电器延时。于是就很简单——如果想将门锁接入自己的系统,只需要接入12V供电,然后额外使用一个继电器控制那根控制线(因为我们一般使用5V或3.7V板子)。

这里使用树莓派 + Arduino + 5V继电器完成这个任务。之所以用串口连一个 Arduino ,是因为继电器买成了5V版本==

手机开门

当可以使用树莓派控制门锁后,我们需要搭建更易用的系统。

这里使用的是微信公众平台,配置好地址后我们的服务器可以接收到微信服务器发来的用户消息。但是要将消息传递至树莓派,还需要一个进内网的操作。

寝室并没有办理电信宽带,而是以内网VPN连接实验室的方式白嫖了校园网== 所以并没有公网IP。这里要么使用VPN连接到VPS,要么找到某种方式将请求映射至内网。出于稳定性考虑,我直接用了CTF队的域名做了进学校的转发(虽说有点不太好==)。这样就让学校帮我做了一个进内网的操作,由于CTF队的主机多人使用并不完全可信,我这里做了 微信 -> VPS -> ctf.fudan.edu.cn -> 寝室内网IP 的通道。

在授权上,我使用了Google两步验证的算法。基于时间和预定义密钥生成半分钟内有效的key。

懒得掏手机?

这时我们已经可以在出电梯时提前打开门锁了。但是如果懒得掏手机呢?

于是就考虑到了WIFI。这里在路由器上跑了一个监测脚本,监测连入的移动设备MAC。

我将开门的条件设置为 新设备连入 && 该设备在指定的设备中 && 距离该设备上次断开连接时间已经过去 t 分钟以上 && dbm < threashold && 当前时间段符合要求 。这样,当白天出门拿外卖时,便可以在门口自动开门了。

(三年前搞的东西,本来拍了挺多图的,已经找不到了。)

刷脸?

可是忘带手机怎么办呢?于是在寝室门上接了一个摄像头。当检测到变化时拍照并上传至学校服务器,用 GPU 做人脸检测和比对(由于之前在高研院做相关的动作,代码和模型就直接拷贝过来用了)。由于整体稳定性太差,延迟也高的不行,并且也没啥活体检测手段,当时并没有投入使用。

如果放在今天,人脸比对服务已经非常普遍了,不考虑活体检测的话,可能直接调用别人的API就好了。

安心看视频

复旦的PT是个好东西,美剧电影还是挺全的。可是这种视频资源一般是原片,非硬字幕,所以下载后还要手动下载字幕文件并加载,就很麻烦。

字幕自动下载

因为用迅雷影音看视频时,可以自动下载字幕,于是就很好奇,这个接口是啥?Wireshark抓了一下抓到了请求,结合网上已有的迅雷哈希值生成算法分析,就能由视频文件直接得到该文件,然后去下载字幕啦!(见 V2EX 帖子)

但是这样还要手动执行脚本,也是挺麻烦啊!鉴于这里下载使用 aria2 ,于是可以直接监控 *.aria2 文件,如果被删除,就意味着下载完毕,判断一下下载的文件扩展名,即可去自动下载对应的字幕文件了。这里监控使用了 inotify 库。(完整代码见GitHub)

你可以使用 pip install subtitle 快捷地安装这个小工具, 然后 sub ABC.mkv 即可自动下载视频对应地字幕。

移动端自动下载

躺床上看视频多舒服呐。。可是下载视频还是要 打开PT->下载种子->打开aria2 web ui->上传种子

要是用安卓平板也就罢了,可是 iOS 对文件下载极不友好。怎么办呢,那直接写个东西接收PT种子地址,自动帮我下载种子好啦!

于是也很简单,使用 Flask 快速搭建了一个只给我自己看的小网站,直接在 Nginx 里用 IP 做了认证。当接收到 PT 种子链接时,自动登陆并下载,然后走 Aria2 JSONRPC 上传至 Aria2。

The END

毕业一年多了,还是挺怀念本科那些时光。