From 559890c482f5973f06aafdfec9550fee5ba3c7f2 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 09 十一月 2026 17:02:15 +0800
Subject: [PATCH] feat: CAN 模拟器 TCP 化 + 多设备并发调试 + 后台生命周期管理

---
 docs/仪器调用架构与数据流转_V3.1.html |  282 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 282 insertions(+), 0 deletions(-)

diff --git "a/docs/\344\273\252\345\231\250\350\260\203\347\224\250\346\236\266\346\236\204\344\270\216\346\225\260\346\215\256\346\265\201\350\275\254_V3.1.html" "b/docs/\344\273\252\345\231\250\350\260\203\347\224\250\346\236\266\346\236\204\344\270\216\346\225\260\346\215\256\346\265\201\350\275\254_V3.1.html"
new file mode 100644
index 0000000..630c398
--- /dev/null
+++ "b/docs/\344\273\252\345\231\250\350\260\203\347\224\250\346\236\266\346\236\204\344\270\216\346\225\260\346\215\256\346\265\201\350\275\254_V3.1.html"
@@ -0,0 +1,282 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+<meta charset="utf-8"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>浠櫒璋冪敤鏋舵瀯涓庢暟鎹祦杞鏄庯紙V3.1锛�</title>
+<style>
+:root{--bg:#f7f8fa;--card:#fff;--ink:#1f2430;--muted:#5b6472;--line:#e4e8ef;--accent:#2f6fed;--ok:#2e8b57;--warn:#b7791f;--bad:#c0392b;--code:#0d1117;}
+*{box-sizing:border-box}
+body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.7 "Segoe UI","Microsoft YaHei",Arial,sans-serif}
+.wrap{max-width:1120px;margin:0 auto;padding:32px 20px 90px}
+h1{font-size:25px;margin:0 0 6px}
+h2{font-size:20px;margin:34px 0 12px;padding-bottom:6px;border-bottom:2px solid var(--line)}
+h3{font-size:16px;margin:20px 0 8px;color:var(--accent)}
+.sub{color:var(--muted);margin:0 0 18px}
+.card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:16px 18px;margin:14px 0;box-shadow:0 1px 2px rgba(0,0,0,.03)}
+pre{background:var(--code);color:#e6edf3;border-radius:10px;padding:14px 16px;overflow:auto;font:12.5px/1.55 "Cascadia Code",Consolas,monospace;margin:10px 0}
+code{font-family:"Cascadia Code",Consolas,monospace;background:#eef1f6;padding:1px 5px;border-radius:4px;font-size:13px}
+pre code{background:none;padding:0;color:inherit}
+table{border-collapse:collapse;width:100%;margin:10px 0;font-size:14px}
+th,td{border:1px solid var(--line);padding:7px 10px;text-align:left;vertical-align:top}
+th{background:#eef2f8}
+.tag{display:inline-block;padding:1px 8px;border-radius:999px;font-size:12px;font-weight:600;margin-right:4px}
+.t-auto{background:#e6f0ff;color:#1b4fa0}
+.t-dbg{background:#f3e8ff;color:#6b21a8}
+.t-svc{background:#e7f6ec;color:#1f7a3d}
+.t-dev{background:#fdeee0;color:#a35a12}
+.ok{color:var(--ok);font-weight:600}.bad{color:var(--bad);font-weight:600}.warn{color:var(--warn);font-weight:600}
+.small{font-size:13px;color:var(--muted)}
+.toc{columns:2;font-size:14px}.toc a{color:var(--accent);text-decoration:none}
+.note{background:#fff6d6;border-left:4px solid var(--warn);padding:10px 12px;border-radius:6px;margin:10px 0}
+.fx{background:#e8f5e9;border-left:4px solid var(--ok);padding:10px 12px;border-radius:6px;margin:10px 0}
+.layer{border-left:4px solid var(--accent);padding-left:12px;margin:8px 0}
+</style>
+</head>
+<body>
+<div class="wrap">
+
+<h1>浠櫒璋冪敤鏋舵瀯涓庢暟鎹祦杞鏄�</h1>
+<p class="sub">鑱氱劍"涓�娆′华鍣ㄨ皟鐢ㄤ粠鍏ュ彛鍒扮‖浠躲�佸啀鍥炲埌璋冪敤鏂�"鐨勫畬鏁磋矾寰勪笌绫诲紩鐢ㄧ粨鏋勩�俈3.1锛圱CP 妯℃嫙鍣� + 缁熶竴 <code>CanDeviceDriver</code> + 澶氳澶囧苟鍙戯級銆備笌浠g爜鍚屾 2026-11-09銆�</p>
+
+<div class="card">
+<b>鐩綍</b>
+<div class="toc">
+<div><a href="#s1">1. 璋冪敤鍏ュ彛鍏ㄦ櫙</a></div>
+<div><a href="#s2">2. 鍒嗗眰绫诲紩鐢ㄧ粨鏋�</a></div>
+<div><a href="#s3">3. 鑷姩鍖栬皟鐢ㄦ暟鎹祦杞�</a></div>
+<div><a href="#s4">4. 璋冭瘯璋冪敤鏁版嵁娴佽浆</a></div>
+<div><a href="#s5">5. 椹卞姩鈫掍紶杈撯啋鏈嶅姟绔� 閫愯烦</a></div>
+<div><a href="#s6">6. 涓�娆� CAN 鍙戦�佸畬鏁存椂搴�</a></div>
+<div><a href="#s7">7. 鏉冮檺/绉熺害鍦ㄩ摼璺腑鐨勪綅缃�</a></div>
+<div><a href="#s8">8. 鍏抽敭鏁版嵁缁撴瀯涓�瑙�</a></div>
+<div><a href="#s9">9. 绫诲紩鐢ㄥ叧绯绘�诲浘</a></div>
+</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s1">1銆�璋冪敤鍏ュ彛鍏ㄦ櫙</h2>
+<div class="card">
+<p>浠櫒璋冪敤鍙湁<b>涓ょ被鍏ュ彛</b>锛屼絾閮芥眹鑱氬埌鍚屼竴濂�"鏈嶅姟灞� 鈫� 椹卞姩灞� 鈫� 浼犺緭灞�"锛屾渶缁堣惤鍒版ā鎷熷櫒鏈嶅姟閲岀殑鎬荤嚎锛�</p>
+<table>
+<tr><th>鍏ュ彛</th><th>瑙﹀彂鑰�</th><th>棣栬烦 API</th><th>浠ょ墝绫诲瀷</th></tr>
+<tr><td><span class="tag t-auto">鑷姩鍖�</span>娴嬭瘯绋嬪簭</td><td>TestPlan / 姝ラ鑴氭湰</td><td><code>ICanBusService</code> / <code>IAutoDeviceFacade</code></td><td>OwnerType.<b>Production</b></td></tr>
+<tr><td><span class="tag t-dbg">璋冭瘯</span>纭欢璋冭瘯椤�</td><td>浜哄伐锛圖eviceDebugTab锛�</td><td>闈㈡澘鐩磋皟椹卞姩 鎴� <code>IDeviceService</code></td><td>OwnerType.<b>Maintenance</b></td></tr>
+</table>
+<p class="small">涓ゆ潯鍏ュ彛浜掓枼浜庡悓涓� arb.db 绉熺害锛氭煇璁惧琚敓浜ч绾︽椂缁存姢杩涗笉鍘伙紝鍙嶄箣浜︾劧锛圛NV 鐢辫祫婧愬眰鏍呮爮淇濊瘉锛夈��</p>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s2">2銆�鍒嗗眰绫诲紩鐢ㄧ粨鏋�</h2>
+<div class="card">
+<pre>
+銆愬叆鍙e眰銆�
+  CanBusService 鈹�鈹�                         DeviceDebugTab 鈹�鈹�
+  (绫诲瀷鍖栧皝瑁�)    鈹�  IAutoDeviceFacade                       鈹� (姣忚澶囦竴 Tab)
+                 鈻�                                           鈻�
+銆愰棬闈�/缂栨帓灞傘��  AutoDeviceFacade 鈹�鈹�鈻� IDeviceService 鈼勨攢鈹� ExecuteViaDeviceService / 闈㈡澘鐩磋皟
+                 (棰勭害+閲婃斁缂栨帓)        (DeviceService锛氭牎楠�+绉熺害+鍒嗘淳)
+                                           鈹�
+銆愯祫婧愬眰銆�        IResourceManager 鈼勨攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�  (ValidateOwner / AcquireOperationAsync)
+                 LayeredResourceManager 鈹�鈹�鈹�鈹尖攢鈻� ILeaseCoordinator 鈹�鈻� DbLeaseStore(arb.db)
+                                           鈹�
+銆愯澶�/椹卞姩灞傘��   IDeviceManager.GetDriver(deviceId) 鈹�鈻� IDeviceDriver
+                                           鈹�
+                       CanDeviceDriver锛堝敮涓� CAN 椹卞姩锛屽疄鐜� IDeviceDriver锛�
+                         鈹溾攢 ICanTransport
+                         鈹�    鈹溾攢 NodeChannelTransport 鈹�鈻� TCP 鈹�鈻� CanSimulatorServer
+                         鈹�    鈹斺攢 BrokerRpcTransport   鈹�鈻� 鍛藉悕绠¢亾 鈹�鈻� DeviceBroker
+                         鈹�                                   鈹斺柡(瀹夸富鍐�) CanDeviceDriver(NodeChannel) 鈹�鈻� TCP 鈹�鈻� 妯℃嫙鍣�
+                         鈹斺攢 鍏跺畠椹卞姩锛歍cpRaw/Scpi/ModBus/S7锛堥潪 CAN 浠櫒锛�
+
+銆愭湇鍔�/鎬荤嚎灞傘��   TcpSimulatorHost 鈹�鈻� ServerSession 鈹�鈻� CanCommandExecutor 鈹�鈻� CanBusSimulator/CanNode
+</pre>
+<p class="small">渚濊禆鏂瑰悜鑷笂鑰屼笅锛涗笂灞傚彧渚濊禆鎺ュ彛锛圛AutoDeviceFacade/IDeviceService/IResourceManager/IDeviceManager/IDeviceDriver锛夛紝瀹炵幇鐢� <code>InfrastructureBootstrapper</code> 瑁呴厤杩� <code>UtilContainer</code>銆�</p>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s3">3銆�鑷姩鍖栬皟鐢ㄦ暟鎹祦杞�</h2>
+<div class="card">
+<h3>3.1 涓�娆℃�ц皟鐢紙OneShot锛�</h3>
+<pre class="seq">
+TestPlan 姝ラ
+  鈫� CanBusService.SendFrameAsync(deviceId, 0x300, data)
+      路 鏍¢獙甯�(鈮�0x1FFFFFFF, 鈮�8瀛楄妭) 鈫� 鎷煎懡浠や覆 "SEND:0x300:AA BB"
+  鈫� AutoDeviceFacade.ExecuteAsync(deviceId, "SEND:鈥�")
+      鈶� ReserveCoreAsync: new ResourceOwnerToken(Production, auto_guid)
+         ResourceManager.ReserveAsync(token, ResourceKey(deviceId,"Generic"))  鈫� 鐢宠棰勭害(鍐� arb.db, TTL)
+      鈶� DeviceService.ExecuteCommandAsync(deviceId, cmd, token)
+      鈶� finally ReleaseCoreAsync 鈫� ReleaseReservationAsync  鈫� 閲婃斁棰勭害
+  鈫� 杩斿洖 DeviceCommandResult{Success, Readback, LatencyMs}
+</pre>
+<h3>3.2 浣滅敤鍩熺绾︼紙涓�姝ュ唴澶氭璋冪敤锛�</h3>
+<pre class="seq">
+using (var lease = await AutoDeviceFacade.AcquireAsync(deviceId, "Step1"))
+{
+   // 鍐呴儴 ReserveAsync + 鑻� LayeredResourceManager 鍒� lease.StartHeartbeat(Coordinator, grants)
+   //   蹇冭烦锛氭瘡 8s Coordinator.Renew(grant,30)锛岃繛缁け璐モ墺2 鈫� LeaseLost 浜嬩欢
+   await CanBusService.SendFrameAsync(lease, 0x100, d);   // lease.ExecuteAsync 鈫� DeviceService鈥�
+   var f   = await CanBusService.ReceiveFrameAsync(lease); // lease.QueryAsync("RECV")
+}   // Dispose: 鍋滃績璺� + ReleaseReservationAsync
+</pre>
+<div class="note"><b>蹇冭烦宸紓</b>锛氳嚜鍔ㄥ寲浣滅敤鍩熺绾﹁嚜甯� 8s 蹇冭烦缁湡锛�<code>AutoDeviceLease.StartHeartbeat</code>锛夛紱浜哄伐缁存姢浼氳瘽鐨勫績璺冲湪 <code>DebugSessionManager</code>锛�120s锛夛紝涓ゆ潯璺緞閮借缁湡锛屽惁鍒欏埌 TTL 杩囨湡瑙﹀彂 RECOVERY_REQUIRED銆�</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s4">4銆�璋冭瘯璋冪敤鏁版嵁娴佽浆</h2>
+<div class="card">
+<p>纭欢璋冭瘯椤垫瘡涓澶囦竴涓� <code>DeviceDebugTab</code>锛堢嫭绔嬩細璇濓級銆侰AN 涓� 闈濩AN 鐨勮皟鐢ㄨ矾寰勪笉鍚岋細</p>
+<h3>4.1 CAN 闈㈡澘锛堢洿璋冮┍鍔紝涓嶇粡 DeviceService锛�</h3>
+<pre class="seq">
+DeviceDebugTab.LoadPanel("CanDevice")
+  鈫� CanDebugPanel(澶氶�氶亾澹�) 鈫� CanChannelView(鍗曢�氶亾, ExistingDriver=DeviceManager.GetDriver(deviceId))
+  杩炴帴锛欴oConnect 鈫� 澶嶇敤宸叉敞鍐� CanDeviceDriver锛圔roker 浠g悊 鎴� Local NodeChannel锛夆啋 ConnectAsync
+  鍙戦�侊細SendBtn_Click 鈫� _driver.SendCommandAsync("SEND:0x300:鈥�")   鈫� 鐩存帴璋冮┍鍔�
+  鎺ユ敹锛氶┍鍔� DriverFrameReceived 浜嬩欢 鈫� AddReceivedFrame 鈫� Dispatcher.BeginInvoke 涓婂睆
+  缁存姢闂ㄦ帶锛氶潰鏉� IsMaintenanceMode锛堢敱浼氳瘽鐘舵�侀┍鍔級锛岃繘鍏ョ淮鎶ょ粡 DebugSessionManager
+</pre>
+<h3>4.2 鐢垫簮/PLC 闈㈡澘锛堢粡 DeviceService锛�</h3>
+<pre class="seq">
+PowerSupplyDebugPanel/PlcDebugPanel 鈫� OnCommandExecute(DebugCommand)
+  鈫� DeviceDebugTab.ExecuteViaDeviceService
+     路 new ResourceOwnerToken(Maintenance, sessionId)
+     路 BuildDeviceCommand(cmd) 鈫� 濡� "VOLT 鈥�;CURR 鈥�;OUTP ON" / "WRITE:addr:TRUE"
+     路 DeviceService.ExecuteCommandAsync(deviceId, cmd, token)   鈫� 璧版湇鍔″眰鏍¢獙+绉熺害+椹卞姩
+  鈫� DebugOperation 钀� debug.db + 鎿嶄綔鏃ュ織
+</pre>
+<div class="note">CAN 璧�"闈㈡澘鐩磋皟椹卞姩 + 浼氳瘽绾х淮鎶ら棬"鏄负浜嗕綆寤惰繜瀹炴椂鏀跺彂锛涚數婧�/PLC 璧�"鏈嶅姟灞�"浠ヨ幏寰楃粺涓�鏉冮檺鏍¢獙涓庢搷浣滃璁°�備簩鑰呮渶缁堥兘缁� <code>IDeviceDriver</code> 钀藉埌璁惧銆�</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s5">5銆�椹卞姩 鈫� 浼犺緭 鈫� 鏈嶅姟绔� 閫愯烦</h2>
+<div class="card">
+<p><code>CanDeviceDriver</code> 鎶婂懡浠や氦缁欓�夊畾鐨� <code>ICanTransport</code>锛屼袱鏉″悗绔悇鑷埌鎬荤嚎鐨勭墿鐞嗚矾寰勪笉鍚岋細</p>
+<h3>5.1 Local锛圢odeChannelTransport锛�</h3>
+<pre class="seq">
+CanDeviceDriver.QueryAsync/SendCommandAsync
+  鈫� NodeChannelTransport.TransceiveAsync(line)
+     路 棣栬繛 HandshakeAsync: 鍐� "HELLO:bus:node:tag" 鐩磋 "OK:HELLO鈥�"锛堣寰幆鏈捣锛�
+     路 涔嬪悗 RequestLineAsync: _requestLock 涓茶 鈫� 鍐欏懡浠ゅ抚 鈫� 绛� TCS锛坉eadline 5s锛�
+     路 鍚庡彴 ReadLoopAsync: 鍒嗘祦 OK/ERR鈫掑畬鎴� TCS锛汦V:RECV鈫扚ramePushed 浜嬩欢
+  鈫� TCP 9000 鈫� ServerSession 鈫� CanCommandExecutor 鈫� CanBusSimulator/CanNode
+</pre>
+<h3>5.2 Broker锛圔rokerRpcTransport锛�</h3>
+<pre class="seq">
+CanDeviceDriver(Broker).SendCommandAsync("SEND:鈥�")
+  鈫� BrokerRpcTransport.TransceiveAsync
+     路 鏄犲皠 opCode(SEND/QUERY)+payload 鈫� SubmitBody 鈫� BrokerClientChannel(鍛藉悕绠¢亾 RPC)
+     路 EnsureConnectedAsync(Hello 鎻℃墜) 鈫� SubmitAsync(configHash 闅忎俊灏�)
+  鈫� DeviceBroker.BrokerServer.ExecuteOneShotAsync
+     鈶� 鐧藉悕鍗�/鍩熷唴  鈶� configHash 瀵硅处  鈶� 绉熺害鏍呮爮  鈶� SessionGate 涓茶
+     鈶� 瀹夸富鍐� CanDeviceDriver(NodeChannel) 鈫� TCP 鈫� 妯℃嫙鍣ㄨ矾鐢�
+     鈶� ResultBody.Readback 鏈熬 AppendPushes("|PUSHED:n|EV:RECV鈥�")
+  鈫� 瀹㈡埛绔� DrainPiggyback 鍓ョ PUSHED 鈫� FramePushed 鈫� 椹卞姩缂撳啿+浜嬩欢
+</pre>
+<p class="small">Broker 鐨勬帴鏀堕潬"璇锋眰椹卞姩鎹庡甫"锛氬鎴风姣忔 STATUS/SEND 閮戒細璁╁涓绘妸鑷笂娆′互鏉ユ敹鍒扮殑鎺ㄩ�佸甫鍥烇紱闈㈡澘姣� 100ms 鐨� STATUS 杞淇濊瘉鏈�缁堟樉绀恒��</p>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s6">6銆�涓�娆� CAN 鍙戦�佸畬鏁存椂搴�</h2>
+<div class="card">
+<h3>6.1 鑷姩鍖� 路 Local 璁惧 CAN-001</h3>
+<pre class="seq">
+CanBusService.SendFrameAsync("CAN-001",0x300,[AA BB])
+ 鈫� AutoDeviceFacade.ExecuteAsync 鈫� ReserveAsync(Production) 鈫� arb.db 鍐欑绾�
+ 鈫� DeviceService.ExecuteCommandAsync
+     GetDriver("CAN-001")鈫扖anDeviceDriver(NodeChannel)
+     ValidateOwner鈫扲enew(grant,1) 鏍呮爮鏍¢獙
+     AcquireOperationAsync鈫扥perationLease
+     driver.SendCommandAsync("SEND:0x300:AA BB")
+       鈫� TCP HELLO/SEND 鈫� ServerSession 鈫� CanCommandExecutor.HandleSend
+       鈫� CanNode.SendFrame 鈫� CanBusSimulator 璺敱鍒板叾瀹冭妭鐐�(+搴旂瓟鍣ㄥ洖鏄�)
+       鈫� "OK:TX:0x300:2"
+ 鈫� DeviceCommandResult{Success=true,Readback="OK:TX鈥�"}
+ 鈫� ReleaseReservationAsync 鈫� arb.db 閲婃斁
+</pre>
+<h3>6.2 璋冭瘯 路 Broker 璁惧 CAN-003</h3>
+<pre class="seq">
+CanChannelView.SendBtn 鈫� _driver(CanDeviceDriver/BrokerRpc).SendCommandAsync("SEND:0x300:AA BB")
+ 鈫� BrokerRpcTransport 鈫� 鍛藉悕绠¢亾 SubmitBody{SEND,"SEND:0x300:AA BB"}
+ 鈫� BrokerServer 涓夐噸鍏冲崱+SessionGate 鈫� 瀹夸富 CanDeviceDriver(NodeChannel) 鈫� TCP 鈫� 妯℃嫙鍣ㄨ矾鐢�
+ 鈫� ResultBody{Readback="OK:TX鈥�" (|PUSHED 鑻ユ湁鍥炴樉)} 鍥炵閬�
+ 鈫� 瀹㈡埛绔� DrainPiggyback 鈫� 鑻ュ惈 PUSHED 鍒� FramePushed鈫扗riverFrameReceived鈫掗潰鏉� RX 琛�
+锛堝簲绛斿櫒寮�鍚椂锛屾ā鎷熷櫒鎶� 0x300 鍥炴樉缁欏涓昏妭鐐光啋瀹夸富鏆傚瓨鈫掓湰娆�/涓嬫鍝嶅簲鎹庡甫鍥炲鎴风锛�
+</pre>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s7">7銆�鏉冮檺 / 绉熺害鍦ㄩ摼璺腑鐨勪綅缃�</h2>
+<div class="card">
+<pre>
+鍏ュ彛            闂ㄩ潰/缂栨帓           鏈嶅姟灞�(DeviceService)          璧勬簮灞�                椹卞姩/浼犺緭/鏈嶅姟绔�
+鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鑷姩鍖�  鈹�鈻� AutoDeviceFacade 鈹�鈻� ExecuteCommandAsync 鈹�鈻� ReserveAsync(棰勭害,鍐欑绾�)
+              (Reserve/Release)   ValidateOwner(鏍呮爮) 鈹�鈻� Renew(grant,1)
+                                  AcquireOperationAsync 鈹�鈻� OperationLease
+                                  driver.SendCommandAsync 鈹�鈻� (Local TCP / Broker RPC)
+璋冭瘯    鈹�鈻� DebugSessionManager.RequestMaintenance 鈹�鈻� ReserveAsync(Maintenance) + 120s 蹇冭烦
+              CAN: 闈㈡澘鐩磋皟 driver锛涚數婧�/PLC: 缁� DeviceService
+Broker 瀹夸富渚� 鈹�鈻� BrokerServer.ExecuteOneShotAsync 鍑洪槦鍐嶆牎楠岋細
+              鈶� 鐧藉悕鍗� 鈶� configHash(INV-04) 鈶� PhaseOf/ProbeConflict(INV-01/03) 鈶� SessionGate
+</pre>
+<table>
+<tr><th>鏍¢獙鐐�</th><th>鏂规硶</th><th>澶辫触缁撴灉</th></tr>
+<tr><td>棰勭害褰掑睘</td><td>ResourceManager.ValidateOwner 鈫� Renew(grant,1)</td><td>PERMISSION_DENIED</td></tr>
+<tr><td>鎿嶄綔浜掓枼</td><td>AcquireOperationAsync 鈫� OperationLease</td><td>ResourceConflictException</td></tr>
+<tr><td>Broker 鍑洪槦鏍呮爮</td><td>PhaseOf==Active 涓旀湁 holder</td><td>RejectedStaleLease / RECOVERY_REQUIRED</td></tr>
+<tr><td>閰嶇疆涓�鑷�</td><td>configHash 瀵硅处</td><td>RejectedConfigMismatch(INV-04)</td></tr>
+<tr><td>绉熺害缁湡</td><td>Coordinator.Renew(grant,ttl)</td><td>澶辫触鈮�2 鈫� LeaseLost / 杩囨湡 RECOVERY_REQUIRED</td></tr>
+</table>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s8">8銆�鍏抽敭鏁版嵁缁撴瀯涓�瑙�</h2>
+<div class="card">
+<table>
+<tr><th>绫诲瀷</th><th>鎵�鍦�</th><th>浣滅敤</th></tr>
+<tr><td><code>ResourceOwnerToken</code></td><td>Contracts</td><td>璋冪敤鑰呰韩浠�(OwnerType+OwnerId+TokenId GUID)锛涚绾︽寜 TokenId 绱㈠紩锛岄』澶嶇敤鍚屼竴瀹炰緥</td></tr>
+<tr><td><code>ResourceKey</code></td><td>Contracts</td><td>(deviceId,"Generic") 璧勬簮閿紝浠茶涓庨绾︾殑绮掑害</td></tr>
+<tr><td><code>IOperationLease</code>/OperationLease</td><td>璧勬簮灞�</td><td>鍗曟鎿嶄綔浜掓枼绉熺害锛圖eviceService 鍐� using锛�</td></tr>
+<tr><td><code>IAutoDeviceLease</code>/AutoDeviceLease</td><td>AutoDeviceFacade</td><td>浣滅敤鍩熺绾� + 8s 蹇冭烦 + LeaseLost</td></tr>
+<tr><td><code>DeviceCommandResult</code></td><td>Contracts</td><td>{Success,Readback,RawResponse,ErrorCode,LatencyMs}</td></tr>
+<tr><td><code>DebugCommand</code>(+瀛愮被)</td><td>DeviceDebug.Entity</td><td>闈㈡澘鈫掓湇鍔$殑鍛戒护瀵硅薄(PowerSet/CanSend/PlcWrite鈥�)</td></tr>
+<tr><td><code>DebugSession</code></td><td>DeviceDebug.Entity</td><td>浼氳瘽鐘舵�佹満鎸佷箙鍖�(debug.db)</td></tr>
+<tr><td><code>SubmitBody</code>/<code>ResultBody</code>/<code>IpcEnvelope</code></td><td>ResourceContracts.BrokerIpc</td><td>Broker RPC 绾挎牸寮�(璁惧/鎿嶄綔鐮�/杞借嵎/璧勬簮閿�/瀹㈡埛绔疄渚嬶紱鐘舵��+璇诲洖+epoch)</td></tr>
+<tr><td><code>LeaseGrant</code></td><td>ResourceContracts</td><td>arb.db 绉熺害鍑嵁(LeaseId/Generation/Epoch/Expires)</td></tr>
+<tr><td>鍛戒护涓� / <code>EV:RECV</code></td><td>SimulatorFraming 鍗忚</td><td>SEND:/QUERY:/HELLO: 涓庢帹閫佽锛�4B 澶х闀垮害+UTF8 鍒嗗抚</td></tr>
+<tr><td><code>CanFrame</code>/<code>CanFrameDisplay</code></td><td>CanSimulator / DeviceDebug</td><td>鎬荤嚎甯фā鍨� / 闈㈡澘鏄剧ず琛�</td></tr>
+</table>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s9">9銆�绫诲紩鐢ㄥ叧绯绘�诲浘</h2>
+<div class="card">
+<pre>
+        [鑷姩鍖朷  CanBusService 鈹�鈹�uses鈹�鈹�鈻� IAutoDeviceFacade(AutoDeviceFacade)
+                                                   鈹� uses
+        [璋冭瘯] DeviceDebugTab 鈹�鈹�鈹�                  鈻�
+                   鈹�            鈹�        IDeviceService(DeviceService)
+                   鈹傜洿璋�         鈹�                  鈹� uses
+                   鈻�            鈻�        鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+        IDeviceDriver(CanDeviceDriver)   IResourceManager        IDeviceManager
+                   鈹� holds               (LayeredResourceManager)鈹� GetDriver
+                   鈻�                          鈹� uses              鈻�
+             ICanTransport 鈹�鈹�鈹�          ILeaseCoordinator   娉ㄥ唽琛�: deviceId鈫扖anDeviceDriver
+              鈹�              鈹�              鈹�                      鈹�
+   NodeChannelTransport  BrokerRpcTransport 鈹�              (Broker 璁惧=CreateBrokerProxy)
+              鈹�              鈹�              鈻�
+          TCP 9000       鍛藉悕绠¢亾      DbLeaseStore(arb.db)
+              鈹�              鈹�
+              鈻�              鈻�
+   TcpSimulatorHost   BrokerServer 鈹�鈹�(瀹夸富鍐呭啀寤�)鈹�鈹�鈻� CanDeviceDriver(NodeChannel) 鈹�鈹�鈻� TCP 9000
+              鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�
+                     鈻�
+        ServerSession 鈫� CanCommandExecutor 鈫� CanBusSimulator/CanNode
+</pre>
+<div class="fx"><b>涓�鍙ヨ瘽鐞嗚В</b>锛氭墍鏈変华鍣ㄨ皟鐢ㄩ兘褰掍竴鍒� <code>IDeviceDriver</code>锛汣AN 鐨勫敮涓�瀹炵幇 <code>CanDeviceDriver</code> 鐢� <code>ICanTransport</code> 灞忚斀"鏈湴 TCP 鐩磋繛"涓�"Broker 绠¢亾濮旀墭"鐨勫樊寮傦紱鏉冮檺/绉熺害鍦ㄩ棬闈㈠眰(棰勭害)涓庢湇鍔″眰(鏍¢獙/鎿嶄綔绉熺害)涓� Broker 鍑洪槦鏍呮爮涓夊鎶婂叧锛涙暟鎹渶缁堜互鍛戒护涓�/鎺ㄩ�佽缁� TCP 钀藉埌妯℃嫙鍣ㄦ湇鍔$殑鍚屼竴鎬荤嚎涓娿��</div>
+<p class="small">閰嶅闃呰锛�<a href="绋嬪簭鏋舵瀯瑙f瀽鎶ュ憡_V3.1_TCP妯℃嫙鍣ㄤ笌缁熶竴椹卞姩.html">绋嬪簭鏋舵瀯瑙f瀽鎶ュ憡 V3.1</a>锛堣繘绋嬫嫇鎵�/鍗忚/搴旂瓟鍣�/澶氳澶�/蹇冭烦鍏ㄦ櫙锛夈��</p>
+</div>
+
+</div>
+</body>
+</html>

--
Gitblit v1.9.1