Skip to main content

纯接口 · 远程命令

把所有控制指令集中到一个 openSocketID,靠 cmd optional 参数分发。适合遥控类节点——系统操作、智能家居、设备控制都适用这个模式。

真实节点sysOpTool


模式

调用方 ──▶ [cmd=shutdown] ──────▶ sysOpTool ──▶ 关机
调用方 ──▶ [cmd=sleep] ─────────▶ sysOpTool ──▶ 睡眠
调用方 ──▶ [cmd=lockScreen] ─────▶ sysOpTool ──▶ 锁屏
调用方 ──▶ [cmd=setWindowState&hwnd=123&state=SW_MINIMIZE] ──▶ 窗口最小化

四类操作共用 openSocketID: "0x00000011"cmd 参数统一分发。


清单

plugin_manifest.json

{
"app_id": "0x00000015",
"plugin_name": "系统操作工具",
"author": "HXH",
"version": "v1.0.0",
"description": "操作系统功能",
"download_url": "https://github.com/hxh230802/sysOpTool/releases/latest",
"auto_start": "false",
"exe_path": "sysOpTool.exe"
}

FuncList.json — 四个功能条目,cmd 参数分类:

"openSocket": {
"SSS": {
"appID": "0x00000015",
"openSocketID": "0x00000011",
"description": "系统电源操作",
"args": {
"cmd": {
"type": "optional",
"options": [
["关机", "shutdown"],
["睡眠", "sleep"],
["锁屏", "lockScreen"]
]
}
}
},
"setWindowState": {
"appID": "0x00000015",
"openSocketID": "0x00000011",
"description": "设置窗口状态",
"args": {
"cmd": { "type": "static", "value": "setWindowState" },
"hwnd": { "type": "input", "description": "窗口句柄", "defaultVal": "0" },
"state": {
"type": "optional",
"options": [
["隐藏", "SW_HIDE"],
["显示", "SW_SHOW"],
["最小化", "SW_MINIMIZE"],
["最大化", "SW_MAXIMIZE"],
["恢复", "SW_RESTORE"]
]
}
}
}
}

通信代码

import ctypes, os, subprocess
from knotlink import OpenSocketResponser, KLKVMap

APPID = "0x00000015"
SOCKET_ID = "0x00000011"

responser = OpenSocketResponser(APPID, SOCKET_ID)


def handle_request(data: str) -> str:
req = KLKVMap()
req.deserialize(data)
cmd = req.get("cmd", "")

if cmd == "shutdown":
os.system("shutdown /s /t 0")
return "status=ok"

if cmd == "sleep":
os.system("rundll32.exe powrprof.dll,SetSuspendState Sleep")
return "status=ok"

if cmd == "lockScreen":
ctypes.windll.user32.LockWorkStation()
return "status=ok"

if cmd == "setWindowState":
hwnd = int(req.get("hwnd", "0"))
state = req.get("state", "SW_SHOW")
states = {
"SW_HIDE": 0, "SW_SHOW": 5,
"SW_MINIMIZE": 6, "SW_MAXIMIZE": 3, "SW_RESTORE": 9
}
ctypes.windll.user32.ShowWindow(hwnd, states.get(state, 5))
return "status=ok"

return "status=error;message=未知命令"


responser.set_RecvFunc(handle_request)
input("按回车退出。\n")

关键点

  • cmd 分发是遥控模式的标准做法 — 新增操作只需加一个 cmd 值和对应分支,不增加 socketID
  • 不同参数量的操作可以混合 — 简单操作(关机)只有 cmd,复杂操作(窗口控制)额外带 hwnd 和 state
  • 当操作参数差异大时用 static 拆分 — 窗口控制用了 cmd: static("setWindowState") 独立成条目,避免和电源操作的 optional cmd 混在一起