开发者社区> 问答> 正文

MQTT连接方式,只能通过不停地调用IOT_MQTT_Yield来轮询获取数据吗?

MQTT连接方式,只能通过不停地调用IOT_MQTT_Yield来轮询获取数据吗?

展开
收起
保持可爱mmm 2020-03-27 17:01:36 2489 0
1 条回答
写回答
取消 提交回答
  • 如果使用的TCPIP协议栈,可以实现TCP主动通知上层有数据到达,可以改动实现事件触发的方式来触发IOT_MQTT_Yield。但是改动比较大,所以还请自行评估是否需要修改。

    修改流程是:

    调整utils_net.c里面socket的API,变成可以由TCP数据到达时回调的API。

    当TCP主动通知上层有数据到达时,通知到MQTT服务器。让MQTT服务器内部执行IOT_MQTT_Yield,这样就可以不需要外部调用IOT_MQTT_Yield来读取数据。

    如果TCP无法做到主动上报数据,但OS支持多线程,也可以在MQTT-example里面再起一个thread,在这个thread里面以下代码用于接收数据。收到数据时,触发主线程进行数据处理,而主线程大部分时间可以用于处理其他逻辑。

    while(1) {
    IOT_MQTT_Yiled(pclient, 200);
    HAL_SleepMs(200);
    }

    如果使用的系统也不支持多线程,就只能把IOT_MQTT_Yield的timeout时间间隔减小,然后提高调用的频率,在每次调用的时间间隔内执行其他操作,从而做到尽量减少对其他操作的阻塞。

    2020-03-27 17:01:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
RocketMQ Client-GO 介绍 立即下载
RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载