用户手册:接入设备之接入尚未支持协议的设备
  kUdFS03gV42N 2023年11月13日 15 0

接入尚未支持协议的设备

备注 虽然 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项目贡献代码,添加尚未支持的新驱动!

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  tprTMCWDkFAR   2023年12月08日   13   0   0 PythonCode
  QtpjMRSUUfXb   2023年11月19日   24   0   0 赋值Python
  xWYnr39PTA9E   2023年11月19日   30   0   0 迭代Python数组
kUdFS03gV42N