将来的にはiPad単独でCSAプロトコルを用いて対局サーバに接続することを目指しますが、局面を表示するUIを作る必要があり道のりが長いです。 まずは、Macで動作する将棋エンジン用UIである将棋所Macに通信を仲介してもらうことにします。
将棋所は将棋エンジンと標準入出力でUSIプロトコルを用いて通信します。標準入出力はマシンの中でしか通信できないので、MacとiPadを通信させるにはネットワークで中継します。 やることはAWSで将棋エンジンを動作させる場合のssh経由と似ていますが、サーバとクライアントが逆になります。sshでは将棋所側がTCPクライアント、エンジン側がTCPサーバとなります。将棋所で対局開始をクリックしたときにエンジンをsshの機能で起動させることができるのでこの構成になります。一方でiPadのアプリを将棋所のあるMac側から起動して通信を確立するということができないので、将棋所側をTCPサーバ、エンジン側をTCPクライアントにします。将棋所で対局開始をクリックしたときに対局エンジンではなく、TCPサーバを起動します。そして、エンジン側を手動で起動し、その標準入出力をTCPクライアントとして接続します。
サーバ側(将棋所からはエンジンとして見えるもの)は以下のコードで生成します。内容は、ncコマンドを使い、TCPサーバを立ち上げるシェルスクリプトです。
echo -e '#!/bin/sh\nnc -l 8090' > listen.sh chmod +x listen.sh
将棋所のUI上のエンジン追加で、生成したlisten.sh
をエンジンとして追加します。listen.sh
を開いた時点でエンジンとの接続待ち状態になるので、以下のステップでエンジン側を起動します。
まだiPadアプリはできていないので、サンプルとしてMac上でLesserkaiを起動し、あえてTCPクライアントとして通信します。コンソールからLesserkaiがあるディレクトリ上で、以下のコマンドを実行します。
mkfifo ncpipe nc localhost 8090 <ncpipe | ./Lesserkai >ncpipe
テクニックは、ncコマンドをTCPクライアントとして起動し、その標準出力はパイプでLessekaiの標準入力に、Lesserkaiの標準出力は名前付きパイプでncの標準入力に与えることで双方向通信を実現する点です。
Lesserkaiを接続すればすぐにエンジン登録が完了します。以下、対局時は毎回コンソールから上記コマンドでエンジンを接続します。iPadアプリができたら、そのアプリ上から接続ボタンをタップすることで将棋所に接続することになります。
なお、通信の内容をコンソールに表示する場合は以下のようにします。
nc localhost 8090 <ncpipe | tee /dev/stderr | ./Lesserkai | tee /dev/stderr >ncpipe
以上のように、TCP通信で将棋所とエンジンを分離することができました。USIプロトコルをTCP経由で使用するiPadアプリを作れば、UIは将棋所Macに任せることができます。