设备指令执行结果同步的思考

165 阅读2分钟

在对接充电桩和用水设备两款设备时,需要下发指令给设备,然后将设备对指令的执行结果通知到用户,从用户视角来看指令从下发到执行流程为:服务器下发指令->设备收到指令执行->设备响应执行结果->服务器接收指令响应给用户,从程序的并发角度来看,整个指令的执行流程是异步的,即接收指令的执行结果线程和下发指令的不是同一线程,为了将设备执行指令结果反馈到用户,本文展开两种设备的两种指令执行结果的响应形式的程序设计方案

充电桩:场景一

image.png

描述:服务器下发指令带上cmdId,设备的指令响应也会将发送的cmdId原封不动的返回过来

思考:对于每条下发至设备的指令服务器将cmdId作为redis的key缓存一定时间,接收到设备响应后,服务器解析响应中的cmdId并根据cmdId更新key对应的响应结果,web端轮序服务器开放一个接口可根据cmdId查询redis中该cmdId对应的val值即可同步获取设备指令执行的结果。

image.png

用水设备:场景二,

image.png

描述:设备一直在运行过程中定时向服务器发送心跳报文,当服务器下发一条控制指令,并且设备执行成功后,心跳报文中的FMKD(阀门状态)值发生了变化。

方案设计:不同于场景一,此场景下无法保证多个用户并发下发指令时,具体是哪个用户的指令对设备造成了影响,所以此时服务器需要设计一套同步逻辑,保证同一时刻只能有一个用户下发指令到设备,其他用户下发指令均提示设备被占用。

image.png

两种场景比对

第一种和第二种相比,指令执行结果可以不用依赖业务数据,由于指令的下发到执行完成以请求cmdId--响应cmdId的流程完成闭环,指令的下发支持多用户并发操作,每个操作均可以获取到设备响应的结果;第二种与第一种相比,需要业务上控制设备操作的并发,即同时只允许一个用户对设备进行指令控制,并且指令执行的结果依赖于业务状态的设计。