edgexfoundry 介绍
EdgeX Foundry用一句话来介绍,就是Linux基金会下的硬件和操作系统无关的开源中立的边缘计算微服务框架,用于统一工业物联网边缘计算解决方案的生态系统。
通过sdk创建设备服务
我们自己创建得device-service可再edgex官方提供得device-sdk-go的基础上改造得到。
创建一个设备服务主要是要实现ProtocolDriver中给出的接口,在这个实例中进入到driver目录,主要是实现Initialize、HandleReadCommands、HandleWriteCommands三个函数。
- Initialize
Initialize(lc logger.LoggingClient, asyncCh chan<- *dsModels.AsyncValues, deviceCh chan<- []dsModels.DiscoveredDevice) error
lc应该是日志系统,asynCh是一个通道,我们通过将我们想上传的值赋予给asynCh就可以上传至coredata,deviceCh应该是用来自动发现设备的。
- HandleReadCommands
func (s *SimpleDriver) HandleReadCommands(deviceName string, protocols map[string]contract.ProtocolProperties, reqs []dsModels.CommandRequest) (res []*dsModels.CommandValue, err error)
该函数的作用是在用户通过core-command发送get命令时调用,行为是像物理设备发送一次读命令请求。
- HandleWriteCommands
func (s *SimpleDriver) HandleWriteCommands(deviceName string, protocols map[string]contract.ProtocolProperties, reqs []dsModels.CommandRequest,
params []*dsModels.CommandValue) error {
用法基本与HandleRandomCommends一致,通过post上传的参数放到了params里面。
目录结构及配置文件介绍
目录结构如下图所示:
- configuration.toml介绍
主要是用来配置device service的地址和端口号,注册到EdgeX服务中以及设备的预定义。部署在服务器上,则需要将[Service]中的Host修改成服务器的ip地址,[Registry], [Clients], [Device], [Logging]等可以不需要修改。
找到[[DeviceList]]该部分是用来预定义设备的
Name是你创建的Device的名字
Profile是用来创建Device的配置文件,即profile.yml中name的值
[[DeviceList.AutoEvents]]是用来自动发送Command请求的,对应profile.yml是调用get命令,对应SDK接口是调用HandleReadCommand函数
Frequency 是发送请求的频率
Resource 是发送请求对应的数据类型,与proflie.yml中的deviceResources对应。
- Profile.yml介绍
Profile.yml是用来定义Device的数据类型以及通过core-Command来对device发送命令.
deviceResources,deviceCommands与coreCommands三者的关系:
deviceResources中的值是定义Device上传到deviceService中数据的类型。
coreComands定义了核心服务core-command能对设备进行的操作,包括读(get)和写(put)。
deviceCommands是联系coreCommands与deviceResources的桥梁,他定义了coreCommands操作设备时对哪些数值类型进行操作。
第一行name对应configuration.toml中DeviceList中的Name,是这个Profile的“名字”
deviceResources中name: “SwitchButton”代表这个设备的一个数据类型的名称
下面的 properties定义了SwitchButton的基本数值类型
corecommands 定义了core-command对设备操作的两种方法,一个是读(get),一个是写(put)
get中 expectedValues表示希望读取到的值的类型,与deviceResources中name目录下的名称一致
put中parameterNames表示传入的参数的值的类型,也与deviceResources中name目录下名称一致
deviceCommands连接deviceResources与coreCommands
name与 coreCommands中name一致
在coreCommands中定义了get则需要get, 定义了put则需要定义set。
deviceResource与deviceResources中name一致
通过Configuration.toml的预定义Device和Simple.yaml文件就可以生成一个Device并且注册到core-metadata中去,当然也可以自己通过Simple.yaml手动注册一个Device