Shifu Cloud 初面演示
在 2022.10.18,Shifu Cloud 正式公测,Shifu 的用户可以方便的通过可视化的方式选择需要接入的设备,即可快速完成设备接入 Shifu 的流程。
在这一天的线上直播展示中,来自边无际的杨希杰演示使用 Shifu Cloud 接入三个实际的设备,并在其基础上进行应用开发。下面让我们一起来回顾这一过程吧——
创建集群 安装shifu
在使用 Shifu Cloud 前,我们需要先确保已有一台安装了 Shifu 的电脑。
# 在本地使用kind启动k8s集群
$ sudo kind create cluster --image="kindest/node:v1.24.0"
# 克隆shifu仓库并进行安装
$ git clone https://github.com/Edgenesis/shifu.git
$ cd shifu
$ sudo kubectl apply -f pkg/k8s/crd/install/shifu_install.yml
如果你还不了解 Shifu 的安装和本地测试的方式,你可能需要查阅 下载安装 和 本机安装测试 这两篇文档。
本机连接温湿度计和LED
我们要连接的设备为一个RS485的温湿度计和一个RS485的LED显示屏。温湿度计通过串口服务器连接至上位机(电脑),LED显示屏则通过RS485转USB的芯片连接至上位机。具体细节不做展开,在上位机开启HTTP服务之后:
- 访问
localhost:23330/temperature
即可得到温湿度计的温度 - 访问
localhost:23330/humidity
即可得到温湿度计的湿度 - 访问
localhost:23331/setfloat\?value=123.4
value填入需要显示的数字即可在LED上显示
curl localhost:23330/temperature
curl localhost:23330/humidity
curl localhost:23331/setfloat\?value=123.4
接下来我们要将这两个设备接入 Shifu,也即将两个实际的设备(edgeDevices)转为k8s集群中的数字孪生(deviceShifus)。
一键生成配置文件
Shifu Cloud可以轻松生成 deviceShifu 的配置文件。
登录之后点击所有项目,即可添加设备。对于上面的两个设备,采用的都是HTTP协议,所以选择「公有协议 > HTTP」。「基础信息 > 设备名称」中分别填入my_thermometer
和my_led
。设备的IP地址不能填写localhost
,而是需要在电脑的网络设置中找到本机IP:如演示时使用的是192.168.0.123:23330
和192.168.0.123:23331
。
信息填写完毕后,网站会弹出一条命令,点击右侧按钮复制到终端执行,即可将设备部署到本机的k8s集群。这省去了手动编写YAML配置文件的时间,也更加直观。
测试设备正常接入
我们进入到集群中查看是否可以使用集群内的网络地址访问到两个设备的数字孪生:
# 运行一个nginx容器
$ sudo kubectl run --image=nginx:1.21 nginx
# 进入nginx容器
$ sudo kubectl exec -it nginx -- bash
# 与设备进行交互
$ curl http://deviceshifu-mythermometer-service.deviceshifu.svc.cluster.local/humidity
$ curl http://deviceshifu-mythermometer-service.deviceshifu.svc.cluster.local/temperature
$ curl http://deviceshifu-myled-service.deviceshifu.svc.cluster.local/setfloat?value=321
可以看到温湿度计的读数与LED的示数设置都没有问题,这说明设备已成功接入转为数字孪生。
打包应用镜像
我们希望在有温湿度计和LED的基础上进行应用开发,因此我们写出如下的Python程序:
main.py
import time
import requests
import json
isLocal = False
localIp = "192.168.0.123"
flag = -1
while True:
flag += 1
# [拿到数据]
if flag % 2 == 0:
# 拿到温度
url = f"http://{localIp}:23330/temperature" if isLocal else "http://deviceshifu-mythermometer-service.deviceshifu.svc.cluster.local/temperature"
else:
# 拿到湿度
url = f"http://{localIp}:23330/humidity" if isLocal else "http://deviceshifu-mythermometer-service.deviceshifu.svc.cluster.local/humidity"
res = requests.get(url)
# [转换数据]
try:
value = json.loads(res.text)['value']
print("DEBUG", value)
# [显示数据]
led_url = f"http://{localIp}:23331/setfloat?value={value}" if isLocal else f"http://deviceshifu-myled-service.deviceshifu.svc.cluster.local/setfloat?value={value}"
requests.get(led_url)
except:
print("DEBUG", res.text)
time.sleep(2)
该程序每2秒交替读取温湿度计的温度和湿度,并将读到的数据显示到LED上。
接下来我们希望将这个程序打包为一个镜像,之后就可以导入集群运行了:
requirements.txt
requests
Dockerfile
FROM python:3.9-slim-bullseye
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY main.py .
CMD ["python3", "main.py"]
# 构建镜像
$ sudo docker build -t xxx/connection:v0.0.1 .
# 确认镜像已构建
$ sudo docker images | grep connection
xxx/connection v0.0.1 a9526147ddad 2 minutes ago 125MB
# 将镜像载入集群
$ sudo kind load docker-image xxx/connection:v0.0.1
# 将镜像实例化为容器运行
$ sudo kubectl run --image=xxx/connection:v0.0.1 connection-name