このプログラムは、NTT DoCoMoのWRISTOMO(リストモ)についている「シンクロ」機能と通信するプロトコルを再現するものです。
これは通信内容を独自に解析した結果に基づいて作られたもので、正常に動作することを期待していますが、正常に動作することを保証するものではありません。万が一スクリプトならびに解析結果を使用したことにより
データが消失するなどの損害が発生したとしても、解析者である私は何の責も負わないこととします。あくまでも自己責任のもとご利用ください。
・解析したやりとりの内容を再現する実験スクリプトを用意しました。(実際に解析した内容はページ一番下にまとめてあります)
・Windows用のネットワークシンクロ向けEXE、シンクロケーブル向けEXE、ならびに全機種対応(たぶん)のPerlスクリプトがあります。
・これは、解析をしてみたい人、またはWRISTOMO対応アプリを開発してみたい人むけの実験リリースです。このアプリは正直このままではまったく実用的ではありません。
・現在わかっている不具合、もしくは現在まだわからないことは以下の通りです。情報をお待ちしております!
・ネットワークシンクロで、WRISTOMOからの応答が1パケット遅れてきます。なにか次の操作をすると前のパケットが送られてくるというか、そんな感じの動作をします。これで正しいのか、スクリプトの不具合なのかまだよくわかりません。(シリアル経由では起こりません)
・このプログラム(スクリプト)をそのまま使うと、レコード入力時にWRISTOMOのタイムアウトに間に合わないかもしれません(笑)。これはまぁ、実験用ということで適宜改造 or 参考にして書き起こしてください。
・レコード登録時間・更新時間応答の数字の意味がまだ確定できていません。解析メモでは(単位:秒)としてありますが、どうも秒単位の数値にしては微妙に数字の上がりかたがズレています(ちょっとはやく数字が上がっているみたいです)。一緒に意味を考えてくれる人ぼしゅう(;´д⊂)
・スケジュールデータ(レコード)の最後5バイトの意味が確定できていません。たぶんレコード番号が1箇所入っているんですが、なぜレコード番号が必要なのか(具体的にどういう意味があるのか)も含めてよくわからないのが実情です。スケジュールについては読み込みはともかく、現在では書き込みを行わないことをおすすめします。
・不正なデータを書き込んだ場合にどういう挙動をするかはまだ確かめていません。(たぶんそんなことにはならないとは思うんですが)最悪WRISTOMOが使用不能になる事態も想定されますので、書き込みには十分注意してください。
・まだ乱数発生アルゴリズムがわかりません。あらかじめ乱数列を用意することでなんとか通信はできていますが、できればきちんとアルゴリズムを突き止めたいものです。
・というか、これで私のWRISTOMO以外と通信できるのか、まだ確認してません。。。
・待受画面サイズは112×94ピクセル
・個人的には時計は24時間表記のほうが好み。設定はFUNCTION - 時刻設定
・壁紙を待受に設定すると上部に小さい時計が表示される
・実機の表示はだいたいこんな感じ。(画面見ながらピクセル拾ったのでほぼ間違いないはず。デザインする際の参考用)
・ためしに描いてみた待受画面 http://www.geocities.co.jp/WallStreet/9089/wristomo/screen_01.gif
・「省電力表示」を設定すると、指定時間後にどの設定でもない時計画面になる。でもあんまりかっこよくない…
・「WRISTOMOセーフカラー」(ディザがかからない色)は、今のところ
#000000 (R:0 G:0 B:0) |
#666666 (R:102 G:102 B:102) |
#999999 (R:153 G:153 B:153) |
#FFFFFF (R:255 G:255 B:255) |
を確認している。
・ディザがかかる色の範囲を確定したい
・左下のアイコン消したいなぁ…
・フォーマットはiメロディ3重和音、らしい
・メール添付(本文埋め込み)がうまくいかなかったという報告あり(未確認)
・HTTP経由ではダウンロードできたとか。条件要調査
・シンクロケーブル、充電ケーブルは奥までぐっと差し込むときちんとロックする。
・バックライト点灯時のボタンがなにげにかっこいいので、バックライト点灯時間を30秒にしてみたり
・腕につけたまま何か操作(Web見たりとか)をする際、ロアアームだけ開くと操作しやすい
(それを想定してか、ロアアームのみ開いたところにラッチ(固定)がある)
・FUNCTION - 文字入力 - キーボード設定 - かな(カナ)入力 - 入力後初期位置に戻すを設定しておくと入力がだいぶ楽になる
・初期状態だと、ハンドセット状態(開いた状態)で会話する際に耳の部分の形状が耳に当たって痛いので、着信時(通話時)に受話音量を上げておくと耳からスピーカーを離せて会話しやすい。この設定は保存されるので一度設定すればOK
・電話帳転送
・メール設定方法
メール自動着信
・メール添付可能データの詳細調査(写真添付しても表示できたりできなかったり…)
・DDIP契約ってできるのかな?
・料金プランについての検討
・32k 64kで電池のもちとか表示時間とかベンチマークしたいな
・シンクロの方法はネットワーク、ダイレクト、ケーブルの3種類
ネットワーク: WRISTOMOがダイヤルアップして、インターネットに接続、インターネット越しにTCP/IPでシンクロ
ダイレクト: WRISTOMOが相手のマシンに電話をかけ、直接PIAFS(?)で接続してデータをシンクロする
ケーブル: シンクロケーブル(別売)を接続してシンクロする
メディアが違うだけでやることはおんなじ
・シンクロケーブルは充電機能もある
↑充電表示はするけど、ひょっとしたら充電できてないかもしれない(いつまで待っても満充電にならない?)
・ネットワークシンクロの設定方法
[PC側]
・Intellisync for WRISTOMOをインストール
・Outlook(≠Outlook Express)は絶対必要
・接続設定 - ネットワーク(PHS)接続を有効にする、にチェック
・ポート番号は問題なければそのまま。(3850)←この数字はWRISTOMOで使う
・自分のIPアドレスを確認する。←このIPアドレスもWRISTOMOで使う
このとき、IPアドレスが192.168.…になってたりするとこのままではできません。詳しい人に要相談。
・パーソナルファイアウォールなどを設定している場合はポートに穴を開けるか、ファイアウォールを解除する
[WRISTOMO側(mopera使用)]
SYNC - 設定 - ネットワーク(PHS)設定 を
・接続先番号 : 166
・PTE設定 : OFF
・ユーザID : a
・パスワード :「パスワード接続時に入力しますか?」NO パスワード: a
・IPアドレス設定:「IPアドレス自動取得を行いますか?」YES
・DNS設定 : 「DNS自動取得を使いますか?」YES
・シンクロ先ホスト名: [PC側]で入手したIPアドレス (例: 210.153.89.190)
・シンクロ先ポート番号:[PC側]で設定したポート番号
以上の設定が終わったら、SYNC - ネットワーク(PHS) でできるはず。
・ネットワークシンクロはダイナミックDNSと組み合わせると便利なので解説書いたほうがいいかも
・トンネルと組み合わせた方法も解説要るかな?natcrackerとか?
・レコード取得リクエストで範囲外のデータを参照するとあっさりリブートしたりするので注意(しかも妙に再起動時間が長い(´ヘ`;))
・ケーブル接続、ネットワーク接続ともに流れているデータは同一。たぶんダイレクトも同じだと思う
・内部データベースのレコード種別は00:電話帳、01:スケジュールとなっているわけだが、なんだかレコード種別02というのも反応してくれちゃったりする。
レコード種別03以降のリクエストをなげると、反応は02として返ってくることからしてきちんとエラーチェックをしている結果として種別02がコマンドとして通る。何が入るんだろう…
(現在レコード種別02の登録数をリクエストすると、登録数0(何も入ってない)が返される。…うー、なんか書き込んでみようかしらん(笑))
・レコード登録時間・更新時間で使われている数字の詳細がまだよくわからん…っていうかこれ起点いつだ?本当に秒?
・通常のシンクロ手順は
1. PC ←(41)─ WRISTOMO
2. PC ─(01)→ WRISTOMO
3. PC ←(81)─ WRISTOMO
4. PC ─(03)→ WRISTOMO
5. PC ←(83)─ WRISTOMO
6. PC ─(04)→ WRISTOMO
7. PC ←(84)─ WRISTOMO
-----
8. PC ─(05)→ WRISTOMO 更新があるレコードに対して繰り返す
9. PC ←(85)─ WRISTOMO
-----
10. PC ─(03)→ WRISTOMO
11. PC ←(83)─ WRISTOMO
12. PC ─(04)→ WRISTOMO
13. PC ←(84)─ WRISTOMO
14. PC ─(02)→ WRISTOMO
15. PC ←(82)─ WRISTOMO
・以下作業中メモ。
-----------------------------------------------------
パケットの構造:
7E (デリミタ)
aa bb パケットサイズ (2bytes リトルエンディアン)
cc パケット番号 (シーケンシャル, 送信元ごとにカウント, 0からスタート, 送信ごとにインクリメント, 1byte)
dd コマンド番号
…… コマンドデータ
ee ff チェックサム (2bytes リトルエンディアン)
7E
------
※SIZEは7Eを含まない
※SUMは7EとSUM自身を含まない
------
コード7E(デリミタ)は必ずパケット先頭(または終端)を意味し、実データの中には含まれない。
データ中に7Eまたは7Dが出現した場合は、
7D → 7D 00
7E → 7D 03
とエスケープする。
ただし、エスケープはパケットをパックした後に行われる。
(※ チェックサムの計算や、パケットサイズの計算はすべてエスケープする前に
基づいて行われる。)
-----------------------------------------------------
レコードの内容:
[電話帳(type:00)]
0x0000〜0x0019 : 名前(24+2bytes)
0x001A〜0x0033 : 読み(24+2bytes)
0x0034〜0x0035 : 電話1アイコン番号
0x0036〜0x0057 : 電話1(32+2bytes)
0x0058〜0x0059 : 電話2アイコン番号
0x005A〜0x007B : 電話2(32+2bytes)
0x007C〜0x007D : 電話3アイコン番号
0x007E〜0x009F : 電話3(32+2bytes)
0x00A0〜0x00A1 : メール1アイコン番号
0x00A2〜0x00E3 : メール1(64+2bytes)
0x00E4〜0x00E5 : メール2アイコン番号
0x00E6〜0x0137 : メール2(64+2bytes)
0x0138〜0x0139 : グループ番号
0x013A〜0x013B : シークレット(00:OFF 01:ON)
[スケジュール(type:01)]
0x0000〜0x0031 : 件名(48+2bytes)
0x0032〜0x0063 : 場所(48+2bytes)
0x0064〜0x00C5 : 内容(96+2bytes)
0x00C6 : タイプ(00:時間帯指定 01:終日)
0x00C7 : 開始年(西暦-2000)
0x00C8 : 開始月
0x00C9 : 開始日
0x00CA : 開始時間 (終日はFF)
0x00CB : 開始分 (終日はFF)
0x00CC : 終了年(西暦-2000)
0x00CD : 終了月
0x00CE : 終了日
0x00CF : 終了時間 (終日はFF)
0x00D0 : 終了分 (終日はFF)
0x00D1 : アラーム設定(01:アラームON FF:アラームOFF)
0x00D2 : アラーム鳴動タイミング(nn分前,FF:アラームOFF)
0x00D3 : 00 (FF:アラームOFF)
0x00D4 : アラーム年 (FF:アラームOFF)
0x00D5 : アラーム月 (FF:アラームOFF)
0x00D6 : アラーム日 (FF:アラームOFF)
0x00D7 : アラーム時 (FF:アラームOFF)
0x00D8 : アラーム分 (FF:アラームOFF)
0x00D9〜 : 00 01 00 00 00
-----------------------------------------------------
暗号化:
実データの読み書き時(コマンド 06,85内のデータ)は、簡単な暗号化が施されている。
暗号化の方法は
1. 各パケットのデータ開始時に、コネクションオープン(Cmd:01)に指定した
キーを乱数種として擬似乱数の初期化を行う
2. データ1バイト転送ごとに擬似乱数を発生し、その値を元データにxorする
という手順で行われている。
この乱数種と擬似乱数発生アルゴリズムを受信側・送信側双方で共通化することで、
符号化・複合化を行っているようだ。
使用されている擬似乱数発生アルゴリズムはまだ判明していないが、乱数種0(0x0000)で
実際に発生する乱数列をここに記す。この乱数列をそのままxorすることで、乱数種0で
初期化した場合の通信を確保できる。
0x00,0x58,0xAF,0xA6,0x15,0xA4,0x37,0xE4,0x2B,0x74,0x7E,0xAD,0xED,0x8C,0x2E,0x2F,
0xBE,0x4B,0xE9,0xAF,0x8B,0x32,0x39,0xA3,0xD4,0x95,0xB7,0x10,0xF8,0x9E,0x7A,0x26,
0xC0,0x8A,0xC1,0x19,0x2E,0x1F,0xE4,0x41,0x87,0x6B,0x77,0x74,0x9D,0xC4,0xC0,0xA2,
0x61,0xFB,0x5A,0xB2,0xA9,0xE2,0x2A,0x9C,0x3D,0x00,0x82,0xC7,0x28,0x92,0x93,0xA4,
0x3C,0xC5,0x17,0x8A,0xE6,0x32,0x3F,0xD3,0x34,0x9A,0xDA,0x38,0x23,0xE2,0xC6,0x69,
0x2C,0x50,0x9B,0xF0,0x11,0x06,0x95,0x46,0xE4,0xBF,0xC2,0x36,0x59,0xC9,0x6C,0x71,
0x4C,0x42,0xC8,0x72,0x95,0x95,0xE0,0x94,0x0A,0x37,0xBD,0x70,0xD5,0x9E,0xD9,0x7B,
0xF7,0x82,0xC3,0xE0,0x1C,0x57,0x12,0x9A,0xA1,0x09,0x8F,0xD5,0xE2,0xF9,0x9E,0x86,
0xC8,0x37,0xED,0x48,0x92,0x01,0x5F,0x79,0xE3,0x7B,0x3A,0x95,0x0C,0xB0,0x8F,0xD1,
0x9A,0xC9,0xEA,0xFA,0x22,0x8B,0x3A,0x90,0x4C,0x16,0x02,0x1D,0x1D,0xDB,0xC0,0xDB,
0x88,0xDE,0x9D,0x85,0x37,0x2C,0x55,0x7C,0x95,0x9F,0x69,0x1E,0x20,0xD0,0x83,0x62,
0xED,0x5D,0x28,0xB8,0x7B,0x5C,0xA4,0x1F,0xBC,0x1E,0x32,0x86,0x60,0x27,0x6A,0x67,
0x64,0x6D,0xF0,0xA1,0xDA,0xD0,0x5A,0x95,0xFA,0xD9,0x60,0x84,0x69,0xB7,0x4A,0x27,
0xC7,0x76,0x96,0x90,0x7F,0x80,0xE9,0x3F,0xCA,0x59,0x37,0x87,0x04,0x96,0x35,0x23,
0x33,0x1E,0xFE,0x13,0xD4,0xA4,0x04,0xBC,0xE8,0x63,0x39,0x3F,0x3E,0x1B,0x7E,0x18,
0x02,0x4C,0x4B,0xFA,0x85,0xB1,0x9F,0xE9,0x4E,0xFF,0x2A,0x99,0x61,0xDE,0xB8,0x06,
0xCE,0x27,0xE0,0x54,0x7D,0x5F,0xED,0xE7,0x38,0x74,0x0C,0xC6,0xF8,0xB5,0xB6,0x2C,
0x74,0x17,0x60,0x6F,0xE6,0xA6,0x60,0x15,0x20,0x48,0x22,0x33,0xCF,0xB8,0x8B,0x09,
0x0D,0xC2,0xAD,0xDB,0x2D,0xBB,0xAC,0x11,0xC1,0x43,0xEF,0x9A
-----------------------------------------------------
コマンド番号の体系:
4x → NOTICE?
0x → PCからWRISTOMOへなんらかの指示
8x → WRISTOMOからPCへレスポンス
コマンド番号
01 コネクションオープン
02 コネクションクローズ
03 レコード数確認
04 レコード更新時刻取得
05 レコード取得
06 レコード書き込み
07 レコード削除
41 シンクロ開始要求
42 シンクロ強制終了要求
81 コネクションオープン完了
82 コネクションクローズ完了
83 レコード数レスポンス
84 レコード更新時刻レスポンス
85 レコード取得レスポンス
86 レコード書き込み終了レスポンス
87 レコード削除終了レスポンス
-----------------------------------------------------
[00 ping?](パケット番号=FF)
00 cmd
[01 コネクションオープン]
01 cmd
aa bb レコード暗号化キー(乱数種)
00 ??
[02 コネクションオープン]
02 cmd
00 ??
[03 レコード数確認]
03 cmd
aa 種別(00:電話帳 01:スケジュール)
[04 レコード更新時刻取得]
04 cmd
aa 種別(00:電話帳 01:スケジュール)
[05 レコード取得]
05 cmd
aa 種別(00:電話帳 01:スケジュール)
bb cc 取得したいレコード番号(リトルエンディアン)
[06 レコード書き込み]
06 cmd
aa 種別(00:電話帳 01:スケジュール)
bb cc 書き込みたいレコード番号(リトルエンディアン)
dd ee .... データ(コネクションオープン時に登録した暗号化キーによりエンコードされている)
[07 レコード削除]
07 cmd
aa 種別(00:電話帳 01:スケジュール)
bb cc 削除したいレコード番号(リトルエンディアン)
[08 レコード新規作成]
08 cmd
aa 種別(00:電話帳 01:スケジュール)
bb cc .... データ(コネクションオープン時に登録した暗号化キーによりエンコードされている)
[41 シンクロ開始要求]
41 cmd
[42 シンクロ強制終了要求]
42 cmd
aa 理由 00
02 タイムアウト
03 ユーザーキャンセル
[81 コネクションオープン完了]
81 cmd
00 ??
03 ??
03 製造年?
04 製造月?
aa bb cc dd 製造番号 (16進 aabbccdを10進変換すると製造番号になる)
[82 コネクションクローズ完了]
82 cmd
00 ??
[83 レコード数レスポンス]
83 cmd
00 ??
aa 種別(00:電話帳 01:スケジュール)
cc dd レコード数 (リトルエンディアン)
ee ff ?? [C8 00]電話 [32 00]スケ
[84 レコード更新時刻レスポンス]
84 cmd
00 ??
aa 種別(00:電話帳 01:スケジュール)
cc dd レコード登録数 (リトルエンディアン)
---
ee ff レコード番号 (リトルエンディアン)
gg hh レコード番号に近い数字(-2) 詳細不明 (リトルエンディアン)
ii jj kk ll レコード登録時刻(単位:秒) (リトルエンディアン)
mm nn oo pp レコード更新時刻(単位:秒) (リトルエンディアン)
--- ↑をレコード数分繰り返し
[85 レコード取得レスポンス]
85 cmd
00 ??
aa 種別(00:電話帳 01:スケジュール)
bb cc レコード番号(リトルエンディアン)
dd ee .... データ(コネクションオープン時に登録した暗号化キーによりエンコードされている)
[86 レコード書き込み終了レスポンス]
86 cmd
00 ??
aa 種別(00:電話帳 01:スケジュール)
bb cc レコード番号(リトルエンディアン)
dd ee ff gg レコード更新時刻(単位:秒)(リトルエンディアン)
[87 レコード削除終了レスポンス]
87 cmd
00 ??
aa 種別(00:電話帳 01:スケジュール)
bb cc レコード番号(リトルエンディアン)
[88 レコード新規作成終了レスポンス]
88 cmd
00 ??
aa 種別(00:電話帳 01:スケジュール)
bb cc レコード番号(リトルエンディアン)
00 00 ??
ii jj kk ll レコード登録時刻(単位:秒) (リトルエンディアン)
mm nn oo pp レコード更新時刻(単位:秒) (リトルエンディアン)