Shifu高级功能:实现FSM(有限状态机)

介绍

有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机(英语:finite-state automaton,缩写:FSA),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。查看百度百科

FSM由一些状态和转移构成,每个状态表示系统的一种潜在状态,每个转移表示从一个状态到另一个状态的转换。FSM的运行过程是通过接收输入来触发转换的,当FSM接收到一个输入时,它会从当前状态转移到下一个状态。

在工程学中,FSM可以用来描述机器的控制系统。例如,一个机器的控制系统可能有多种状态,比如“运行”、“暂停”、“停止”等。每种状态都有不同的输入和输出,并且有不同的转移规则。例如,当机器处于“运行”状态时,接收到“暂停”的输入可能会使机器转移到“暂停”状态,而接收到“停止”的输入可能会使机器停止运行。

设计

在MQTTDeviceShifu中实现最简单的FSM模型。设备初始状态为空闲状态。在使MQTTDeviceShifu向设备发送控制命令(controlMsg)后,设备由空闲状态转移到忙碌状态(设备处于忙碌状态时,阻止其它控制命令的接收);在设备完成该控制命令时,设备会向MQTT Broker返回完成信息,设备由忙碌状态转移到空闲状态。

Shifu高级功能:实现FSM(有限状态机)_第1张图片

Shifu高级功能:实现FSM(有限状态机)_第2张图片

功能

在您的集群中运行下面的命令,向设备发送moving_the_device控制命令(可以通过不同的API选择向不同的topic发布,这里选择topic1对应的get_topicmsg1),设备进入忙碌状态:

sudo kubectl exec -it nginx -- curl -X POST -d 'moving_the_device' http://deviceshifu-mqtt.deviceshifu.svc.cluster.local/get_topicmsg1  

设备在忙碌状态时会拒绝接收新的控制命令(包括拒绝其它topic发来的控制命令或普通消息,但仍然可以通过这些topic获取设备状态等消息)。

在忙碌状态时发送新的rotating_the_device控制命令:

sudo kubectl exec -it nginx -- curl -X POST -d 'rotating_the_device' http://deviceshifu-mqtt.deviceshifu.svc.cluster.local/get_topicmsg1

MQTTdeviceShifu返回如下:

Device is blocked by moving_the_device controlMsg now! 2023-01-02 07:14:28.324501338 +0000 UTC m=+67770.982000572

在设备完成控制命令后,会向MQTT Broker发送该控制命令完成的响应,恢复空闲状态。

使用mosquitto模拟设备完成moving_the_device时,返回对应的完成信息device_finished_moving:

sudo kubectl exec -it deploy/mosquitto -n devices -- mosquitto_pub -h localhost -d -p 1883 -t /test/test1 -m "device_finish_moving" 

此时,设备已恢复空闲状态,可以接收其它控制命令。

使用

根据需要自定义设备控制命令controlMsg及其对应的完成响应,均在examples/mqttDeviceShifu/mqtt_deploy/mqtt_edgedevice.yaml文件中配置。

...
data:
    ...
  controlMsgs: | 
  # 可选,配置controlMsgs(控制命令和相应完成响应的集合),格式为"key: value"。key是通过任意topic向设备发送的控制命令,设备执行控制命令时进入忙碌状态,拒绝接收其它控制命令,value是设备返回的完成响应,表示设备已完成对应控制命令,恢复空闲状态  
    Moving_the_device: "Device_finished_moving" # 修改此行
    Rotating_the_device: "Device_finished_Rotating" 
    ... # 根据自己的需要可继续配置controlMsgs及对应完成响应,只需按照此格式继续添加即可

本文由边无际授权发布

你可能感兴趣的:(物联网,golang,软件架构)