分类目录归档:折腾

Watchdog Timer on Cubieboard

准备将 Cubieboard 留在家里,放在路由器边长期开着收收短信什么的。
有了 Watchdog Timer(看门狗计时器)一旦 Cubieboard 死机,系统将自动重启。重启由硬件实现,确保可靠性。

内核支持

需在编译 Linux 内核时开启 Watchdog Timer 支持、编译 sunxi watchdog 驱动

选项位于Device Drivers >> Watchdog Timer Support,勾选WatchDog Timer Driver CoreAllwinner A10/A13 Watchdog。可以考虑勾选Disable watchdog shutdown on close,选择后若 watchdog 进程意外结束也将触发重启,否则 watchdog 将随 watchdog 进程的关闭而关闭。[1]

CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y
CONFIG_WATCHDOG_NOWAYOUT=y
CONFIG_SUNXI_WDT=m

若驱动编译为内核模块,需要手动加载:

sudo modprobe sunxi_wdt

可在/etc/modules加入一行,系统启动时将自动加载:

sunxi_wdt

加载成功后可以看见/dev/watchdog。任意程序打开该文件将启动 watchdog,打开后必须定期“戳一下” (poking) 它,即往里写数据。[1]

安装用户空间程序

戳狗程序当然有现成的:

sudo apt-get install watchdog
sudo service watchdog start

可以留意下配置/etc/watchdog.conf,有检测负载、内存、网络和自定义检测命令等可选功能。

U-Boot 支持

上述方案中,watchdog 只会在系统正常启动,且正常加载 sunxi_wdt,且 watchdog daemon 正常运行后才会生效。若开启 U-Boot 内置的 watchdog 支持,可在系统引导失败时重启系统

这是可选项,我还没试过,只是看文档中有写。(嘛毕竟有山寨货了(见下文((

首先编译 u-boot-sunxi 时需启用CONFIG_WATCHDOG
其次修改boot.scr,在bootm这行之上加入watchdog 16。该文件在引导分区,若无需自行建立。
我还没试过,就不乱说了,请参考 u-boot-sunxi/wiki#bootscr-support 配置。

需要注意的是,A10 只支持最长 16 秒的间隔时间[2]。也就是说,从加载内核、挂载分区、一直到启动 watchdog daemon 必须在 16 秒内完成,否则将触发重启。

在此之前…

由于不知道 SoC 内置了 watchdog,我翻了些零件自己山寨了一个

山寨 Watchdog (左) 和 Cubieboard (右)

山寨 Watchdog (左) 和 Cubieboard (右)

洞洞板是以前焊的,其上是一块 ATmega16U,都闲置好久了;
左边方块是一个继电器和三极管二极管电阻之类的,通过 USB 口连接着 Cubieboard 的电源;
中间蓝线连着单片机与一 GPIO 口,用一个脚本周期性输出 0,1 来戳狗。

单片机检测到超时没戳时,给继电器通电几秒,就成了..

(说来 ATmega 也内置一个 Watchdog Timer…

[1] The Linux Watchdog driver API;
[2] Allwinner A10 User Manual v1.20 (PDF), P99 10.3.25. Watch-Dog Mode Register.

一种公平防作弊的抽签方式

luckydraw-cheat看到一张长图,讲程序猿群里分红包的。

其中有一段,有人写了一个程序用来摇号,但是随之而来的是摇号作弊问题..

最后的解决方法竟然是在摇号软件里加入“本人承诺……”复选框(见左图),这明显不是程序猿的风格啊,应该更蛋疼认真严谨才对。

我当即想了个简单易行的方法,保证摇号结果的公正随机。大致思路是:通过各自生成随机数,将随机性分散到每个人手中;用先公布随机数的散列值后公布随机数的方式,确保每个人在生成随机数时不知道别人的随机数;每个人都进行一次运算,所有人的结果均一致结果才有效。

有点 P2P 的意思。反正大家都是程序猿,读一遍代码就能确保没人在实现上做手脚,再不放心各自写一个互相兼容的客户端也行。

具体算法: 继续阅读

用 OpenVPN 实现双方 NAT 内 VPN 连接的尝试

学校位于墙外,宿舍宽带上下 100Mbps,如此优势不拿来架代理简直浪费.. 问题在于宿舍网络位于 NAT 后面没公网 IP,也没有 UPnP 这类方便的东西。不仅架代理麻烦,开 MC / TR 服务器什么的也很麻烦.. 尤其是在双方都是内网的情况下。

困难

于是做了不少尝试,比如宿舍内通过 VPN 连接自家路由器,然后将数据包通过自家路由器转发到宿舍路由器上,但这样做怎加了额外的延时,且受家里带宽限制。再比如通过 UDP 打洞 来实现双方直连..
但是如此一来,要用 UDP 来传送 TCP 内容,就需要自己实现 TCP 的各种功能,还要追踪连接,太过复杂大大超出自己能力水平(太弱了。所以就想着用各种办法偷懒。

绕开难点

上学期做的一个尝试是,用 tun 虚拟网卡,直接转发IP包。如此一来,TCP 全由系统实现,避开了这些复杂的事… (参见《OpenWrt 上使用 Python 操作 TAP/TUN》)最后止步于放假回家,和 Windows 下修改路由表的一些问题(很想具体喷一下但是这就扯远太了)。

前段时间忽然想到,OpenVPN 可使用 UDP 建立连接。如此一来,只要自己先(用少量代码)完成 UDP 打洞,而后的操作就可以全权交由(相当完善的) OpenVPN 处理,工作量、复杂度急剧下降。

具体实现

先简单重复一下 UDP 打洞的具体过程。 继续阅读

用 pcap_sendpacket 时别开 IP Forwarding

至少在我 Windows 7 下是这样的,用 pcap_sendpacket() 时别开系统的 IP forwarding 功能。
否则的话.. 包不会直接被送出去,而是会被系统路由一次再发。发生这种情况时,发送一个包,在本机会抓到两个包:前者没问题;后者 TTL 减一,源 MAC 和 目的 MAC 可能会被修改。但只有后一个包会被送出本机。

IP forwarding 默认是关闭的,修改注册表项HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter开启或关闭。启用后系统就成了个路由器,会根据路由表转发目标IP不是自己的包。我也忘了当时为什么开启来了。

不知道这是个例还是 WinPcap 的 bug ,别告诉我这是个 feature 就行…

利用上网卡转发短信至邮箱,来电提醒

想法

SMS to Email 效果

SMS to Email 效果

唔,最早的想法是:学校离家较远所以有两张SIM卡,而且由于资费原因只能分别在两地使用,想通过互联网代理,使得可以在一地同时使用两张卡..

最早想到的是使用闲置低端安卓机,后来发现手头闲置的一张华为数据卡(EC1261)可以利用,遂试着捣鼓出一个这玩意..

本文实现:

  • 将所收短信转发至指定 E-mail
  • 挂断来电并回复短信,同时发送 E-mail 提醒

虽然还不能接打电话,但至少接收各种验证短信不再麻烦了呢 🙂

设备

闲置 华为数据卡 EC1261 一张
装 ubuntu 的 Cubieboard 一块 继续阅读