Mappers
概述
Mapper是用来连接并控制设备的应用,它负责的功能如下:
- 扫描并连接设备。
- 收集设备观测到的值。
- 对设备数据进行标准化处理。
- 推送或拉取设备数据。
- 设置设备孪生的期望值。
- 对设备进行健康检查。(todo)
KubeEdge使用Device Controller、Device Twin和Mapper来控制设备。Device Controller位于云端,它使用CRD来定义和控制设备。 Device Twin位于边缘侧,它能够存储来自Mapper的值/状态并在Mapper与Device Controller之间传递消息。 同时,Device Twin中的DMI用于向云端注册Mapper并把Device Model与Device Instance传递给Mapper。
如何创建Mapper
现在用户能够使用 mapper framework 来生成自己的Mapper并控制边缘设备。
1. 设计设备模型与设备实例的CRDs
如果你不清楚如何定义Device Model和Device Instance的配置文件,你可以从page中获取更多细节。
2. 生成Mapper工程
下方的命令能够生成一个基础的Mapper框架。运行命令并输入定义的Mapper名称:
make generate
Please input the mapper name (like 'Bluetooth', 'BLE'): foo
上述命令将生成一个以您的输入命名的项目。文件树如下:
mapper
├── cmd ------------------------ Main process.
│ └── main.go ------------------ Almost need not change.
├── config.yaml ---------------- Configuration file including DMI's grpc settting
├── data ----------------------- Publish data and database implementation layer, almost need not change
│ ├── dbmethod ----------------- Provider implement database interfaces to save data
│ │ ├── influxdb2 -------------- Implementation of Time Series Database(InfluxDB)
│ │ │ └── client.go ------------ InfluxDB client
│ │ ├── redis -------------------Implementation of K/V Database(Redis)
│ │ │ └── client.go ------------ Redis client
│ │ └── tdengine ---------------Implementation of Time Series Database(TDengine)
│ │ └── client.go ------------ TDengine client
│ └── publish ------------------ Publisher implement push interfaces to push data,will add more protocols in the future
│ ├── http ----------------- HTTP client will push data to server
│ │ └── client.go --------- WIP
│ └── mqtt ----------------- MQTT client will push data to broker
│ └── client.go ------- WIP
├── device --------------------- Implementation device layer, almost need not change
│ ├── device.go ---------------- Device control, almost need not change
│ └── devicetwin.go ------------ Push twin data to EdgeCore, almost need not change
├── Dockerfile
├── driver --------------------- Device driver layer, complete TODO item in this
│ ├── devicetype.go ------------ Refine the struct as your CRD
│ └── driver.go ---------------- Fill in the functions like getting data/setting register.
├── hack
│ └── make-rules
│ └── mapper.sh
└── Makefile
大多数情况下,需要在Driver文件夹中填写如下代码:
- 在devicetype.go文件中,需要按照设备实例yaml文件中定义的方式填写ProtocolConfig和VisitorConfig结构体信息,以便Mapper能够正确解析配置信息。
- 在driver.go文件中,需要自定义初始化设备和获取设备数据的方法,并对Mapper收集的数据进行标准化。
- 在config.yaml中,需要定义Mapper的协议名称。
3. 部署Mapper
生成Mapper项目并填充Driver文件夹后,用户可以根据Dockerfile文件制作自己的Mapper镜像,随后通过Deployment等方式将Mapper部署在集群中。
docker build -t [YOUR MAPPER IMAGE NAME] .
一个Mapper Deployment配置文件的例子如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mapper-test
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
nodeName: edge-node # Replace with your edge node name
containers:
- name: demo
volumeMounts: #Required, mapper need to communicate with grpcclient
- mountPath: /etc/kubeedge
name: test-volume
env: #Not Required, this field is used to mount the user database key
- name: TOKEN
valueFrom:
secretKeyRef:
name: demo-secret
key: token
image: docker.io/library/mapper-demo:v1.0.1 # Replace with your mapper image name
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 300m
memory: 500Mi
requests:
cpu: 100m
memory: 100Mi
command: [ "/bin/sh","-c" ]
args: [ "/kubeedge/main --config-file /kubeedge/config.yaml --v 4" ]
volumes:
- name: test-volume
hostPath:
path: /etc/kubeedge
type: Directory
你可以使用Kubernetes原生方式部署Mapper:
kubectl apply -f <path to mapper yaml>
如果你想先在本地调试,也可以直接编译运行Mapper代码:
go run cmd/main.go --v <log level,like 3> --config-file <path to config yaml>
Examples
我们当前提供虚拟设备virtualdevice mapper、modbus协议mapper以及USB协议mapper作为Mapper Framework的例子:
我们之后将提供更多内置的Mapper工程,如bluetooth和onvif。