プロキシ(中継)を実機なしで試す

このサンプルは プロキシ(中継)モードを、上流の実機を用意せずに通しで試すためのものです。テスト対象アプリと実機の間に CommSim を挟み、往復をそのまま記録し、狙った 1 コマンドだけ偽装(フック)し、記録をシナリオ化して実機なしで再生するまでを一本の動線でたどれます。上流の実機役は CommSim.Sample の ② ペインが演じるので、実機は要りません。

TCP 7200 / 7201LineFrame中継・記録フック(偽装)シナリオ化実機不要

このページでできること

  • 上流の実機を用意せずに中継(プロキシ)トポロジを立て、テスト対象アプリと実機役の往復をそのまま記録する。
  • 記録を ログの種別フィルタ「Proxy」で時系列に確認し、LineFrame に再デコードされた中身を読む。
  • 狙った 1 コマンドだけ偽装(フック)して、実機では起こしづらい異常系を意図的に注入する。
  • 記録をシナリオ化して実機なしで再生し、持ち帰ってデバッグできるようにする。
  • 最後に「自分の通信ではどう使うか」を判断フローで掴む。
中継・キャプチャの各設定の網羅的な説明は 中継とキャプチャ を参照してください。このページは手順に絞っています。

登場人物(役割)と当てはめ

実機は要りません。① テスト対象アプリ役(CommSim.Sample の左ペイン)と ② 上流の実機役(CommSim.Sample の右ペイン)の間に、CommSim 本体=中継・記録が入る三者構成です。

① CommSim.Sampleテスト対象アプリ役:要求を連投
CommSim 本体中継・記録(プロキシ)
② CommSim.Sample上流の実機役:正常応答
② =このチュートリアル専用の「実機の代役」です。本番ではこの位置に実際の実機が入ります(三者が CommSim.Sample に同居して見えますが、② は実機の代わりです)。
ポートの意味:7200 = CommSim が受け付ける口(下流=① が繋ぐ先)/7201 = CommSim が転送する先(上流=② が待ち受ける口)。CommSim.Sample で「動かすサンプル=プロキシ(中継)」を選ぶと、① が 7200・② が 7201 に自動で揃い、② の自動応答が ON になります。手でポートを合わせる必要はありません。

このチュートリアルの構成 ↔ 実際の構成

役割このチュートリアルでは実際の現場では
① テスト対象アプリCommSim.Sample の左ペイン(7200 へ接続)実際のテスト対象アプリ(接続先を CommSim に向ける)
中継・記録CommSim 本体(下流 7200/上流 127.0.0.1:7201)CommSim 本体(下流=アプリの接続先/上流=実機)
② 上流の実機CommSim.Sample の右ペイン(7201 で待受・正常応答)実際の実機(PLC・センサ等)
接続タブ:プロトコル Tcp・Server・ポート 7200、転送先(上流)へ中継するが ON で転送先ホスト 127.0.0.1・転送先ポート 7201。ヘッダに「中継(プロキシ)として動作 — フック 0 件」
proxy-relay.commsim の「接続」タブ。下流=ポート 7200 で受け、「転送先(上流)へ中継する」を ON にして上流=127.0.0.1:7201(=②)へ転送する中継構成。ヘッダが「中継(プロキシ)として動作 — フック 0 件」=純素通し中継であることを示す(ステップ B でここが「フック 1 件」になる)。

用意するもの

ファイル内容
proxy-relay/proxy-relay.commsim中継(プロキシ)セッションのプロジェクト(下流 TCP 7200 待受/上流 127.0.0.1:7201 へ転送・LineFrame 構造体定義つき・ルール/オートメーションは空=純素通し中継
proxy-relay/proxy-relay.commsim-structLineFrame 構造体定義のみの可搬ファイル(別プロジェクトへのインポート用)
proxy-relay/logs/sample-proxy-relay.commsimlog中継往復を記録した採取ログ(起動せずログビュワーで眺める用)
proxy-relay/scenarios/proxy-relay.commscenario同じ往復を双方向シナリオ化したもの(ステップ C を録画工程なしで試す用)

これらは CommSim.Sample の実行フォルダ内 samples/proxy-relay/ に同梱されています。必要なのは CommSim 本体と CommSim.Sample の 2 本だけで、上流の実機は不要です(② 役を CommSim.Sample が演じます)。

ステップA:すぐ中継して記録を見る(まず動かす)

まずは中継を立てて、往復が記録される様子を見ます。起動の順番が大切です(②→本体→① の順)。上流の ② が先に待ち受けていないと、中継はその起動時に黙ってスタブ動作に退化してしまうためです。

  1. CommSim.Sample を起動し、上部の「動かすサンプル」で「プロキシ(中継)」を選ぶ。① ペインが 7200・② ペインが 7201 になり、② の自動応答が ON になる。
  2. 先に ② 実機役を起動する(② ペインの「起動」=7201 で待受開始。上流の実機が先に立っている状態にする)。
  3. CommSim 本体で samples/proxy-relay/proxy-relay.commsim を開く(「ファイル」→「ファイルから開く…」/Ctrl+O)。
  4. セッション「中継(プロキシ)TCP 7200 → 7201」の「起動」をクリックする。下流 7200 で待ち受け、上流 127.0.0.1:7201(=②)へ接続する。上流未接続の警告バナーが出ないことを確認する(出る場合は ② が未起動)。
  5. CommSim.Sample の ① ペインの「起動」(接続)→「デモ送信」を押す。① が Read/Status を連投し、CommSim 本体が ② へ転送 → ② が応答 → ① へ中継する。
  6. CommSim 本体の「ログ」タブで、種別フィルタの「Proxy」だけを ON にする。中継の往復が時系列に記録されているのが見える(行をクリックすると LineFrame に再デコード表示)。

観察できること

  • 下流→上流 転送:Read ch0(① → 本体 → ②)AppToDevice
  • 上流→下流 中継:値100(② → 本体 → ①)DeviceToApp
  • 下流→上流 転送:Status?(① → 本体 → ②)AppToDevice
  • 上流→下流 中継:OK(② → 本体 → ①)DeviceToApp
ログペイン:種別 Proxy の行で、A5 01(Read)や A5 02(Status)が「下流→上流 転送」、実機②の応答 A5 81 02 00 64 8C/A5 82 01 00 28 が「上流→下流 中継」と記録される
中継往復のログ(種別「Proxy」)。受信フレーム(A5 01…=Read/A5 02…=Status)が「下流→上流 転送」で②へ送られ、②の応答(A5 81 02 00 64 8C=値100/A5 82 01 00 28=OK)が「上流→下流 中継」で①へ返る。純素通しなので CommSim は中身を変えず記録だけしている(行をクリックすると LineFrame に再デコード表示)。
これがステップ A(まず動かす)の到達点です。純素通しの中継なので、CommSim は中身を変えずに記録だけしています。次のステップ B で「狙った 1 コマンドだけ」差し替えてみます。
うまく往復が出ないときは、まず起動順(②→本体→①)と、本体に上流未接続の警告バナーが出ていないかを確認してください。

ステップB:狙った 1 コマンドだけ偽装する(フック)(オプション・目安 10 分)

先に効果を言うと:このステップを終えると、① のログで Status(A5 02)だけが偽の異常応答に変わり、Read(A5 01)は実機の応答のまま素通しになります。「実機 99% + 狙った 1% だけ偽装」を、ルールを 1 つ足すだけで体感できます。

CommSim 本体のセッションで「オートメーション」タブを開き、次の内容でパケット一致オートメーションを 1 つ追加します。

項目
トリガー種別パケット一致(PacketMatch)
一致方法前方一致(先頭一致)
一致データ形式HEX
一致データA5 02(Status 要求の先頭・スペース区切りで入力)
送信ステップのアクションSend(送信) ※ Forward ではない
送信データ形式HEX
送信データA5 82 01 0E 36(異常 Status フレーム=Stx A5・Cmd 82・Len 01・Payload 0E〔エラー〕・Sum8 36)

追加して ① で再度「デモ送信」すると、① のログでは Status の応答だけが A5 82 01 0E 36(異常)に変わり、Read の応答は実機どおり A5 81 02 00 64 8C(値100)のままです。偽装が効いていることは、本体セッションのログで次のように確認できます。

  • ヘッダの状態ラベルが「中継として動作 — フック 1 件」になる。
  • Status 受信の直後に「オートメーション開始: …」→「[AUTO] 送信: A5 82 01 0E 36」→「オートメーション終了」が並ぶ(偽装応答はオートメーションが送出した [AUTO] 行として記録される)。
  • 一方 Read は Proxy「下流→上流 転送」Proxy「上流→下流 中継」のまま実機(②)へ素通しされる。②側のログには Status(A5 02)が一切届かず、Read(A5 01)だけが届く(フックが上流転送を先に抑止したため)。
ログペイン:ヘッダが「フック 1 件」。Read(A5 01)は Proxy で実機へ素通しされ A5 81 02 00 64 8C が返るが、Status(A5 02)は『オートメーション開始: Status フック』→『[AUTO] 送信: A5 82 01 0E 36』で偽装される
フックを 1 つ足した後のログ。ヘッダが「中継(プロキシ)として動作 — フック 1 件」になる。Read(A5 01)は Proxy「下流→上流 転送」→「上流→下流 中継」で実機②へ素通しされ A5 81 02 00 64 8C(値100)が返るが、Status(A5 02)は オートメーション開始: Status フック[AUTO] 送信: A5 82 01 0E 36(偽装異常)に差し替わる。「実機 99% + 狙った 1% だけ偽装」が 1 行のルールで実現できている。

※「注入」列のチェック(✓)が付くのはバイナリ構造応答(構造体ルール)でフックした場合です。本ステップのようにオートメーションの Send で差し替えた応答は [AUTO] 行として区別します。

なぜ Status だけ差し替わるのか:受信は ①パケット一致オートメーション → ②構造体ルール → ③上流へ既定転送、の順で評価され、パケット一致が成立した時点で後段(既定転送)は行われません(先勝ち)A5 02(Status)はマッチして Send が返り、上流転送が抑止されます。A5 01(Read)はどのルールにもマッチしないので、そのまま実機(②)へ転送されます。
アクションは必ず「Send」にしてください。「Forward」は受信をそのまま上流へ転送する指定なので、偽装になりません。

ステップC:記録を持ち帰る(シナリオ化)(オプション・目安 5 分)

記録した往復はシナリオ(.commscenario)として保存でき、実機なしで何度でも再生できます。実機でしか出ない通信を 1 度プロキシで録画すれば、以降は実機を借りずにデバッグを反復できます。

  1. 中継したセッションの「リプレイ/障害注入」タブを開き、「シナリオとして保存」をクリックする。記録した中継往復が .commscenario に変換される。
  2. 保存した .commscenario を、別のスタブセッション(上流なし)か、リプレイ用のプロジェクトで開いて「再生」する。実機なしで往復が再現される。
保存ボタンの場所に注意:ここで使うのはセッション内「ログ」タブの「シナリオとして保存」です(ログビュワー側にも同名の機能がありますが条件が異なります)。
なお、中継中(上流あり)のセッションそのものでは再生できません(リプレイは上流なしのセッションで行います)。同梱の scenarios/proxy-relay.commscenario を使えば、録画工程を飛ばしてすぐ再生を試せます。
壊れ方(間欠障害→異常→無応答)を仕込んだ再現や、再生に障害注入(遅延・ロス・切断)を重ねる深掘りは リプレイ/障害注入を試す が担当です。本サンプルの「記録 → シナリオ化」はその入口になります。

自分のケースへの当てはめ方

このサンプルの流れを、自分の通信に応用するときの判断の糸口です。

問いはいいいえ
上流の実機は手元にあるか?そのまま中継先(上流)に実機のホスト/ポートを指定するCommSim.Sample(または別の CommSim スタブ)を実機役にする(このサンプルと同じ)
記録するだけか、狙い撃ちで偽装もするか?パケット一致フック(アクション=Send・先勝ちで上流転送を抑止)を足す純素通し中継のまま(ルール空)で全往復を記録する
記録を再利用するか?「シナリオとして保存」→ リプレイ(→ 将来はリプロパックで共有)ログ/キャプチャの確認・エクスポートだけでよい
プロキシの一番の使いどころは「実機でしか出ない不具合」の調査です。間に CommSim を挟んで往復を記録し、シナリオ化して持ち帰れば、以降は実機なしで同じ通信を何度でも再現できます。

次に読む