乐趣区

关于物联网:Shifu高级功能实现FSM有限状态机

介绍

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

FSM由一些状态和转移形成,每个状态示意零碎的一种潜在状态,每个转移示意从一个状态到另一个状态的转换。FSM 的运行过程是通过接管输出来触发转换的,当 FSM 接管到一个输出时,它会从以后状态转移到下一个状态。

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

设计

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

性能

在您的集群中运行上面的命令,向设施发送 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 及对应实现响应,只需依照此格局持续增加即可
退出移动版