设备控制
与数据采集类似,在deviceshifu_configmap.yaml
中设置好设备的指令后,我们可以通过HTTP/gRPC与 deviceshifu 进行通信,deviceshifu 会将我们发送的指令转换成设备所支持协议的形式,并发送给设备。设备接受到指令之后,可以通过指令执行相应的操作,从而实现设备控制。
结合数据采集实现设备的自动化控制
- 这里,我们再创建一个虚拟设备
PLC
(如果您未试玩过PLC
设备,您可以点击查看)。此时我们启动了两个 deviceshifu,它们分别与设备建立了连接。我们可以将两个 deviceshifu 进行联动,即当温度计温度超过阈值时,将$ kubectl get pods -n deviceshifu
NAME READY STATUS RESTARTS AGE
deviceshifu-opcua-deployment-765b77cfcf-dnhjh 1/1 Running 0 14m
deviceshifu-plc-deployment-7f96585f7c-6t48g 1/1 Running 0 7m8sPLC
的Q区的最低位置为1,当温度计温度低于阈值时则置回0。 - 编写与控制设备相关的程序。
package main
import (
"io/ioutil"
"log"
"net/http"
"strconv"
"time"
)
func main() {
targetUrl := "http://deviceshifu-thermometer.deviceshifu.svc.cluster.local/read_value"
req, _ := http.NewRequest("GET", targetUrl, nil)
var isHigh bool
for {
res, _ := http.DefaultClient.Do(req)
body, _ := ioutil.ReadAll(res.Body)
temperature, _ := strconv.Atoi(string(body))
if temperature > 20 && isHigh == false {
setPLCBit("1")
isHigh = true
} else if temperature <= 20 && isHigh == true {
setPLCBit("0")
isHigh = false
}
log.Printf("Now remperature is: %d", temperature)
res.Body.Close()
time.Sleep(5 * time.Second)
}
}
func setPLCBit(value string) {
targetUrl := "http://deviceshifu-plc/sendsinglebit?rootaddress=Q&address=0&start=0&digit=0&value=" + value
req, _ := http.NewRequest("GET", targetUrl, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
}