基于 SDK 的驱动开发
本文主要介绍如何基于 SDK 包开发一个新的驱动插件并应用到 Neuron 中。
第一步,下载安装 SDK
下载链接: https://github.com/emqx/neuron/releases
根据不同的开发系统,下载对应的 sdk tar.gz 包( 例如,neuron-sdk-2.1.3-linux-amd64.tar.gz )到相应的开发系统中并解压得到 neuron-sdk-x.x.x,其中 x.x.x 代表的是版本号,执行以下指令。
脚本执行完成后,需要注意以下路径的用法。
路径 | 说明 |
---|---|
/usr/local/include/neuron | 存放 Neuron 的头文件,应用于 CMakeLists.txt 编译文件中的 include_directories |
/usr/local/lib/neuron | 存放 Neuron 依赖库文件,应用于 CMakeLists.txt 编译文件中的 link_directories |
/usr/local/bin/neuron | 存放运行 Neuron 所需的文件 |
第二步,驱动开发
在开发环境中新建一个目录文件用于存放开发驱动所需要的文件,在该目录文件下新建一个编译配置文件 CMakeLists.txt,一个 build 目录文件用于存放编译后的文件和一个 plugins 目录文件用于存放所有需要开发的驱动文件,每一个驱动都需要有一个独立的目录来存放驱动开发的所需的文件,以开发 modbus-tcp 驱动插件为例,目录层级如下图所示。
CMakeLists.txt 范例
最主要的是 include_directories,link_directories 和 add_subdirectory 要配置正确。
plugins/modbus
驱动开发文件中主要包含编译配置文件 CMakeLists.txt 和 驱动配置的 json 文件和驱动代码文件。
CMakeLists.txt 示例
modbus_tcp.c
驱动插件的接口文件,具体的驱动开发示例,请参考 modbus 插件开发示例 。
static const neu_plugin_intf_funs_t plugin_intf_funs 结构体说明。
参数 | 说明 |
---|---|
.open | 基于 plugin 创建 node 时 neuron 第一个调用的函数,创建插件自己定义的 struct neu_plugin |
.close | 删除 node 时,neuron 调用的最后一个函数,用于释放由 open 创建的 neu_plugin_t |
.init | 创建 node 时,neuron 调用完 open 后,紧接着调用的函数,此函数主要做插件内需要初始化的一些资源 |
.uninit | 删除 node 时,neuron 首先调用的函数,此函数主要释放一些在 init 中申请以及初始化的资源 |
.start | 在 node 页面,将工作状态置为开始,neuron 会调用此函数,通知插件开始运行,以及开始连接设备 |
.stop | 在 node 页面,将工作状态置为停止,neuron 会调用此函数,通知插件停止运行,关闭与设备的连接,driver.group_timer 不再触发 |
.setting | 在 node 页面,进行插件设置时,将通过 json 格式设置参数,neuron 通过此函数通知插件进行设置 |
.request | 此函数在南向 driver 开发中暂未使用 |
.driver.validate_tag | node 添加或者更新 tag 时,neuron 会把 tag 相关参数使用此函数通知到插件,插件根据各自实现检查此 tag 是有符合插件要求,该函数返回 0,代表成功 |
.driver.group_timer | 在 node 中添加 group 并且 node 状态为 running 时,此函数将以 group 的 interval 参数定时调用读取设备数据 |
.driver.write_tag | 当使用 write API 时,neuron 调用此函数,通知插件,向点位 tag 写入特定的值 |
动态库导出数据结构定义 const neu_plugin_module_t neu_plugin_module 说明。
参数 | 说明 |
---|---|
version | 插件版本号 |
module_name | 模块名称 |
module_descr | 模块描述 |
intf_funs | 插件接口函数 |
kind | 插件类型 |
type | 插件实例化为 node 时,node 的类型 |
struct neu_plugin 结构体为插件的前置声名,每个插件需要提供该结构体的具体定义,且首成员必须是 common,其它成员根据驱动的配置添加。
modbus-tcp.json
驱动配置文件。
字段 | 说明 |
---|---|
tag_regex | 针对驱动支持不同的数据类型,对地址配置的正则 |
description | 该字段的详细说明 |
attribute | 该字段的属性,只有两种可选和必选,即 required 和 optional |
type | 该字段的类型,目前常用的是 int 和 string 两种类型 |
default | 填写的默认值 |
valid | 该字段可填写的范围 |
TIP
json 文件的名称应与模块名称 module_name 保持一致。