■Raspberry Piの起動モードを変更して、その上に載せるサブボードができて、php-dioで通信ができることも確認できたので通信システムの作成に着手。前回作ったもの((Home Autometing Device 1)HAD1)を流用しても良いのだけど、反省点が幾つかあったことと、ドキュメントがロクに揃ってないので新規に作成することにした。反省点の改善を考えると、前回作ったシステムの中心部分が使えないことも分かっているので作り直しはやむなし。
前回の反省点は大きく2つあって、1つはコマンドを発行するクライアントからの要求にAVRのデバイスが応答しないか、サーバーが応答を拾いそこなった場合にタイムアウトをクライアントに返す機能がいるということ。HAD1は時々応答を返さなくなることがあってサーバーが待ちに入ってしまい、それ以降cronで定期的にリクエストを発行し続ける後続がすべて待ちに入ってOSにプロセスがあふれた結果、ハングアップに近い状況になってしまった。サーバーがタイムアウトを検出してクライアントに適時応答していればそんな事態は避けられる。
もう1つはデバイスとの送受信を非同期化すること。HAD1はメッセージキューの読み書きとUARTの読み書きをやっていて、メッセージキューとのやり取りの間にデバイスからの応答を拾いこぼしていると思われる現象があって、それが先の応答の拾いこぼしの原因にもなっていると思われた。クライアントのやりとりはメッセージキュー経由で、そちらはサーバーからするとリクエストを受けて、処理した後にレスポンスするので待たせても良いのだけど、デバイス側にはリクエストを投げて、デバイスからのレスポンスを待たなければならない。デバイスのレスポンス読み込みでWAITさせてしまうと、デバイスがハングアップするとサーバーもハングアップしてしまうし、読み込みをNOWAITにすると、メッセージキューとやりとりしている間にレスポンスが到着して拾いこぼしてしまう可能性がある。
そこで、HAD2ではサーバーとデバイスからのレスポンス待ちの機能を分離することにしました。デバイスからのレスポンスは専用のプロセスに任せてメッセージキューに転送するようにします。サーバーはメッセージキューの読み込みだけに専念すればよく、宛先に応じてメッセージキューに返したり、デバイスへ書き込んだりするように動きます。
同時にサーバーはメッセージをタイムスタンプ付で格納し、定期的にタイムアウトしたメッセージがないかどうかを走査します。書いてしまえば当たり前のメッセージング処理なのですが、その当たり前を実装しようという話です。

そのHAD2のプロセス構成図になります。サーバー(msg_sv)が起動するとデバイスからのレスポンスを拾うD-Connectorを起動して、クライアント(msg_cl)からのコマンド応答待ちに入ります。