在第二个实例完成后,如何防止执行其余的回调实例?

时间:2019-06-04 11:36:08

标签: c++ callback arduino mqtt isr

我正在使用PubSubClient库为MQTT客户端编写程序。

在订阅的主题中收到消息后,使函数运行的方法是实现回调函数并将其作为参数传递给库的setCallback()方法。

现在的问题是,由于我要实现的业务逻辑,我想确保在我收到两个消息并且第二条消息在第一个回调实例结束之前触发其回调实例的情况下,第一个回调实例的其余部分将不会执行。

是否有任何设计模式可以实现这一目标?也许通过多任务处理(多线程),或者通过使用数字写入来触发ISR,或其他任何方式。


如果有人建议我可以延迟第二个回调,是的,这是可行的,但是我不能使用它,因为第二个回调具有最新的有效信息,而第一个回调具有我要停止的信息不再是有效信息。


对于这个例子,如果我给出完整的例子,那将是TL; DR,但这就是正在发生的事情。

回调函数获取主题和MQTT代理发送的消息。
因此,我使用一些IF语句来决定应调用哪个函数。现在,在一定条件下,我需要Publish(根据MQTT的意思)将一个数字指定给Topic。另外,在另一种情况下,我必须在发布之前更改该编号。
因此,正如您已经了解的那样,在这种情况下,我会收到一条消息发送到“发布”,然后立即发布,但是在我发布之前,我收到了第二条消息,说“更改”。

发生的事情是,当我准备发布时,我收到第二条消息,因此“嵌套”回调更改了我要发布的内容。当然,在我发布MQTT代理时,它正在等待更改的值。

现在,您可能会发现使用全局变量可以很好地工作,但这并不是那么简单。另外,在我发布之前,处理需要花费一些时间,而不是很多,仅需要几毫秒即可接收另一条消息,因此也需要解决该特定情况。

总的来说,这不是一个真正的问题,因为如果Broker接收到无效数据,它会响应并显示一条错误消息,该错误消息会被我捕获。但是我认为,如果我什至可以防止这种情况发生,那么设计会更好。


代码示例:

//In setup
client.setCallback(callback);        
mqttReconnect();

// The callback
void callback(char* topic, byte* payload, unsigned int length) {
if(topic == CHANGE){
  askBrokerForMoreInstructions(); // this functions will take as much time as the broker needs to respond..
} else if(topic == PUBLISH){
  doSomeCalculations();
  client.publish(topic,charArray);
}...

我忘了提及的是,当我收到CHANGE主题中的内容时,我必须等待更多的指令,这就是为什么我收到第二个回调的原因,收到的第二条消息包含我应该在{{ 1}},然后再发布。因此,当第二个回调完成时(如果是更改命令),第一个回调就没有意义了。

0 个答案:

没有答案
相关问题