调用功能
本文档教你如何调用其他程序通过 KnotLink 暴露的功能——包括发起请求获取响应,以及订阅信号监听事件。
这是"调用方"教程。如果你想提供功能给别人调用,请查看 提供功能。
发现可调用的节点
访问 knotlink.cn/nodes 浏览已收录的节点,每个节点页面列出了它的 appID、接口和信号详情。也可以直接查看 KNodeIndex 仓库 的 plugin/ 和 standalone/ 目录。
前置条件
- 已安装并运行 守护进程
- 已安装对应语言的 SDK(参见 环境配置)
- 知道目标程序的
appID和openSocketID/signalID(从上述渠道获取)
两种调用方式
| 方式 | 模块 | 模式 | 场景 |
|---|---|---|---|
| 请求-响应 | OpenSocketQuerier | 一问一答 | 查询数据、执行操作、远程控制 |
| 订阅信号 | SignalSubscriber | 持续监听 | 实时事件通知、状态变更 |
选择语言:
- Python
- PyQt5
- Qt C++
- C++
- JavaScript
- Java
- C#
- Rust
请求-响应
from knotlink import OpenSocketQuerier, KLKVMap
# 连接到目标接口
querier = OpenSocketQuerier("com.example.msgreminder", "show")
# 构建请求数据
kv = KLKVMap()
kv["msgContext"] = "你好,这是一条测试消息"
kv["sender"] = "我的调用程序"
# 同步查询:发送请求并等待响应
response = querier.query(kv.serialize())
print(f"响应:{response}") # → "OK"
订阅信号
from knotlink import SignalSubscriber, KLKVMap
import time
def on_signal(data: str):
kv = KLKVMap()
kv.deserialize(data)
event = kv.get("event", "")
print(f"📩 收到信号 [{event}]:{data}")
# 订阅目标信号
sub = SignalSubscriber("com.example.msgreminder", "messageReceived")
sub.set_RecvFunc(on_signal)
print("🔗 等待信号...")
while True:
time.sleep(1)
请求-响应
from KnotLinkClient_PyQt import OpenSocketQuerier
from knotlink import KLKVMap
querier = OpenSocketQuerier()
querier.setConfig("com.example.msgreminder", "show")
kv = KLKVMap()
kv["msgContext"] = "测试消息"
response = querier.query_l(kv.serialize())
print(f"响应:{response}")
订阅信号
from KnotLinkClient_PyQt import SignalSubscriber
sub = SignalSubscriber("com.example.msgreminder", "messageReceived")
sub.received_data.connect(lambda data: print(f"📩 收到信号:{data}"))
请求-响应
#include "KnotLinkLib.h"
OpenSocketQuerier querier;
querier.setConfig("com.example.msgreminder", "show");
QString response = querier.query_l("msgContext=测试消息;sender=test");
qDebug() << "响应:" << response;
订阅信号
SignalSubscriber *sub = new SignalSubscriber(
"com.example.msgreminder", "messageReceived", this
);
connect(sub, &SignalSubscriber::receivedData,
[](const QString &data) {
qDebug() << "收到信号:" << data;
});
请求-响应
#include "knotlink/OpenSocketQuerier.hpp"
#include "knotlink/kludf.hpp"
OpenSocketQuerier querier;
querier.setConfig("com.example.msgreminder", "show");
KLKVMap kv;
kv["msgContext"] = "测试消息";
std::string resp = querier.query_l(kv.serialize());
std::cout << "响应:" << resp << std::endl;
订阅信号
#include "knotlink/SignalSubscriber.hpp"
SignalSubscriber sub("com.example.msgreminder", "messageReceived");
sub.setOnDataReceivedCallback([](const std::string& data) {
std::cout << "收到信号:" << data << std::endl;
});
请求-响应
const { OpenSocketQuerier, KLKVMap } = require('knotlink-client');
const querier = new OpenSocketQuerier('com.example.msgreminder', 'show');
const kv = new KLKVMap();
kv['msgContext'] = '测试消息';
const resp = querier.query(kv.serialize());
console.log('响应:', resp);
订阅信号
const { SignalSubscriber } = require('knotlink-client');
const sub = new SignalSubscriber('com.example.msgreminder', 'messageReceived');
sub.on('data', (data) => console.log('收到信号:', data));
请求-响应
OpenSocketQuerier querier = new OpenSocketQuerier(
"com.example.msgreminder", "show"
);
KLKVMap kv = new KLKVMap();
kv.put("msgContext", "测试消息");
String resp = querier.query(kv.serialize());
System.out.println("响应:" + resp);
订阅信号
SignalSubscriber sub = new SignalSubscriber(
"com.example.msgreminder", "messageReceived"
);
sub.setDataListener(data -> System.out.println("收到信号:" + data));
请求-响应
var querier = new OpenSocketQuerier("com.example.msgreminder", "show");
var kv = new KLKVMap();
kv["msgContext"] = "测试消息";
string resp = await querier.QueryAsync(kv.Serialize());
Console.WriteLine($"响应:{resp}");
订阅信号
var sub = new SignalSubscriber("com.example.msgreminder", "messageReceived");
sub.OnDataReceivedAsync = async (data) =>
{
Console.WriteLine($"收到信号:{data}");
await Task.CompletedTask;
};
请求-响应
let querier = OpenSocketQuerier::new("127.0.0.1:6376").await?;
let mut kv = KLKVMap::new();
kv.insert("msgContext".into(), "测试消息".into());
let resp = querier.query("com.example.msgreminder", "show", &kv.serialize()).await?;
println!("响应:{}", resp);
订阅信号
let sub = SignalSubscriber::new(
"com.example.msgreminder".into(),
"messageReceived".into(),
"127.0.0.1:6372",
).await?;
while let Some(data) = sub.rx.recv().await {
println!("收到信号:{}", data);
}