智能家居平台,智汀推出可跨品牌联动的 APP——智汀家庭云,联合国内智能家居各厂商软件特点,以智慧核心(简称 SA,硬件)作为中枢,退出不同品牌的智能家居插件包,就可逾越不同品种和性能的设施与零碎,实现全面联动与连贯全屋碎片化场景。那如何退出不同品牌的插件包呢?
- 简述
·以后所说的插件仅指设施类插件,插件为 SA 提供额定的设施发现和管制性能
·插件通过实现定义的 grpc 接口,以 grpc 服务的模式运行,提供接口给 SA 调用
·插件同时须要 http 服务提供 h5 页面及动态文件
- SA 中插件的工作流程
2.1 插件部署流程
1) 插件开发者将开发好的插件服务编译成 docker 镜像提供给 SA 2) SA 依据插件的镜像地址判断本地是否曾经拉取或更新 3) 用户装置插件后,SA 依据镜像运行起容器,插件往注册核心注册服务 4) SA 通过服务发现发现新的插件服务
2.2 插件应用流程
1) 用户在界面上发现设施时对所有插件服务调用 Discover 接口,插件依据实现的接口返回所发现的设施 2) 用户增加设施并标记设施对应的插件 3) 用户申请设施的 H5 地址,进去插件自定义页面 4) 通过交互发动自定义指令给 SA,SA 将指令转发给对应的插件服务
2.3 接口
·文件 http 服务 sdk 提供了不便的办法进行动态文件挂载和自定义 api 接口实现
package main
import "github.com/zhiting-tech/smartassistant/pkg/plugin/sdk/server"
func main() {ps := server.NewPluginServer("yeelight")
ps.HtmlRouter.Static("","./html")
apiGroup := ps.Router.Group("/api/")
apiGroup.GET("")
}
·grpc 服务,通过实现 protobuf 定义的 grpc 接口来实现插件服务:
syntax = "proto3";
package proto;
service Plugin {rpc Discover (empty) returns (stream device);
rpc StateChange (empty) returns (stream state);
rpc GetAttributes (GetAttributesReq) returns (GetAttributesResp);
rpc SetAttributes (SetAttributesReq) returns (SetAttributesResp);
}
message ExecuteReq {
string identity = 1;
string cmd = 2;
bytes data = 3;
}
message ExecuteResp {
bool success = 1;
string error = 2;
bytes data = 3;
}
message GetAttributesReq {string identity = 1;}
message GetAttributesResp {
bool success = 1;
string error = 2;
repeated Instance instances = 3;
}
message Instance {
string identity = 1;
int32 instance_id = 2;
bytes attributes = 3;
string type = 4;
}
message SetAttributesReq {
string identity = 1;
bytes data = 2;
}
message SetAttributesResp {
bool success = 1;
string error = 2;
}
message Action {
string identity = 1;
int32 instance_id = 2;
bytes attributes = 3;
}
message device {
string identity = 1;
string model = 2;
string manufacturer = 3;
}
message empty {
}
message state {
string identity = 1;
int32 instance_id = 2;
bytes attributes = 3;
}
注:grpc 接口是通用的定义,SDK 对接口实现了封装,开发者应用 SDK 时不须要关怀,仅须要实现设施类型即可。
- Sdk
为了不便开发者疾速开发插件以及对立接口,咱们提供 sdk 标准了接口以及预约义了设施模型,以下为 sdk 实现性能:
·插件服务注册
·http 服务
·grpc 服务以及接口封装(包含设施属性获取、属性设置、音讯告诉等)
·预约义模型
- 设施模型设计
4.1 背景
云对云接入时,须要对第三方云的命令进行解析,并通过 SA 对插件发动命令。这就要求插件实现的命令必须要有对立的标准和规范,这样第三方就能够通过这个规范来管制 SA 的所有反对的设施。
4.2 模型设计
SDK 预约义设施类型以及属性,开发者通过引入设施类型实现相干性能。SDK 通过反射获取设施的所有属性,将属性与命令做好对应关系,这样能够使得无论设施是什么状态,都能有对立的接口以及命令进行管制。同时也能不便 SA 更好的通过对立的接口以及命令来治理设施。
操作某个属性时,依据属性的 tag 对命令中的值进行解析和校验 模型例子如下:
package plugin
import "github.com/zhiting-tech/smartassistant/pkg/plugin/sdk/instance"
type Device struct {
Light instance.LightBulb
Info0 instance.Info
// 依据理论设施性能组合定义
}
func NewDevice() *Device {
return &Device{Light: instance.NewLightBulb(),
Info0: instance.NewInfo(),}
}
- 示例我的项目
·Demo-plugin
- 开发指南
参考:设施插件开发