9 个版本
| 0.3.0 | 2022年11月23日 |
|---|---|
| 0.2.1 | 2022年11月22日 |
| 0.1.5 | 2021年6月6日 |
778 在 数据库接口
26 每月下载次数
150KB
3.5K SLoC
包含 (WOFF 字体, 41KB) icons.woff2
objtalk
objtalk 是一个轻量级实时数据库,适用于物联网项目。它可以用于实时存储和查询设备状态,并通过事件和 RPC 在设备之间进行通信。它是 mqtt 的加强版。
objtalk 存储对象。每个对象都有一个名称、一个值(json)和一个时间戳,表示对象上次修改的时间。可以通过 API 创建、修改、删除和查询对象。查询还可以监视更改并在实时返回给客户端。
API 可以使用多种传输方式访问。该协议类似于 JSON-RPC,可以通过 TCP 或 WebSocket 使用。也可以使用 HTTP/REST 进行简单命令。
objtalk 中存储的所有对象也可以使用内置的管理面板在浏览器中查看。
安装
安装预编译的二进制文件或使用 cargo
$ cargo install objtalk
使用服务器
创建一个配置文件,例如命名为 objtalk.toml
[storage]
backend = "sqlite"
sqlite.filename = "objtalk.db"
[[http]]
addr = "127.0.0.1:3000"
admin.enabled = true
#admin.asset-overrides = "admin"
#allow-origin = "*"
[[tcp]]
addr = "127.0.0.1:3001"
启动服务器
$ objtalk-server --config objtalk.toml
http transport listening on http://127.0.0.1:3000
tcp transport listening on 127.0.0.1:3001
访问管理面板 http://127.0.0.1:3000。
使用客户端
$ objtalk-cli -u http://127.0.0.1:3000 set foo 42
$ objtalk-cli -u http://127.0.0.1:3000 get foo
[
{
"name": "foo",
"value": 42,
"lastModified": "2021-05-07T17:53:29.066420Z"
}
]
$ objtalk-cli -u http://127.0.0.1:3000 remove foo
将 objtalk 作为 Rust 库使用
objtalk crate 提供了 objtalk-server 和 objtalk-cli 二进制文件,但您也可以将其作为库集成到您的 Rust 项目中。请参阅 文档 以获取所有可用方法的列表。您可以使用 server 和 client 功能标志来缩减库。
其他语言的库
其他集成
API/协议
基础
设置 name value
set 创建或替换对象。
使用 objtalk-cli
$ objtalk-cli set sensor '{"temperature":20}'
通过 http
$ curl -X POST 127.0.0.1:3000/objects/sensor -d '{"temperature":20}'
通过 tcp 或 websocket
{
"id": 1,
"type": "set",
"name": "sensor",
"value": { "temperature": 20 }
}
{
"requestId": 1,
"result": {
"success": true
}
}
修补 name value
patch 创建或更新对象。如果已存在具有相同名称的对象,则值将合并(非深度)。
使用 objtalk-cli
$ objtalk-cli replace sensor '{"temperature":20}'
通过 http
$ curl -X PATCH 127.0.0.1:3000/objects/sensor -d '{"temperature":20}'
通过 tcp 或 websocket
{
"id": 1,
"type": "patch",
"name": "sensor",
"value": {
"temperature": 20
}
}
{
"requestId": 1,
"result": {
"success": true
}
}
获取 pattern
get 返回所有名称与 pattern 匹配的对象。
对象名称看起来像文件路径,由多个部分组成,这些部分通过正斜杠分隔。每个部分可以是字符串,或者是一个 + 或 *。 + 匹配下一个斜杠之前的任何内容,* 匹配字符串末尾之前的任何内容。可以通过逗号将多个子模式组合起来,并且它们是逻辑或(OR)组合的。
一些示例
*匹配所有对象device/lamp/+匹配device/lamp/livingroom和device/lamp/bedroom,但不匹配device/sensor/livingroomdevice/+/livingroom匹配device/lamp/livingroom和device/sensor/livingroomdevice/*匹配device/lamp/livingroom,device/lamp/bedroom和device/sensor/livingroomdevice/lamp/+,device/sensor/+匹配device/lamp/livingroom,device/lamp/bedroom和device/sensor/livingroom
使用 objtalk-cli
$ objtalk-cli get '*'
通过 http
$ curl '127.0.0.1:3000/query?pattern=*'
通过 tcp 或 websocket
{
"id": 1,
"type": "get",
"pattern": "*"
}
{
"requestId": 1,
"result": {
"objects": [
{
"name": "sensor",
"value": { "temperature": 20 },
"lastModified": "YYYY-MM-DDTHH:MM:SS.SSSSSSSSSZ"
}
]
}
}
查询 pattern
query 返回所有匹配 pattern 的对象,并监视其变化。初始响应包含所有匹配 pattern 的对象。当创建、更改或删除具有匹配名称的新对象时,会触发一个 queryAdd 事件、queryChange 事件或 queryRemove 事件。
使用 objtalk-cli:不受支持
通过 http
$ curl '127.0.0.1:3000/query?pattern=*' -H "Accept: text/event-stream"
通过 tcp 或 websocket
{
"id": 1,
"type": "query",
"pattern": "*"
}
{
"requestId": 1,
"result": {
"queryId": "01234567-89ab-cdef-0123-456789abcdef",
"objects": [
{
"name": "sensor",
"value": { "temperature": 20 },
"lastModified": "YYYY-MM-DDTHH:MM:SS.SSSSSSSSSZ"
}
]
}
}
{
"type": "queryChange",
"queryId": "01234567-89ab-cdef-0123-456789abcdef",
"object": {
"name": "sensor",
"value": { "temperature": 21 },
"lastModified": "YYYY-MM-DDTHH:MM:SS.SSSSSSSSSZ"
}
}
{
"type": "queryAdd",
"queryId": "01234567-89ab-cdef-0123-456789abcdef",
"object": {
"name": "foo",
"value": { "bar": true },
"lastModified": "YYYY-MM-DDTHH:MM:SS.SSSSSSSSSZ"
}
}
{
"type": "queryChange",
"queryId": "01234567-89ab-cdef-0123-456789abcdef",
"object": {
"name": "foo",
"value": { "bar": false },
"lastModified": "YYYY-MM-DDTHH:MM:SS.SSSSSSSSSZ"
}
}
{
"type": "queryRemove",
"queryId": "01234567-89ab-cdef-0123-456789abcdef",
"object": {
"name": "foo",
"value": { "bar": false },
"lastModified": "YYYY-MM-DDTHH:MM:SS.SSSSSSSSSZ"
}
}
取消订阅 queryId
unsubscribe 停止监视变化并删除查询。
使用 objtalk-cli:不受支持
通过 HTTP:当事件流关闭时隐式执行
通过 tcp 或 websocket
{
"id": 1,
"type": "unsubscribe",
"queryId": "01234567-89ab-cdef-0123-456789abcdef"
}
{
"requestId": 1,
"result": {
"success": true
}
}
删除 name
remove 删除对象。返回值指示是否存在具有该名称的对象,并且是否已成功删除。
使用 objtalk-cli
$ objtalk-cli remove sensor
通过 http
$ curl -X DELETE 127.0.0.1:3000/objects/sensor
通过 tcp 或 websocket
{
"id": 1,
"type": "remove",
"name": "sensor"
}
{
"requestId": 1,
"result": {
"existed": true
}
}
事件
对象还可以发出事件。您可以通过创建查询来监听事件。
发出 object event data
emit 在现有对象上发布一个事件。
使用 objtalk-cli
$ objtalk-cli emit gamepad buttonPress '{"button":"a"}'
通过 http
$ curl -X POST 127.0.0.1:3000/events/gamepad -d '{"event":"buttonPress","data":{"button":"a"}}'
通过 tcp 或 websocket
{
"id": 1,
"type": "emit",
"object": "gamepad",
"event": "buttonPress",
"data": { "button": "a" }
}
{
"requestId": 1,
"result": {
"success": true
}
}
这将在所有匹配该对象的所有查询上产生以下事件
{
"type": "queryEvent",
"queryId": "01234567-89ab-cdef-0123-456789abcdef",
"object": "gamepad",
"event": "buttonPress",
"data": { "button": "a" }
}
RPC
可以在对象上调用方法。一个客户端连接到 objtalk,监听方法调用,执行它们并将结果推送到 objtalk。其他客户端可以调用这些方法。
调用方法
invoke 在对象上调用方法。
使用 objtalk-cli
$ objtalk-cli invoke device/lamp/livingroom setState '{"on":true}'
通过 http
$ curl -X POST 127.0.0.1:3000/invoke/device/lamp/livingroom -d '{"method":"setState","args":{"on":true}}'
通过 tcp 或 websocket
{
"id": 1,
"type": "invoke",
"object": "device/lamp/livingroom",
"method": "setState",
"args": { "on": true }
}
{
"requestId": 1,
"result": {
"success": true
}
}
提供方法调用
为了为对象提供 RPC 调用,客户端(“提供者”)必须连接到 objtalk,并使用 provideRpc 设置为 true 创建一个查询。一旦另一个客户端(“消费者”)尝试在对象上调用方法,查询上就会发出一个 queryInvocation 事件。提供者可以处理请求,并使用 invokeResult 命令将结果返回给消费者。
整个流程看起来是这样的
{
"id": 1,
"type": "query",
"pattern": "device/lamp/livingroom",
"provideRpc": true
}
{
"requestId": 1,
"result": {
"queryId": "01234567-89ab-cdef-0123-456789abcdef",
"objects": [
{
"name": "device/lamp/livingroom",
"value": { "on": false },
"lastModified": "YYYY-MM-DDTHH:MM:SS.SSSSSSSSSZ"
}
]
}
}
{
"type": "queryInvocation",
"queryId": "01234567-89ab-cdef-0123-456789abcdef",
"invocationId": "fedcba98-7654-3210-fedc-ba9876543210",
"object": "device/lamp/livingroom",
"method": "setState",
"args": { "on": true }
}
{
"id": 2,
"type": "invokeResult",
"invocationId": "fedcba98-7654-3210-fedc-ba9876543210",
"result": { "success": true }
}
{
"requestId": 2,
"result": {
"success": true
}
}
断开连接命令
客户端可以注册一组在客户端断开连接时执行的命令。这可以用来,例如,通过改变对象值来指示设备已离线。支持的命令有 set、patch、remove 和 emit。
setDisconnectCommands commands
setDisconnectCommands 设置在客户端断开连接时执行的命令列表。
使用 objtalk-cli:不受支持
通过 http:不支持
通过 tcp 或 websocket
{
"id": 1,
"type": "setDisconnectCommands",
"commands": [
{
"type": "set",
"name": "device/foo",
"value": { "offline": true },
},
{
"type": "patch",
"name": "device/foo",
"value": { "offline": true },
},
{
"type": "remove",
"name": "client",
},
{
"type": "emit",
"name": "device/foo",
"event": "offline",
"data": {},
}
]
}
{
"requestId": 1,
"result": {
"success": true
}
}
依赖项
~7–25MB
~310K SLoC