Gateway

โปรโตคอลบริดจ์

เหตุผลที่เคยมีอยู่

  • ขอบเขตความปลอดภัย: เปิดให้ใช้งานเฉพาะรายการที่อนุญาตขนาดเล็ก แทนที่จะเปิดพื้นผิว API ทั้งหมดของ Gateway
  • การจับคู่และอัตลักษณ์ของ Node: Gateway เป็นผู้ควบคุมการอนุญาตให้ Node เข้าร่วม และผูกไว้กับโทเค็นเฉพาะแต่ละ Node
  • ประสบการณ์การค้นหา: Node สามารถค้นหา Gateway ผ่าน Bonjour บน LAN หรือเชื่อมต่อโดยตรงผ่าน tailnet
  • WebSocket แบบ local loopback: ระนาบควบคุม WebSocket ทั้งหมดยังคงอยู่ภายในเครื่อง เว้นแต่จะทำทันเนลผ่าน SSH

การรับส่งข้อมูล

  • TCP โดยมีออบเจ็กต์ JSON หนึ่งรายการต่อบรรทัด (JSONL)
  • รองรับ TLS เป็นตัวเลือก (bridge.tls.enabled: true)
  • พอร์ตเริ่มต้นของตัวรับฟังคือ 18790

เมื่อเปิดใช้ TLS ระเบียน TXT สำหรับการค้นหาจะมี bridgeTls=1 พร้อม bridgeTlsSha256 เป็นข้อมูลบอกใบ้ที่ไม่เป็นความลับ ระเบียน TXT ของ Bonjour/mDNS ไม่มีการตรวจสอบสิทธิ์ ไคลเอนต์จึงไม่สามารถถือว่าลายนิ้วมือที่ประกาศเป็นพินที่เชื่อถือได้โดยเด็ดขาด หากไม่มีการตรวจสอบผ่านช่องทางอื่นเพิ่มเติม

การจับมือและการจับคู่

  1. ไคลเอนต์ส่ง hello พร้อมข้อมูลเมตาของ Node และโทเค็น (หากจับคู่แล้ว)
  2. หากยังไม่จับคู่ Gateway จะตอบกลับด้วย error (NOT_PAIRED / UNAUTHORIZED)
  3. ไคลเอนต์ส่ง pair-request
  4. Gateway รอการอนุมัติ จากนั้นส่ง pair-ok และ hello-ok

เดิม hello-ok จะส่งคืน serverName ปัจจุบันพื้นผิว Plugin ที่โฮสต์ไว้จะประกาศผ่าน pluginSurfaceUrls บนโปรโตคอล Gateway ปัจจุบัน (Canvas/A2UI ใช้ pluginSurfaceUrls.canvas)

เฟรม

จากไคลเอนต์ไปยัง Gateway:

  • req / res: RPC ของ Gateway ที่จำกัดขอบเขต (แชต เซสชัน การกำหนดค่า สุขภาพ การปลุกด้วยเสียง และ skills.bins)
  • event: สัญญาณจาก Node (บทถอดเสียงพูด คำขอของเอเจนต์ การสมัครรับข้อมูลแชต และวงจรชีวิตการดำเนินการ)

จาก Gateway ไปยังไคลเอนต์:

  • invoke / invoke-res: คำสั่งของ Node (canvas.*, camera.*, screen.record, location.get, sms.send)
  • event: การอัปเดตแชตสำหรับเซสชันที่สมัครรับข้อมูล
  • ping / pong: การรักษาการเชื่อมต่อ

การบังคับใช้รายการที่อนุญาตเคยอยู่ใน src/gateway/server-bridge.ts (นำออกแล้ว)

เหตุการณ์วงจรชีวิตการดำเนินการ

Node ส่ง exec.finished เพื่อแสดงกิจกรรม system.run ที่เสร็จสมบูรณ์ โดย Gateway จะแมปเป็นเหตุการณ์ของระบบ (Node รุ่นเก่ายังสามารถส่ง exec.started ได้ด้วย) exec.denied ระบุว่าความพยายามเรียกใช้ system.run ถูกปฏิเสธขั้นสุดท้าย โดยไม่เพิ่มเหตุการณ์ของระบบลงในคิวหรือปลุกการทำงานของเอเจนต์

ฟิลด์เพย์โหลด (ทั้งหมดเป็นตัวเลือก เว้นแต่จะระบุไว้):

ฟิลด์ หมายเหตุ
sessionKey จำเป็น เซสชันของเอเจนต์สำหรับเชื่อมโยงเหตุการณ์ และสำหรับ exec.finished ใช้ส่งเหตุการณ์ของระบบ
runId รหัสการดำเนินการที่ไม่ซ้ำกันสำหรับการจัดกลุ่ม
command สตริงคำสั่งแบบดิบหรือที่จัดรูปแบบแล้ว
exitCode, timedOut, output รายละเอียดการเสร็จสิ้น (เฉพาะเมื่อเสร็จสิ้น)
reason เหตุผลที่ปฏิเสธ (เฉพาะเมื่อถูกปฏิเสธ)

การใช้งาน tailnet ในอดีต

  • ผูกบริดจ์กับ IP ของ tailnet: bridge.bind: "tailnet" ใน ~/.openclaw/openclaw.json (สำหรับการอ้างอิงทางประวัติศาสตร์เท่านั้น ปัจจุบัน bridge.* ไม่ใช่การกำหนดค่าที่ถูกต้องอีกต่อไป)
  • ไคลเอนต์เชื่อมต่อผ่านชื่อ MagicDNS หรือ IP ของ tailnet
  • Bonjour ไม่สามารถข้ามเครือข่ายได้ มิฉะนั้นจึงต้องใช้ DNS-SD แบบบริเวณกว้าง หรือระบุโฮสต์/พอร์ตด้วยตนเอง

การกำหนดเวอร์ชัน

บริดจ์ใช้ v1 โดยปริยาย และไม่มีการเจรจาค่าต่ำสุด/สูงสุด ปัจจุบันไคลเอนต์ Node/ผู้ดำเนินการใช้โปรโตคอล Gateway ผ่าน WebSocket ซึ่งมีการเจรจาช่วงเวอร์ชันของโปรโตคอล

ที่เกี่ยวข้อง

Was this useful?
On this page

On this page