共计 3374 个字符,预计需要花费 9 分钟才能阅读完成。
接入尚未反对协定的设施
备注
尽管 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 FastAPI
app = 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.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: deviceshifu-myled-configmap
namespace: deviceshifu
data:
driverProperties: |
driverImage: "defaultImage"
driverSku: "Hello"
instructions: |
instructionSettings:
defaultTimeoutSeconds: 3
instructions:
"setfloat": # 这里须要增加 HTTP 裸露的 API
telemetries: |
telemetrySettings:
telemetryUpdateIntervalInMilliseconds: 6000
telemetries:
---
# Source: shifu_chart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: deviceshifu-myled-deployment
name: deviceshifu-myled-service
namespace: deviceshifu
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: deviceshifu-myled-deployment
type: LoadBalancer
---
# Source: shifu_chart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deviceshifu-myled-deployment
name: deviceshifu-myled-deployment
namespace: deviceshifu
spec:
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.yaml
apiVersion: shifu.edgenesis.io/v1alpha1
kind: EdgeDevice
metadata:
name: edgedevice-myled
namespace: devices
spec:
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 我的项目奉献代码,增加尚未反对的新驱动!
本文由边无际受权公布