KnotLink 开发想法
一个本地应用互联协议。八种语言 SDK,统一的消息格式,守护进程中心路由。你的程序声明一份能力清单,其他程序就能发现、调用、编排联动——同一份清单自动生成文档和测试页。
为什么做 KnotLink
我们发现,现代桌面应用之间缺乏一种轻量化、标准化的互联方式——协议互相难适配,跨应用协作成本高昂。
别人想接入你的软件?你得写文档、讲接口、陪着联调。对方改了需求,你改接口,所有调用方都得跟着改。
两个软件想联动?写适配代码,硬编码地址,处理不同格式。再多一个软件,适配代码直接翻倍。
应用互联本该简单,现实却总在重复造轮子。
轻量化设计取舍
KnotLink 的"轻量"不是比谁报文更短,而是在目标场景下精准裁剪无关功能。
底层报文:KLUDF 键值对
放弃 JSON、Protobuf 等重型序列化,自研 key=val;key=val 纯文本键值报文。无复杂嵌套符号、无固定二进制编解码,终端 telnet 可直接调试。底层完全复用操作系统原生 TCP 栈,不自定义传输层。
接口定义:静态 JSON 替代运行时协商
MCP、DBus、gRPC 需要运行时握手、动态拉取接口清单;KnotLink 用本地静态 FuncList.json 一次性声明全部接口、参数类型、返回结构。对于常驻桌面软件,接口极少动态增减——静态声明比运行时轮询更省资源,且离线即可完成校验和文档生成。
全开源,无闭源组件
KnotLink 全部组件 MIT 开源——SDK、协议规范、FuncList 定义、可视化编辑器、守护进程——没有任何闭源模块。开发者可以自行编译、审计、修改全部代码。
SDK 分层,依赖隔离
核心通信逻辑无 GUI 依赖。PyQt5 仅配套可视化编辑器使用,纯后台无界面程序可完全剔除。C++/Java SDK 仅依赖标准库。
全部组件 MIT 开源。 SDK、协议规范、FuncList 定义、可视化编辑器——全部 MIT。
轻量化亮点
部署接入门槛低。 gRPC 需提前写 proto、预编译、维护版本兼容;裸 TCP 需手写全套报文解析、参数校验、文档。KnotLink 仅一份 JSON 描述文件,自动完成参数校验、接口调用、文档生成、可视化节点。
报文兼顾轻量与可读。 KLUDF 体积远小于完整 JSON,同时人类可读,无需专用工具即可排查问题。
拒绝过度通用化。 从设计之初锁定单机本地程序联动,直接删除公网寻址、多设备路由、持久化消息、复杂权限等冗余模块,协议栈只保留信号推送、请求响应、参数校验三类刚需。
与现有方案的定位差异
下层传输不是 KnotLink 的竞争维度。TCP、HTTP、gRPC、Unix Socket、ZeroMQ 解决的是程序之间能收发字节。KnotLink 叠加的是标准化接口描述 + 配套工具链 + 可视化编排。二者是上下层互补关系,不是替代关系。
与 MCP 的区别
| MCP | KnotLink | |
|---|---|---|
| 目标场景 | AI 大模型 ↔ 工具 | 桌面程序 ↔ 桌面程序 |
| 消息流 | AI 居中调度,必经 LLM | 程序直发直收,守护进程只转发不解读 |
| 能力发现 | 运行时动态 tools/list | 静态 FuncList.json,离线即可预览 |
| 传输层 | JSON-RPC over HTTP | KLUDF 键值对 over TCP |
| 典型用户 | AI 应用开发者 | 桌面工具开发者、普通用户编排联动 |
初心不同,设计自然不同。 两者不冲突——你可以用 MCP 让 AI 调工具,同时用 KnotLink 让工具之间自己联动。
与常见本地通信方案对比
| 方案 | 接口标准化 | 自动文档 | 可视化编排 | 跨设备 | 生态成熟度 |
|---|---|---|---|---|---|
| 裸 TCP / Unix Socket | 无,手写解析 | 无 | 无 | 可,需自建 | 40 年,RFC 标准 |
| HTTP REST 本地服务 | 需手写路由和序列化 | 需额外工具 | 无 | 天然支持 | 30 年,全球基础设施 |
| gRPC | Proto 预编译 + 代码生成 | 需 proto 注释 + 插件 | 无 | 天然支持 | 10 年,Google 维护 |
| ZeroMQ | 仅收发模型,无接口规范 | 无 | 无 | 天然支持 | 15 年,社区成熟 |
| KnotLink | 一份 JSON 声明全部 | 自动生成 | 内置拖拽式编辑器 | 无,仅单机 | 早期,生态小 |
AppID 设计说明
AppID 采用倒置域名格式(如 com.example.myapp),跟 Java 包名、Apple Bundle ID 同一种机制——用域名所有权保证全局唯一,不需要中心化注册。你在本地直接写一个自己的域名就行,跟注册 DNS 无关。
旧格式(0x 十六进制)仅兼容保留,新项目统一用倒置域名。AppID 的作用是区分本地多程序实例、避免信号冲突,不依赖任何在线服务。
Service 中心化与权限管理
守护进程已实现中心化消息路由——所有节点注册和消息转发都经过它。AppID 解决的是**"我是谁"(去中心化,自声明),守护进程解决的是路由和转发**。
在此基础上,守护进程天然适合进一步承担权限管控(规划中):
- 哪些节点可以调用某个功能
- 哪些节点可以订阅某个信号
- 特定 AppID 的请求直接拒绝
权限策略在守护进程一层统一执行,不需要散落在每个节点各自实现。去掉这个中心点,权限逻辑就得每个程序自己维护——难审计、难更新、而且无法阻止恶意程序直接往 TCP 端口发消息。
场景边界(什么时候适合 / 不适合)
适合 KnotLink 的场景:
- 3 个及以上本地工具需要互相联动
- 需要非开发者(普通用户)可视化编排程序联动
- 多语言程序长期迭代,不想重复编写解析、文档、测试三套胶水代码
- 需要统一维护接口规范,降低跨语言对接沟通成本
不适合 KnotLink 的场景:
- 仅两个固定程序一对一简单通信 → 裸 TCP 更省事
- 跨设备、跨网络通信 → KnotLink 定位单机,不做分布式
- 需要运行时动态注册/热插拔接口 → 当前不支持,规划中
轻量化天然短板(诚实陈述)
动态接口注册尚未支持。 当前运行中新增接口需修改 JSON 重启,运行时热加载在规划中。
仅覆盖单机场景。 整套裁剪逻辑全部针对本机 IPC,一旦需要多设备联动需额外封装。
协议许可
KnotLink 全部组件(SDK 全语言客户端、协议规范、FuncList 定义、可视化编辑器)采用 MIT 许可证,可自由使用、修改、分发,无传染性约束。