其实一直都有个想法,人在外面远程控制/监控家里的某些情况,比如开灯、开空调啥的。
最初的想法是DIY路由器,但是电信的路由不敢妄动,再买个路由套路由就没啥意思了。
转又想到搞个ARM板算了,最后灵光一闪,有现成的旧手机为啥不用呢。
配置也不见得低,价钱比较起来也要对得起用户是吧。
关键是裸机开飞行、一直熄屏,耗电量也不见得高到哪里去。
于是就有了这番折腾。
要做什么
- 先来点简单的,我人在外面,可以获取家里Wifi连接的设备状态。
- 功能实现的基础上,有以下需求:(尽量靠拢,当然不实现也无所谓)
- 不要钱,这个没啥好说的
- 稳定,例如白嫖的云主机就不要说了,指不定哪天就没了
- 可拓展,方便兼容未来的其它需求,力求在现有基础上增加少些代码工作量。
思路
关于语言/工具
- 大体实现使用Java,直接运行在dalvikvm环境
- 可能涉及少许Linux Shell脚本
关于大体的框架架构
- 想要实现这个想法,粗略涉及有许多主体:
- Termux:可以看作能通过命令行/脚本实现诸如打电话等功能的主体
Tasker app: 由于定时调度引入,能调用Termux的某些脚本,可以看作是Termux定时/条件触发功能的一部分- 程序主体: 由Termux调用的子程序,因其重要性单独拉出
旧手机的其它部分: 受Termux监控,可以看作是Termux打电话、收发短信等功能的一部分- 云服务器: 限于没有外网IP,用来传递信息的第三方
- 远在家外的某设备
- 近在家里的某设备
- 这些主体之间的沟通交流,应当采用较常用、类型尽可能少的方式。一种常见的场景是:
- 程序主体通过Runtime.exec调用Termux命令;
- Termux通过curl http://127.0.0.1:port/path这类http请求的方式调用程序主体;
- 家里/外的设备通过浏览器以http请求的方式获取或控制云/程序主体
…
这样开发的工作量集中在旧手机的程序主体,云端少量,客户端访问控制使用浏览器即可
- 这样看,要实现的似乎是一个Java Web应用。
但由于是dalvikvm环境,直接老一套不太行。
再加上以前实现的服务器Demo基础,可以考虑参考SpringBoot进行实现。
目标是搭建完成以后,争取所有逻辑都在Controller里面解决,便于拓展。
关于功能实现
- 获取Wifi连接设备状态
- 以前写过Android app实现:局域网邻居发现app
- 大致原理
- 遍历邻居IP 发送UDP包,触发ARP协议
- 查询设备的ARP的缓存表,获取在线的Mac地址
- 关于云端的处理
- 没有公网IP,外面要和家里相互联系,只能靠云服务器了,但这和不要钱、稳定有一定矛盾
- 想了一下,主要还是在公网要有一个地方,程序主体能够上报状态、获取信息。我觉得Github就不错(薅羊毛…)。
- 因为有通过http请求方便快速地直接修改Github Repo的经验,感觉可行
FileUploader4Github - 所以,建个Repo,约定好上传、获取状态用的url位置,ok。