MQTT在单片机中的移植:MQTTClient-C定时器功能详解

接下来我们完善MQTTTimer.c和MQTTTimer.h两个功能

MQTTTimer.h

void TimerInit(Timer* timer);

  • 功能:此函数用于对 Timer 结构体进行初始化。在 MQTT 客户端里,定时器被用于追踪各种操作的时间,像连接超时、心跳包发送间隔等。初始化操作会把定时器的内部状态设定为初始值,以保证后续计时操作的准确性。
  • 在 MQTT 中的应用:在创建新的 MQTT 连接或者启动新的操作之前,必须先对定时器进行初始化,从而确保计时的起点是正确的。
  • char TimerIsExpired(Timer* timer);

  • 功能:该函数的作用是检查定时器是否已经超时。它会查看定时器当前记录的时间和设定的超时时间,若已经达到或者超过了设定时间,就返回一个表示超时的标志。
  • 在 MQTT 中的应用:在 MQTT 通信里,很多操作都有时间限制。例如,连接操作、消息发布和订阅操作等都有超时时间。通过调用这个函数,客户端能够判断某个操作是否已经超时,进而采取相应的处理措施,比如重新尝试连接或者放弃操作。
  • void TimerCountdownMS(Timer*, unsigned int ms);

  • 功能:将定时器设置为以毫秒为单位进行倒计时。调用这个函数时,需要传入一个 Timer 结构体指针和一个无符号整数,表示要倒计时的毫秒数。
  • 在 MQTT 中的应用:在 MQTT 协议里,某些操作的时间要求非常精确,使用毫秒级的倒计时可以更精准地控制操作的时间。例如,设置心跳包的发送间隔、等待服务器响应的时间等。
  • void TimerCountdown(Timer*, unsigned int s);

  • 功能:和 TimerCountdownMS 类似,不过它是以秒为单位来设置定时器的倒计时。调用时需要传入 Timer 结构体指针和一个无符号整数,表示要倒计时的秒数。
  • 在 MQTT 中的应用:当对时间精度要求不是特别高时,可以使用秒级的倒计时。例如,设置连接超时时间、重连间隔时间等。
  • int TimerLeftMS(Timer* timer);

  • 功能:获取定时器剩余的毫秒数。调用这个函数会返回定时器距离超时还剩下的毫秒数。
  • 在 MQTT 中的应用:在某些情况下,客户端可能需要知道某个操作还剩下多少时间。例如,在等待服务器响应时,通过获取剩余时间,客户端可以决定是否需要提前采取其他措施,如发送重传请求等。
  • MQTTTimer.c

    static Timer g_Timer;

    void SysTickTimerHandler(void)                ///< 挂在1ms定时器,确保时钟的准确性 
    {
        g_Timer.systick_period++;
    }
    void TimerInit(Timer* timer) 
    {
        timer->end_time = 0;
        timer->systick_period = g_Timer.systick_period;
    }

    char TimerIsExpired(Timer* timer)
    {
        long var = g_Timer.systick_period;
        var = var – timer->end_time;
        return (var<=0);
    }

    void TimerCountdownMS(Timer* timer, unsigned int ms)
    {
        timer->systick_period = g_Timer.systick_period;
        timer->end_time = timer->systick_period + ms;
    }

    void TimerCountdown(Timer* timer, unsigned int sec)
    {
        timer->systick_period = g_Timer.systick_period;
        timer->end_time = timer->systick_period + sec*1000;    
    }

    int TimerLeftMS(Timer* timer)
    {
        long val = 0;
        timer->systick_period = g_Timer.systick_period;
        val = timer->end_time – timer->systick_period;
        return val;
    }
     

    定时器使用示例

    #include "MQTTClient.h"
    
    // 假设的 MQTT 客户端操作
    void mqtt_client_operation() {
        Timer timer;
        // 初始化定时器
        TimerInit(&timer);
    
        // 设置 5 秒的连接超时时间
        TimerCountdown(&timer, 5);
    
        // 模拟连接操作
        while (!TimerIsExpired(&timer)) {
            // 进行连接相关的操作
            // ...
    
            // 获取剩余时间
            int remaining_ms = TimerLeftMS(&timer);
            if (remaining_ms % 1000 == 0) {
                printf("连接操作还剩 %d 秒\n", remaining_ms / 1000);
            }
        }
    
        if (TimerIsExpired(&timer)) {
            printf("连接超时\n");
        }
    }

    作者:完成大叔

    物联沃分享整理
    物联沃-IOTWORD物联网 » MQTT在单片机中的移植:MQTTClient-C定时器功能详解

    发表回复