3.9. Linux と WinCE 3.0 (PocketPC) をつなぐ

この章は Stanislav Sokolov さんの提供によります。

この章では、Linux マシンと PocketPC デバイスを接続する方法について扱います。 前の章「Linux と WinCE を接続する」(これは CEwindows にも置かれています) は、Microsoft が WinCE 3.0 から直接 IrDA と接続するためのサポートを削除する挙にでているため、使えません。 私はまず "Linux to Windows CE Connection" (これは The Gadgeteer にあります) を出発点にしましたが、さまざまな場所で変更と簡素化を行う必要がありました。 この説では、PocketPC と Linux 間で ping ができるところまでを扱います。 ネットワーク用アプリケーションは、以下のサイトでいろいろ見つかるはずです。 PDAcentralCAMWinCEcity

私が試したシステムは、

PocketPC 側では、 Start -> Settings -> Connection -> Modem (英語版は。日本語版は不詳ですが、これを参考にしてください) を開き、 新しい接続 (new connection) を作成し、適当な名前を付け (私は Linux-m としました)、汎用のモデム (Generic IrDA modem) を選択し、ボーレートを 115200 に設定します。ポート設定 (Port Settings) では、8-N-1-Hardware を選択し、手動でダイアルする (Enter dialing commands manually) にチェックを入れます。これは、必要もないのに PocketPC に電話のダイアルをさせないようにするためです。 ほかの二つのチェックボックスはチェックしないままとしてください。 TCP/IP 設定では、サーバからの IP アドレスを使用する (Use server-assigned IP address) を選択し、Slip を使用する (Use Slip) はチェックせず、ソフトウェア圧縮を行う (Use software compression) と、IP ヘッダ圧縮を行う (Use IP header compression) をチェックします。 ネームサーバ (name Servers) の項では、サーバの指定したアドレスを用いる (Use server-assigned addresses) を選択します。"OK"、"次へ" の順に叩きます。 ここで電話番号を聞かれることがないはずです (聞かれた場合には、最初に戻って 高度な設定 (Advanced) セクションの "手動でダイアル" コマンドが選択されているか再チェックしてください。 呼び出しをキャンセルする (Cancel call...) と、ダイアルトーンを待つ (Wait for dial tone...) がチェックされていてはいけません。 これで、PocketPC 側の設定は完了です。

Linux 側では、まず必要なモジュールがすべてロードされていることを確認してください。 以下が、通信が成功するためにロードされ、使われるモジュールの一覧です。
Module                  Size  Used by    Not tainted
ircomm-tty             31040   2
ircomm                 13448   0  [ircomm-tty]
irtty                   7616   2
ppp_async               6688   1
ppp_generic            15740   3  [ppp_async]
slhc                    4592   1  [ppp_generic]
ls -la /dev/ircomm* の出力が以下のようになっていることを確認してください。
crw-------   1 root     root     161,   0 Nov 25 15:09 /dev/ircomm0
crw-r--r--   1 root     root     161,   1 Nov 22 19:30 /dev/ircomm1
irattach /dev/ttyS2 -sと入力して irattach を開始してください。

これで IrDA ポートがログインターミナル有効となったはずです。 私はログイン用に agetty を使っていますが、お好みの getty 相当プログラムが利用できます。/etc/inittab に以下の行を追加します。
s3:2345:respawn:/sbin/agetty ircomm0 115200 vt100
ファイルをセーブして、init を再起動して有効にしましょう。
init 2; sleep 3 ; init 3
接続の第二段階を行うため、以下のシェルスクリプトを用意しておきます。
#!/bin/sh
/usr/sbin/pppd -detach noauth local lock 192.168.55.1:192.168.55.2 ircomm0 115200 &

さて接続を行いましょう。まず赤外線ポートの位置あわせを行い、PocketPC 側で "開始 (Start)" -> "プログラム" -> "接続 (Connections)" から、作成した接続 (Linux-m) を叩きます。現れる "接続先 (Connect To)" ダイアログでは、何も入力せずただ "接続 (Connect)" を叩きます。 "手動ダイアルターミナル (Manual Dialing Terminal)" が現れて、Linux マシンのログインプロンプトがでるはずです (すぐにログインプロンプトがでない場合には、 仮想キーボードを立ち上げて "Enter" を押してください)。 ログインする必要はありません (これは お ま け です。 究極のリモートコントローラという訳です :)

Linux マシン側では、PocketPC ターミナルにゴミが出たらすぐに pppd コマンドを実行し、PocketPC 側で "ファイル(File)" -> "続行 (Continue)" を行います。 pppd では以下のメッセージがでるはずです。
Using interface ppp0
Connect: ppp0 <--> /dev/ircomm0
Cannot determine ethernet address for proxy ARP
local  IP address 192.168.55.1
remote IP address 192.168.55.2
PocketPC 側で "ステータス:接続中 (Status: Connected)" のダイアログボックスが表示されるはずです。 ifconfig を実行して ppp0 インターフェースが揚がって動作していることの確認ができます。 ping 192.168.55.2 では以下のような出力がされるはずです。
PING 192.168.55.2 (192.168.55.2): 56 data bytes
64 bytes from 192.168.55.2: icmp_seq=0 ttl=32 time=62.5 ms
64 bytes from 192.168.55.2: icmp_seq=1 ttl=32 time=310.0 ms
64 bytes from 192.168.55.2: icmp_seq=2 ttl=32 time=59.9 ms
64 bytes from 192.168.55.2: icmp_seq=3 ttl=32 time=59.8 ms
64 bytes from 192.168.55.2: icmp_seq=4 ttl=32 time=60.0 ms

--- 192.168.55.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 59.8/110.4/310.0 ms
RTT は距離と光の状況で変わります。切断 (Disconnect) か、相当のボタンにより、以下が出力されます。
LCP terminated by peer
Modem hangup
Connection terminated.
Connect time 2.6 minutes.
Sent 1336 bytes, received 1274 bytes.

ここまでの手順がうまくいかないなら、以下をチェックしてください。