Kindle DX的一些增强

基本常识

第二代Kindle DX的全称是Kindle DX Graphite,简称Kindle dxg。简述几个值得注意的地方:

  • dxg都是黑色的
  • dxg不再有美国版和国际版之分,编号都是B009打头,都是Free 3G版本,所以你可以全球漫游
  • dxg没有wifi,所以你只能使用@kindle.com而没法使用@free.kindle.com邮箱在instapaper或者kindle.im之类的网站上订阅,这意味着你没法享用Whispernet的免费推送服务,而3G推送费用$.99/MB T_T
  • dxg的内置浏览器NetFront,不是WebKit,速度慢且不稳定,所以即使有Free 3G基本也是残废;不过内置浏览器支持下载mobi文件格式。
  • dxg重量535g,个人建议平时使用不要额外配皮套,否则比iPad还要重,拿来读书太累了;当然,鉴于E-ink屏的脆弱性,携带外出的话可以考虑增加一些保护
  • 如果你没有读扫描版pdf或者图文混排文献的强烈需求,强烈建议不要购买dxg……

jailbreak、字体和usbNetwork

越狱字体这些不用赘述,网上很多相关的资料。MobileRead还有一个合集,整理了所有kindle相关的增强。

而如果想对系统做进一步的hack,安装usbNetwork是必不可少的,它给予你访问系统根目录的能力。不过usbNetwork安装包的README关于安装部分我觉得有一点不是很清楚,说明一下:

  • HOST_IP 是本机的IP,即新增加的那个usb0设备的IP地址
  • KINDLE_IP 是kindle的IP

所以,实际上配置文件是无需修改的,全部使用默认设置即可(除非你的局域网恰好是192.168.2.0);通过USB接上kindle后,可能需要手动打开usbnet支持(按回车键调出search栏,输入;debugOn回车,然后输入usbNetwork回车即可);等待设备usb0就绪,也许在电脑上你唯一需要做的就是给该设备绑定上相应的IP地址:

$ sudo ifconfig usb0 192.168.2.1

然后,即可以ssh到你的kindle了(没有密码,直接回车):

$ ssh root@192.168.2.2

建议连接usbnet之前先关闭kindle的3g网络,等待ssh到kindle上后,再打开3g网络做相关调试工作。

山寨一个推送系统

就像我前面说的那样,dxg空有Free 3G,却没法享受便捷的免费推送系统,这简直就是暴殄天物,令人发指,令人如坐针毡;遂研究了一下,发觉可以山寨一个推送系统给自己使用。我没有看到Amazon的用户协议上禁止用户这么做,也许这尚属灰色地带。

获取Amazon proxy的web token

下载或者自己编译一个arm版本的tcpdump,可以很容易的侦听HTTP header,获取x-fsn的值:

# tcpdump-arm -nAi ppp0 -s0

不过有个坑爹的地方,Amazon自己的三个header不是按照HTTP RFC里规定的用CRLF分隔,而只用一个换行符分隔。

模拟浏览器程序

整体思路就是编个程序kindlepull,模拟内置浏览器的请求来通过3G访问互联网资源。本来想借助libcurl来封装HTTP协议,可惜只能通过CURLOPT_URL来指定访问的URL;而在这里需要通过Amazon proxy,待访问的url和请求的socket得分离开,所以没法偷懒了,只能去读HTTP协议,然后写socket程序了。

不过HTTP协议当然也不用全部实现,只需根据返回的header处理两种情况:

  • 压缩过的消息体 Content-Encoding: gzip proxy返回的内容都是压缩过的
  • 分隔开的消息体 Transfer-Encoding: chunked 通过proxy下载附件都是分块传输的

由于以前没有写过类似arm这样的嵌入式程序,发觉linux下基本的一些库都不知道去哪里找 :( 比如要处理Content-Encoding: gzip,一般直接用zlib就行了,这里我是找了份gunzip源码处理了 @@

交叉编译arm程序

我找了两份arm编译器Code SourceryScratchBox,都可以用来编译arm程序。不过为了避免kindle上的libstdc++.so过老,最后链接程序的时候,我还是加了-static做静态链接,发觉可以正确运行。

这里有我编译好的程序,建议放到/mnt/us/kindlepull/目录,便于维护。

运行程序

kindlepull有两种运行方式,一是作为一个daemon去定时下载文档,二是使用launchpad调用kindlepull下载文档,这样也许会省点电 :D

在vps上搭建mobi服务程序

除了dxg上运行的kindlepull外,还得一个外部服务FakeWhisper来协助生成mobi文档,这个随便用PHP或者Python编写一个Web服务就行了;而mobi转换程序可以直接调用Amazon提供的kindlegen

目前我的这个FakeWhisper是这样设计的,整个流程超简单:

  • 只对外暴露一个接口给kindlepull使用,该接口返回所有待下载的mobi链接,用\n分隔;
  • kindlepull获取这些链接后将开始逐个下载,而服务器将标识下载过的mobi资源。

而这些mobi资源的产生也可以模拟现有的几种玩法:

  • 发送邮件到某个特定邮箱,然后FakeWhisper从这个邮箱抓取文档并转换,
  • FakeWhisper定时抓取一些rss文档并转换。

项目

两个项目在我Github上: