Eee note EA800 と Eee Note Sync の対話をキャプチャしてみた (1)
前置き
Eee Note EA800 とは
台湾から ASUS 社の Eee note EA800 (以後 EA800 と呼ぶ)を輸入して三週間ほど経過した。EA800 はモノクロ液晶を使った電子ノート端末である。付属のスタイラスペンを使って、こんな具合にノートを取ることができるすぐれものだ。
Eee Note Sync とは
Eee Note Sync は、EA800 に付属する Windows PC との同期用アプリケーションである。Eee Note Sync を使うことで、電子書籍や電子ノートなどのデータを PC と EA800 との間で送受信できる。しかしその機能は十分とは言い難い。特に電子ノートに関しては、できるのはページデータ(gif)とメタデータ(xml)を CAB で圧縮したもの(.nte という拡張子のファイルになる)を PC へエクスポートして、同 .nte ファイルを EA800 へインポートすることだけ。PC上での閲覧や、ページの差し替え並べ替え、ノートの分割合併など、個人的に欲しかった機能はことごとく無い。せめて .nte ファイルが zip だったらもう少し取り回しが楽なんだけど。
EA800 を PC へ接続した際の通信内容
EA800 を PC へ接続した際に、PC (Eee Note Sync) と EA800 の間でどのような通信が行われるかを調べてみた。
EA800 を PC へ接続する
付属の USB ケーブルを使って EA800 を PC へ接続すると、以下のようにして Ethernet ネットワークが構築される。
- EA800 と Windows XP マシン (以下 PC と呼ぶ) を USB 接続
- EA800 の画面上に選択肢が表示されるので 「Eee Note Sync同歩模式」(Eee Note Sync との同期)を選択する
初回接続時であれば、ここでドライバや Eee Note Sync が PC へインストールされる(※ドライバや Eee Note Sync のインストールは「安装Eee Note Sync以及…」を選んだときのみ実行されるのでこれは嘘でした)- PC が EA800 を RNDIS device として認識する
- PC と EA800 が(仮想的な) Ethernet ネットワークで接続される
- EA800 は IP アドレス 169.254.2.1 を名乗る。EA800 内では DHCP サーバが起動している
- PC が EA800 内の DHCP サーバへ IP アドレスの払出しを要求。EA800 に IP アドレス 169.254.2.3 が与えられる
Eee Note Sync が EA800 を検知する
EA800 が PC に接続されたことを Eee Note Sync が検知する (おそらく Ping を使って)
コネクションの確立開始
Eee Note Sync は EA800 の接続を検知すると、「制御用コネクション」と「データ用コネクション」2つのコネクションの確立を試みる。後述するように、Eee Note Sync と EA800 との通信は「制御用」と「データ用」の2つのコネクションを使って行われる。FTP のようである。
制御用コネクションの確立
まず、制御用コネクション確立までの通信を以下に示す。なお、以降、[->] で PC (Eee Note Sync) から EA800 へのメッセージ送信を示し、[<-] で、EA800 から PC へのメッセージ送信を表すこととする。
- [->] Eee Note Sync が適当な空きポート(ここでは TCP 1331 とする)から、EA800 の TCP 20000 ポートへ接続を試みる (普通の TCP 3-way Handshake)
- [<-] EA800 の TCP 20000 ポートから、Eee Note Sync の TCP 1331 ポートへレスポンスが返る
commandconnectreturnvalue welcome to connect the server. server version 1.0(2010-07-16 10:00:00) version 3.0(2010-7-28 18:00)\n::\n
改行文字には 0x0a (LF) が使われている。また、メッセージの終端を示すための記号には "\n::\n" が使われているようだ。ここで "\n" は文字通り 0x5c ("\") と 0x6e ("n") であって、改行文字 (0x0a) を表すものではないので注意。また、メッセージの末尾には 0x0a (LF) は付かない。
データ用コネクションの確立
続いてデータ用のコネクションが確立される。
- [->] Eee Note Sync が適当な空きポート(ここでは TCP 1332 とする)から、EA800 の TCP 20001 ポートへ接続を試みる (普通の TCP 3-way Handshake)
- [<-] EA800 の TCP 20001 ポートから、Eee Note Sync の TCP 1332 ポートへレスポンスが返る
dataconnectreturnvalue welcome to connect the server data socket. server version 1.0(2010-07-16 10:00:00) version 3.0(2010-7-28 18:00)\n::\n
ログイン
2つのコネクション確立が終わると、制御用のコネクションを使って、Eee Note Sync から EA800 へログイン要求が送信される。
- [->] Eee Note Sync が制御用コネクション上で EA800 へログイン要求メッセージを送信
login 1 \n::\n
"1" の意味は不明。
- [<-] EA800 が Eee Note Sync へ応答メッセージを送信
loginreturnvalue 0 username=ASUS EeeNote passwd=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx version=1.0.1.36 \n::\n
なんとこちらからパスワードを入力する前に、EA800 からパスワードが送られてきた。さすがに平文では無いようだが。
Eee Note Sync 上にパスワードダイアログが表示される
このタイミングで、Eee Note Sync 上にパスワードの入力を促すダイアログが表示される。正しいパスワードを入力すると、特に通信は発生せず次のステップへ進む。このことから察するに、パスワードの検証は EA800 内で行われるのではなく、EA800 からパスワードに関する情報を受けとった Eee Note Sync が代理で検証を行っているようだ。
ちなみに、EA800 のセキュリティ設定でパスワードによる保護を有効にしていない場合は、EA800 から送信される passwd は空となり、Eee Note Sync 上でのパスワードダイアログも表示されない。
システム情報の取得
ログインが成功すると、Eee Note Sync から EA800 に対してシステム情報の取得要求が送信される。
- [->] Eee Note Sync が制御用コネクション上でシステム情報要求メッセージを送信
systeminfo -1 \n::\n
ここも "-1" の意味は不明。
- [<-] EA800 からシステム情報が送信される。
systeminforeturnvalue Internal SD 181 3049 6% External SD N/A Device Name ASUS EeeNote Device UUID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx fwboot V1.0.1 kernelrom V1.0.1.71 TW 0000 \n::\n
key, value, ..., key, value が改行で区切られているだけのようだ。ここで得られた情報が Eee Note Sync の "System Info" タブで表示されるのだろう。
ファイルリストの取得
続いて、EA800 内の DB ファイルリスト(ファイル一覧)が取得される。DB ファイルというのは、ノートとページの関係や作成日時などのメタデータを管理するファイルであり、実体は sqlite の .db ファイルである。このことから EA800 内のデータは sqlite で管理されていると考えられる。
- [->] Eee Note Sync が制御用コネクション上で DB ファイルリストの取得要求を送信する。
listfile 12 \n::\n
"12" の意味は不明。 "12" はリストの取得対象となるフォルダを示すIDである。後述するように、EA800 内のフォルダには ID が振られていて、"12" は DB ファイルリストを格納するフォルダの ID となっている。イメージ的には shell 上で "ls 12" をしてファイルリストを取得しているのに近いかな。
- [<-] EA800 から制御用コネクションを使って応答メッセージが返る。このメッセージに DB ファイルリスト自体は含まれない。
listfilereturnvalue 1 257\n::\n
"1" も "257" も何を指すものかは分からない。 "1" はおそらくステータスコード(成功を示す)"。"257" はファイルリストのサイズ。
- [<-] ファイルリスト自体は *データ用* コネクションを使って EA800 から Eee Note Sync へ送信される。
4096 12 stickymemodata.db 798084\n10240 12 voicedata.db 798084\n285 12 DBVerionInfo.inf 798084\n368640 12 ebookdata.db 798084\n16384 12 phonebookdata.db 798084\n6144 12 tagdata.db 798084\n1046528 12 notedata.db 798084\n62464 12 photodata.db 798084\n
メッセージの中身(ファイルリスト)は、ファイルサイズ、謎の数字(12)、ファイル名、謎の数字(798084)、改行(0x0a)、区切り文字("\n")、の 6 つの値を 1 セットとして、ファイルの数だけ(ここでは 8 つ)のセットが結合されて送られる。
ここで取得されるリストには、以下の 8 つのファイルが掲載された。
- stickymemodata.db
- voicedata.db
- DBVerionInfo.inf
- ebookdata.db
- phonebookdata.db
- tagdata.db
- notedata.db
- photodata.db
DBファイルのダウンロード
Eee Note Sync はリストに載っている 8 つの DB ファイルそれぞれについて、ダウンロードを実行する。
- [->] まず、Eee Note Sync は制御用コネクションを使って、stickymemodata.db のダウンロードを要求する。
downloadfile 12 Path=stickymemodata.db \n::\n
"12" の意味は不明。 "12" は前述した通り DB フォルダの ID。
- [<-] EA800 は制御用コネクションを使って応答する。
downloadfilereturnvalue 1 4096 md5=66c9a2dbf2041239700795efe2448c87 \n::\n
ファイル stickymemodata.db のサイズ(4096)とハッシュ値(66c9a...)が含まれている。"1" の意味は不明。 "1" はおそらく成功を示すステータスコード。
- [<-] EA800 はデータ用コネクションを使って、stickymemodata.db の内容を送信する。
SQLite format 3... [stickymemodata.db ファイルの実体]
- 以下、同様の処理が、残りの 7 つのファイルそれぞれについて繰り返される。
- voicedata.db のダウンロード
downloadfile 12 Path=voicedata.db \n::\n
downloadfilereturnvalue 1 10240 md5=7ab5ea8cd345f06f7b44ccf177e970d9 \n::\n
- DBVerionInfo.inf のダウンロード
downloadfile 12 Path=DBVerionInfo.inf \n::\n
downloadfilereturnvalue 1 285 md5=b12b4341a96dd901bf5867568a09f5f1 \n::\n
- ebookdata.db のダウンロード
downloadfile 12 Path=ebookdata.db \n::\n
downloadfilereturnvalue 1 368640 md5=3199fa4a8e270a352805c3123a7a5aea \n::\n
- phonebookdata.db のダウンロード
downloadfile 12 Path=phonebookdata.db \n::\n
downloadfilereturnvalue 1 16384 md5=488502c85dafbff66cea58dceebb2e76 \n::\n
- tagdata.db のダウンロード
downloadfile 12 Path=tagdata.db \n::\n
downloadfilereturnvalue 1 6144 md5=43a5f7851af89ffd1d637c02af4dbc5e \n::\n
- notedata.db のダウンロード
downloadfile 12 Path=notedata.db \n::\n
downloadfilereturnvalue 1 1046528 md5=39202016cf5ee1b30f5ba0f04cf03edd \n::\n
- photodata.db のダウンロード
downloadfile 12 Path=photodata.db \n::\n
downloadfilereturnvalue 1 62464 md5=07156c4dfef0bb9e9d51c1b56b20d4fa \n::\n
ファイルダウンロード完了
8 つのファイル全てのダウンロードが終わると、Eee Note Sync から EA800 へダウンロード完了を示すメッセージが送信される。
- [->] Eee Note Sync は制御用コネクションを使って、EA800 へダウンロード完了を示すメッセージを送信する。
downloaddbcompleted 0 13 0001-01-01 00:00:00 -1\n\n::\n
"0", "13", "-1" の意味は不明。日付も謎。
ここまでで、PC 内の C:\Documents and Settings\[ユーザ名]\My Documents\EeeNote\[UUID下12桁]\tempdatabase フォルダに、上記の 8 つのファイルがダウンロードされている。Eee Note Sync も内部で sqlite を使ってこれらのファイルに含まれるメタデータを参照するのだと思う。
とりあえずここまで
引き続き、電子ノートデータのダウンロードとアップロード部分を調べてみたい。