WRISTOMOメモ
WRISTOMOについて思いついたこと、調べたことを書き散らすメモ。
メモなので無茶苦茶だけど、そのうち体裁も整えていくかも。

Last Update: 2003/05/21 17:30


via 【流星号】腕PHS WRISTOMO vol.2【ウデンワ】@2ch 携帯板



シンクロプロトコル実験用サンプルプログラム


このプログラムは、NTT DoCoMoのWRISTOMO(リストモ)についている「シンクロ」機能と通信するプロトコルを再現するものです。 これは通信内容を独自に解析した結果に基づいて作られたもので、正常に動作することを期待していますが、正常に動作することを保証するものではありません。万が一スクリプトならびに解析結果を使用したことにより データが消失するなどの損害が発生したとしても、解析者である私は何の責も負わないこととします。あくまでも自己責任のもとご利用ください。


・解析したやりとりの内容を再現する実験スクリプトを用意しました。(実際に解析した内容はページ一番下にまとめてあります)

・Windows用のネットワークシンクロ向けEXE、シンクロケーブル向けEXE、ならびに全機種対応(たぶん)のPerlスクリプトがあります。

これは、解析をしてみたい人、またはWRISTOMO対応アプリを開発してみたい人むけの実験リリースです。このアプリは正直このままではまったく実用的ではありません




・現在わかっている不具合、もしくは現在まだわからないことは以下の通りです。情報をお待ちしております!

・ネットワークシンクロで、WRISTOMOからの応答が1パケット遅れてきます。なにか次の操作をすると前のパケットが送られてくるというか、そんな感じの動作をします。これで正しいのか、スクリプトの不具合なのかまだよくわかりません。(シリアル経由では起こりません)
・このプログラム(スクリプト)をそのまま使うと、レコード入力時にWRISTOMOのタイムアウトに間に合わないかもしれません(笑)。これはまぁ、実験用ということで適宜改造 or 参考にして書き起こしてください。
レコード登録時間・更新時間応答の数字の意味がまだ確定できていません。解析メモでは(単位:秒)としてありますが、どうも秒単位の数値にしては微妙に数字の上がりかたがズレています(ちょっとはやく数字が上がっているみたいです)。一緒に意味を考えてくれる人ぼしゅう(;´д⊂)
スケジュールデータ(レコード)の最後5バイトの意味が確定できていません。たぶんレコード番号が1箇所入っているんですが、なぜレコード番号が必要なのか(具体的にどういう意味があるのか)も含めてよくわからないのが実情です。スケジュールについては読み込みはともかく、現在では書き込みを行わないことをおすすめします
不正なデータを書き込んだ場合にどういう挙動をするかはまだ確かめていません。(たぶんそんなことにはならないとは思うんですが)最悪WRISTOMOが使用不能になる事態も想定されますので、書き込みには十分注意してください。
・まだ乱数発生アルゴリズムがわかりません。あらかじめ乱数列を用意することでなんとか通信はできていますが、できればきちんとアルゴリズムを突き止めたいものです。
・というか、これで私のWRISTOMO以外と通信できるのか、まだ確認してません。。。




Windows用EXE(シンクロケーブル用, ネットワークシンクロ用)

全機種用Perlスクリプト(ネットワークシンクロ用)




待受画面

・待受画面サイズは112×94ピクセル

・個人的には時計は24時間表記のほうが好み。設定はFUNCTION - 時刻設定

・壁紙を待受に設定すると上部に小さい時計が表示される

・実機の表示はだいたいこんな感じ。(画面見ながらピクセル拾ったのでほぼ間違いないはず。デザインする際の参考用)
待受表示サンプル


・ためしに描いてみた待受画面 http://www.geocities.co.jp/WallStreet/9089/wristomo/screen_01.gif
待受画面01

・「省電力表示」を設定すると、指定時間後にどの設定でもない時計画面になる。でもあんまりかっこよくない…

・「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経由ではダウンロードできたとか。条件要調査




設定,TIPS

・シンクロケーブル、充電ケーブルは奥までぐっと差し込むときちんとロックする

・バックライト点灯時のボタンがなにげにかっこいいので、バックライト点灯時間を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  レコード更新時刻(単位:秒) (リトルエンディアン)