控制器插件
控制器插件加载原理
控制器插件用于在不修改控制器主体程序的情况下,将用户自定义功能加载到控制器内部。插件本质上是一个符合约定接口的动态库文件,在 Linux 控制器环境中通常表现为 .so 文件。
控制器启动或刷新插件时,会扫描插件目录,并按照插件包中的 .json 描述文件读取插件名称、版本、依赖、启用状态以及控制器版本约束等信息。校验通过后,控制器会加载对应的动态库文件,并调用动态库中按接口规范导出的注册函数。插件在注册函数中将自身提供的功能、命令、回调或扩展能力注册到控制器框架内,控制器随后即可像调用内部模块一样调度插件功能。
典型加载流程如下:
- 控制器读取插件包,并校验
json、lic、so文件是否完整且命名一致。 - 控制器检查授权文件、插件启用状态、依赖插件和控制器版本约束。
- 控制器加载插件动态库,并查找约定的导出函数。
- 控制器执行插件注册函数,插件将功能接口注册到控制器内部。
- 注册成功后,插件功能随控制器运行,可被任务、脚本或控制器内部流程调用。
因此,控制器插件开发需要同时满足动态库接口规范、插件包结构规范和目标控制器运行环境要求。
控制器插件结构
控制器插件包主要包含三个文件,插件.so 插件.lic 插件.json文件。
以只包含一个控制器插件的插件包为例:
controller.zip
└──example
├──example.lic
├──example.so
└──example.json
controller.zip可包含多个控制器插件,每个控制器插件文件名和json,lic,so文件都必须一致。其中so文件json文件由用户生成,lic文件由珞石生成。
so文件的动态库是用户根据提供的API和编译环境生成的产物,json文件由用户填写,各字段含义如下:
{
"controller_plugin":{//描述是一个控制器插件
"example":{//插件名称
"name": "example",//插件名称,需要一致
"depend":["plugin1","plugin2"],//依赖的插件
"enable":true,//是否启用,不启用不加载
"min_controller_version":"3.0.2",//该插件运行最小控制器版本
"must_controller_version":[],//该插件只在这些控制器版本运行,覆盖最小版本
"version": "1.0.0",//用户自定义插件的版本号,建议包含插件使用的api版本
"author": "rokae",//该插件的名称
"description": "description info"//该插件的描述信息
}
}
}
控制器插件加载时候会先校验包的格式,不符合上述规则的不会加载。
编译运行环境
开发语言
控制器插件使用 C++ 开发,建议使用 C++11 标准。插件需要基于珞石提供的控制器插件 API、头文件和示例工程进行开发,动态库中应实现接口规范要求的导出函数和注册逻辑。
编译环境
插件动态库需要在与目标控制器兼容的编译环境中生成。
| 目标平台 | 推荐操作系统 | 编译器 | 产物 |
|---|---|---|---|
| x86_64 | Ubuntu 20.04 | gcc-5.4/g++-5.4 | 插件名.so |
| aarch64 | Ubuntu 20.04 | gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu | 插件名.so |
编译时需要注意:
- 动态库名称需要与插件目录名、授权文件名和
json中的插件名称保持一致。 - 编译架构需要与目标控制器一致,例如 aarch64 控制器必须使用 aarch64 交叉编译工具链。
- 插件依赖的第三方动态库也需要与目标平台架构一致,并随插件或控制器环境正确部署。
- 建议在插件版本号中体现插件 API 版本或适配的控制器版本,便于后续维护。
- 如插件使用了控制器版本相关接口,应在
min_controller_version或must_controller_version中声明版本约束。
运行环境
控制器运行插件时,需要具备以下条件:
- 插件包结构符合要求,
controller.zip中的插件目录、.so、.lic、.json命名一致。 - 授权文件
.lic有效,且与插件和控制器授权信息匹配。 - 目标控制器版本满足插件
json中声明的版本要求。 - 插件依赖的其他控制器插件已经存在,并且在
depend字段中正确声明。 - 插件动态库依赖的运行时库能够被控制器进程加载到。
如果插件加载失败,可优先检查插件包结构、动态库架构、控制器版本、授权文件以及依赖库是否满足要求。
珞石提供虚拟机开发环境,可用于编译、调试和运行控制器。
如需获取虚拟机镜像、插件 API、示例工程或工具链,请联系珞石获取对应资料和使用流程。