小白不太爱学习 2023-08-10 13:56 采纳率: 91.5%
浏览 12
已结题

关于#嵌入式硬件#的问题:为什么在arduino中通过mqtt协议写回调函数只能写一个这两个就会出问题(两个主题)

为什么在arduino中通过mqtt协议写回调函数只能写一个这两个就会出问题(两个主题),并且在vscode的环境下client.setCallback(callback)只能写在loop函数中而不能写在setup函数中

img

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-10 16:15
    关注

    【以下回答由 GPT 生成】

    问题回答

    关于Arduino中通过MQTT协议写回调函数的限制

    在Arduino中使用MQTT协议时,确实存在一些限制。下面我会一一解释这些限制,并提供相应的解决方案。

    为什么只能写一个回调函数,而不能写两个回调函数(针对两个主题)?

    在MQTT协议中,一个回调函数用于处理消息收到时的操作。由于Arduino的资源有限,仅能同时运行一个回调函数。这意味着只能为一个特定的主题编写回调函数,并在该回调函数中执行相应的操作。如果需要处理多个主题的消息,可以在回调函数中实现多个分支逻辑或使用条件语句进行区分。

    以下是一个示例代码,展示如何在回调函数中处理多个主题的消息:

    // MQTT回调函数
    void callback(char* topic, byte* payload, unsigned int length) {
      // 根据主题执行不同的操作
      if (strcmp(topic, "topic1") == 0) {
        // 主题1的操作逻辑
      } else if (strcmp(topic, "topic2") == 0) {
        // 主题2的操作逻辑
      } else {
        // 默认操作逻辑
      }
    }
    
    // 设置MQTT回调函数
    client.setCallback(callback);
    

    上述示例代码中,通过判断不同的主题来执行不同的操作逻辑。

    为什么在VScode环境下,client.setCallback(callback)只能写在loop函数中,而不能写在setup函数中?

    在Arduino中,setup函数只会在程序开始运行时执行一次,而loop函数会循环执行。由于MQTT协议需要保持与服务器的连接并处理收到的消息,因此将client.setCallback(callback)放在loop函数中,可以保证回调函数被正确调用。

    如果将client.setCallback(callback)放在setup函数中,那么回调函数只会被调用一次,并且在执行完回调函数后,程序将没有进一步处理消息的机会,可能会导致不能正常接收和处理消息。

    以下是一个示例代码,展示在Arduino中正确设置和使用MQTT回调函数的方式:

    #include <PubSubClient.h>
    
    WiFiClient wifiClient;
    PubSubClient client(wifiClient);
    
    // MQTT回调函数
    void callback(char* topic, byte* payload, unsigned int length) {
      // 根据主题执行不同的操作
      if (strcmp(topic, "topic1") == 0) {
        // 主题1的操作逻辑
      } else if (strcmp(topic, "topic2") == 0) {
        // 主题2的操作逻辑
      } else {
        // 默认操作逻辑
      }
    }
    
    void setup() {
      // 初始化网络连接等设置
    
      // 连接MQTT服务器
      client.setCallback(callback);
      client.connect("clientID");
      client.subscribe("topic1");
      client.subscribe("topic2");
    }
    
    void loop() {
      // 处理MQTT消息
      client.loop();
    
      // 其他逻辑代码
    }
    

    上述示例代码中,在setup函数中连接MQTT服务器,并订阅了两个主题。然后,在loop函数中调用client.loop()处理MQTT消息,并在callback回调函数中根据不同的主题执行不同的操作逻辑。

    希望以上回答对你有所帮助!如果还有其他问题,请随时追问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月25日
  • 已采纳回答 8月17日
  • 创建了问题 8月10日

悬赏问题

  • ¥15 在Starccm中相变材料的物理模型该如何选择?
  • ¥15 关于#android#的问题,请各位专家解答!
  • ¥200 PDF使用虚拟列表技术做渲染和加载带来的问题
  • ¥15 出现报错Debug Assertion Failed,如何解决?
  • ¥50 mcf中怎么实现导入的图片变成透明
  • ¥15 ruoyi-flowable流程设计配置的表单时,级联选择如何配置
  • ¥20 金属玻璃的剪切局部化程度怎么用ovito表示出来
  • ¥15 自定义控件在中文模式下不能输入数字
  • ¥15 关于#运维#的问题:用mail.abc.com 端口9696的方式同样能访问hr.abc.com 端口:6080 的页面两个网址都指向同一个外网ip(相关搜索:服务器)
  • ¥15 xgboost建模输出结果由三分类变成四分类