前文
2013年の終わりに、私たちの会社はモスクワ市の複合体の塔の1つにある新しいオフィスに移転しました。 建物の過去のテナントからの遺産として、さまざまなタイムゾーンで時間を表示するように設計された天井時計がありました。 どうやら、テナントは金融または銀行セクターに結び付けられていたようです。
最初は、時計の再構成(時刻の調整と表示されている都市の変更)を試みましたが、それはできませんでした-モノリシックなアルミニウムの箱がコントロールなしで天井にぶら下がっていました。 その後、時計の電源が切られ、生命の兆候なしに吊るされたままになりました。 2年後、このアイデアは時計を復活させ、それをより多くのものとして使用するようになりました。

デバイス識別
途中の最初の問題は、デバイスを識別する必要があることでした-私たちは時計のモデルやそのメーカーを知りませんでした。 デバイスの本体に識別マーク、ステッカー、彫刻が見つかりませんでした。 デバイスのドキュメントも欠落していました。
この時点で、デバイスを識別するために、側面から始めて箱を開ける必要があるという結論に達しました。 ボルトヘッドは、2年前に最初に開こうとしたときに損傷しました。 ボルトの1つを外すことができませんでした-パネルの角を壊さなければなりませんでした。 幸いなことに、それは柔らかいアルミニウムで作られているため、構造に最小限の視覚的および構造的損傷を与えることが可能でした。

壊れた角
内部にはワイヤーの網と制御ボードが散在していた。 そのうちの1つで、Wharton時計の製造元の名前を確認することができました。このWebサイトでは、コピーが視覚的な標識で識別されています。

内部を見る
メーカーのウェブサイトでは、消費者サポートセクションは、英国に本部を置く組織の連絡先に限定されています。 2番目のサポートラインと電話で10分間話し合った後、リモコンを使用して時計を設定する手順が詳細に説明されている監視命令が送信されました。 テナントは私たちにリモコンを置いていきませんでした。
サポートサービスとの対話の10分後、クロックの設定、タイムゾーンの設定、セクションの署名の設定、および時刻の同期を行うように設計された独自のユーティリティが送信されました。 このプログラムは、通常のCOMポートを介して時計と通信しますが、このポートは、時計の上の誤った天井の下でインストーラーによって親切に隠されていました。 私たちの例では、プログラムはバタンと動きました。

時計の内部を調査する過程で、各セクションの制御盤にジャンパーのセットが確認されました。 ユーティリティとジャンパーを試してみたところ、セクションの内部番号を制御し、異なるセクションに同じ情報と時間を表示できることがわかりました。 この機能は、双方向のサンプルに関連しています-時間とテキストが両側で複製されます。
監視プログラム
演習の面白い部分に移りましょう。独自の制御プログラムを作成するために、チューニングプログラムのアルゴリズムを分析します。 このタスクにアプローチする方法はいくつかあります。 まず、公益事業者を解体するオプションを検討しました。 アセンブラコードの理解を何度か試みた後、彼らはデータ転送プロトコルのリバースエンジニアリングの道に従うことを決定しました。COMケーブルを介して送信されるデータを調べて理解することです。


COMポート経由で送信されるコマンドを調べるために、プログラムHDD Software Device Monitoring Studioを使用しました。 プログラムは、その動作モードに違反することなく、システムにインストールされたCOMポートにしがみつき、ポートで送信されたデータを削除し、転送間の遅延に基づいてデータパケットに自動的に分割します。 スタジオを実行して、クロックのセットアッププログラムからトラフィックを削除しました。

プロジェクトの目的上、タイムゾーンの変更は不要であるため、リクエストの最初の部分のみを詳細に検討しました。 試行錯誤により、リクエストの最初の部分の構造をより詳細に解析することができました。

チームの始まりと終わりは、すべてのチームにとって一定の値です。 ASCIIテーブルでは、これらのコードは「テキストの始まり」と「テキストの終わり」の文字に対応しています。 スコアボードコードは、複数のスコアボードがチェーンで接続されている場合に意味があります。 私たちの場合、スコアボードは1つだけであるため、私たちにとっては、ある意味、値は定数です。 いくつかのコマンドコード(「テキストの設定」、「タイムゾーンの設定」、「時間の同期」)があります。このプロジェクトでは、「 0x83
テキストの設定」のみが使用されます。 セクション番号の場合、値は次の式に従って使用されます: 0x80 + _ – 1
。
セクションテキストの場合、変換ルールが使用されます: 0x80 | ord()
0x80 | ord()
。 この時計は、数字、ラテン文字、小文字と大文字、スペース、特殊文字、句読点などの表示用の小さな文字セットをサポートしています。 キリル文字はシステムに接続されていません。 テキストは10文字に制限されており、一定です。 表示される文字列の長さが10文字未満の場合は、文字列をスペースで完全に「仕上げる」必要があります。 時計にテキストを表示する場合、行の先頭と末尾のスペースは無視され、レンダリング時にテキスト自体が中央に配置されます。 文字コードがサポートされていない場合、「!」記号が表示されます。
各コマンドの最後にチェックビットがあります。 関心のあるチームの場合、チェックディジットを計算するための式は、テキストとセクション番号(既にエンコードされている)の文字XORです。 受信した値については、高オクテットと低オクテットがメッセージのチェックビットの別々のバイトに書き込まれます。 視覚的な例:

このアルゴリズムは、適切なコマンドを直接COMポートに書き込むPHPで記述された概念実証スクリプトによって検証されました。 このスクリプトを使用して、チーム間の最小許容遅延を指定しました。特に、1秒(サプライヤーのプログラムの標準)から300ミリ秒までのチーム間の遅延を最小限に抑えることができました。また、クロックでサポートされているアルファベットもチェックしました。
ネットワーク経由で時計にアクセスする
監視プログラムとの相互作用は、問題の一部にすぎませんでしたが、最も困難でした。 プロジェクトの成功を確実にするために、制御コマンドをネットワーク経由で時計に送信できる必要がありました。 最終的に、テスト用ラップトップを24時間365日の時計に接続したままにすることはできませんでした。
ネットワーク接続を実装するために、TCPポートを開いて外部接続を待機する単純なC#プログラムを作成することにしました。 ネットワーク経由でコマンドを受信すると、プログラムは次の操作を実行します。
- ロックを設定します(クロックとの並行作業を除外します)。
- クロックがハングするローカルCOMポートを開きます。
- コマンドを送信します。
- ポートを閉じます。
- 事前に設定された時間(上記のように-300ミリ秒)待機;
- ロック解除;
- コマンド実行の確認を送信します。
最初は、ネットワーク上のCOMポートへの直接接続を提供する(つまり、 tcp2comソリューションを実装する)という考えでした 。 このようなアプローチにより、ウォッチにコマンドを送信し、デバイスで実験することができます。 しかし、結局、このアイデアは放棄され、すべてのコーディングおよびクロック管理ロジックを実装するサービスプログラムを実装することになりました。

コンパイルされたプログラムは、XMLインターフェイスを実装し、C# HttpListener
標準を介して要求を受け入れます。 ネットワーク上のメッセージの形式は、設定するセクションと表示されるテキストを示しています。
<setTextXML> <section>[section number]</section> <text>[section text]</text> </setTextXML>
書かれたプログラムは、オフィスの技術室にロックされたWindowsサーバーにインストールされました。 サーバーはある程度離れているため、仮天井の下の10メートルのCAT5ワイヤーを時計からユーティリティルームにドラッグしました。 CAT5ケーブルは、信号COMケーブルとして使用されました(2本のワイヤのみが使用されました)。 時計用の10メートルのワイヤが多すぎるという心配がありましたが、幸いなことに、接続は問題なく機能しました。 Windowsサーバー自体は会社の内部ネットワークに接続され、静的アドレスを持っています。 内部ネットワーク上のブラウザからの簡単なテストにより、通信の存在と、プログラムと時計との接続の両方の正しい動作が確認されました。
有用な情報を表示する
時計が接続され、Webサービスとしてオンラインで利用できるようになりました。 役に立つ情報を印刷する時が来ました!
外部データソースとの統合のために、オフィスに展開されたSAP Process Integration 7.4コーポレートバスを採用しました。 プロジェクトが運用された時点で、3つのデータソースを取得しました。
- ロシア中央銀行。
- ロシア水文気象センター;
- Yandex.Traffic
SAP PIシステムは、外部ソースのスケジュールのポーリング、データ変換、および結果のクロックへの転送に従事しています。
中央銀行の場合、ユーロと米ドルの為替レートに関する最新の公開データを1時間に1回取得します。 Hydrometeorological Centerの15分ごとに、キエフスカヤ地下鉄駅の近くにある気象観測所から情報を収集します-最寄りの気象観測所は私たちのオフィスに直接アクセスできます。 利用可能な属性のうち、温度と相対湿度のみを表示します。 Yandex.Trafficサービスは15分ごとに更新され、モスクワ全体の交通渋滞の現在の状態を表示します。
そして今-写真の仕上げ!
