接入尚未反对协定的设施
备注
尽管Shifu目前正在一直反对更多的协定,然而物联网设施的连贯协定十分多,在应用Shifu的过程中,难免会遇到暂不反对的协定。本文将介绍应用第三方驱动在Shifu中接入设施的形式。提醒
如果您心愿为Shifu我的项目奉献代码,增加一个新驱动,请查看deviceShifu Development Guide。
技术原理
您能够在Shifu仓库的pkg/deviceshifu文件夹下查看当初Shifu反对的deviceShifu。能够看到pkg/deviceshifu/deviceshifuhttp会将一个应用HTTP协定的物联网设施转为deviceShifu。
也就是说,咱们只须要将暂不反对的协定转为 HTTP 协定的接口即可。
案例实现
以接入RS485-Modbus协定的设施为例。
备注
RS485是一种硬件连贯协定,Modbus则是软件层的连贯协定。
读取数据
咱们须要先寻找可能读取RS485-Modbus设施数据的第三方库。这里咱们应用Python编程语言,应用的第三方库为pymodbus。具体来说,该案例中 RS485物理设施 的连贯形式为通过 RS485转USB的芯片 连贯到电脑,所以应用的 Python类为 ModbusSerialClient。
from pymodbus.client.sync import ModbusSerialClient
新建一个设施的类,这里咱们应用一个LED数码显示屏为例:
class MyRS485Device: def __init__(self, device_address: int = 0x01, port: str = '/dev/tty.usbserial-14420') -> None: self.device_address = device_address self.client = ModbusSerialClient(method='rtu', port=port, stopbits=1, bytesize=8, parity='N', baudrate=9600, timeout=2.0)
能够看到在这里咱们须要依照第三方库中ModbusSerialClient的文档对client
进行初始化。
接下来咱们就能够定义RS485设施的性能了,这里咱们抉择在LED上显示一个小数:
class MyRs485Led: ...... def setFloat(self, value: float): data = int(abs(value) * 10) self.client.connect() self.client.write_register(address=7, value=data, unit=self.device_address) self.client.close()
这样,咱们通过上述Python代码,就实现了读取RS485-Modbus的数据。
建设HTTP服务端
接下来咱们应用fastapi启动HTTP服务端,比方咱们裸露一个setfloat
的API来供内部拜访以在LED显示屏上显示小数。
from fastapi import FastAPIapp = FastAPI()device = ZhongshengLed()@app.get("/setfloat")def setTemperature(value: float = 0.0): device.setFloat(value=value) return { "OK": "OK" }
这里输出的float
是一个可变参数;返回值是一个json串,并不重要。
接下来咱们能够在本机部署这个HTTP服务,而后再接入Shifu。
uvicorn --host 0.0.0.0 --port 23330 main:app
这样咱们就能够通过拜访localhost:23330/setfloat?value=123.4
在LED数码显示屏上呈现出对应的数字。
接入Shifu
接下来咱们将这个通过HTTP出现的设施接入到Shifu生成deviceShifu。
---# Source: shifu_chart/templates/configmap.yamlapiVersion: v1kind: ConfigMapmetadata: name: deviceshifu-myled-configmap namespace: deviceshifudata: driverProperties: | driverImage: "defaultImage" driverSku: "Hello" instructions: | instructionSettings: defaultTimeoutSeconds: 3 instructions: "setfloat": # 这里须要增加HTTP裸露的API telemetries: | telemetrySettings: telemetryUpdateIntervalInMilliseconds: 6000 telemetries:---# Source: shifu_chart/templates/service.yamlapiVersion: v1kind: Servicemetadata: labels: app: deviceshifu-myled-deployment name: deviceshifu-myled-service namespace: deviceshifuspec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: deviceshifu-myled-deployment type: LoadBalancer---# Source: shifu_chart/templates/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: labels: app: deviceshifu-myled-deployment name: deviceshifu-myled-deployment namespace: deviceshifuspec: replicas: 1 selector: matchLabels: app: deviceshifu-myled-deployment template: metadata: labels: app: deviceshifu-myled-deployment spec: containers: - image: edgehub/deviceshifu-http-http:v0.1.0 name: deviceimg ports: - containerPort: 8080 volumeMounts: - name: deviceshifu-config mountPath: "/etc/edgedevice/config" readOnly: true env: - name: EDGEDEVICE_NAME value: edgedevice-myled - name: EDGEDEVICE_NAMESPACE value: devices volumes: - name: deviceshifu-config configMap: name: deviceshifu-myled-configmap serviceAccountName: edgedevice-sa---# Source: shifu_chart/templates/edgedevice.yamlapiVersion: shifu.edgenesis.io/v1alpha1kind: EdgeDevicemetadata: name: edgedevice-myled namespace: devicesspec: sku: "xxx" connection: Ethernet address: "192.168.0.123:23330" # 须要填写本机的IP地址 protocol: HTTP customMetadata: "description" : "description" "paas_device_id" : "device_xxxx" "vendor" : "xxx"status: edgedevicephase: "pending"
这样咱们就实现了部署。
提醒
欢迎您 向Shifu我的项目奉献代码,增加尚未反对的新驱动!
本文由边无际受权公布