Pages

Monday, 9 November 2015

用手机远程控制dd-wrt路由器的无线开关

家里的路由是 buffalo WZR-HP-G300NH, 千兆有线加 300M 无线, 刷了 dd-wrt 挂着移动硬盘下 pt, 用着嗷嗷爽. 不过整天开着 wifi 总担心辐射, 所以需要有一个方法来按需控制 wifi 的开关. 用路由器上的按钮来控制的方法弱爆了, 能躺在床上用手机远程遥控才是我的目标.
其实控制 wifi 开关的本质就是两条命令: ifconfig ath0 up 和 ifconfig ath0 down, 把 ath0 换成 wifi0 也行. 路由器连的外网是联通的 ADSL, 有公网 ip, 绑定了希网 (www.3322.org) 的动态域名 (dd-wrt 内置支持) 以后事情就简单了, 通过手机的 edge ssh 上去执行这两条命令就行. 所以一开始的方案是这样的:

这个方法用了一段时间, 渐渐发现了一些缺点:
  • 手机需要越狱, 装 openssh 和 mobile terminal, 后者还不太稳定 (勉强能忍);
  • 每次开关都需要输命令和密码 (不能忍. 密码可以用证书解决);
  • 常常开了无线就忘记关.
用户 (就是我) 的需求其实是一键开关无线, 最好用完自动关闭. 根据这个需求, 对上面的方案进行了改进:
  • 路由器端, 修改 root 帐号的 .profile, 增加两个 alias:
alias up='ifconfig ath0 up'
alias down='ifconfig ath0 down'
修改 crontab, 增加一行
0 */2 * * * ifconfig ath0 down
  1. 手机端, 找到一个更好用的 ssh client app: prompt, 原价 $4.99. 这个 ssh client 支持 profile, 支持保存密码, 支持连接成功后自动执行命令.

这样一来, 需要使用无线的时候, 只需要两个 touch 动作: 打开 app, connect, 避免了输入命令和密码的繁琐. 等下一个偶数整点, 无线自动关闭, 避免了忘关无线的情况出现. It just works.
PS: 假如路由的外网 ip 不是公网 ip, 那打开无线那一步会麻烦一些, 无线关闭的时候 ssh 不能直接连上路由. 可以迂回一下, 找个主页空间, 写一个状态页面, 里面就一个 on 或者 off; 路由器上跑一个 crontab 定期 (比如 2 分钟) 去轮询这个状态, 根据状态去控制无线的开关. 实时性差一些, 但也基本可用. 主页空间也可以用 email / xmpp / 微博什么的代替, 工程量不同而已, 都是体力活.