mqtt_receive

void mqtt_receive(void *pvParameters)
{
    int32_t buffer_len = sizeof(buffer);
    int32_t type;
    fd_set readfd;
    fd_set errofds;
    struct timeval tv; // 等待时间
    tv.tv_sec = 4;
    tv.tv_usec = 0;
    int ret = 0;
    int recv_ret = 0;

MQTT_RECEIVE_START:
    // 开始连接
    Client_Connect();

    Para_Packet_New = 0;

    // 获取当前滴答,作为心跳包起始时间
    curtick = xTaskGetTickCount();

    while (1)
    {
        if (Para_Packet_New == 1)
        {
            goto MQTT_RECEIVE_CLOSE;
        }

        mqtt_connected = 1;

        // 推送消息
        FD_ZERO(&readfd);
        FD_SET(MQTT_Socket, &readfd);
        FD_ZERO(&errofds);
        FD_SET(MQTT_Socket, &errofds);

        // 等待可读事件
        int ret = select(MQTT_Socket + 1, &readfd, NULL, &errofds, &tv);

        // if (ret > 0 )
        if (FD_ISSET(MQTT_Socket, &readfd) != 0)
        {
            memset(buffer, '\0', sizeof(buffer));

            recv_ret = recv(MQTT_Socket, &buffer[0], buffer_len, 0);

            if (recv_ret <= 0)
            {
                goto MQTT_RECEIVE_CLOSE;
            }

            if (recv_ret > 0)
            {
                curtick = xTaskGetTickCount();

                int index = 0;
                int k = 0;

                char *ret = NULL;

                for (k = 0; k < 20; k++)
                {
                    ret = strstr(buffer + k, Topic);

                    if (ret != NULL)
                    {
                        break;
                    }
                }

                if (ret != NULL)
                {
                  index = strlen(Topic) + 1 + k;

                  decode_action((char*)&buffer[index], SN);
                }
            }
        }
        else
        {
            // 这里主要目的是定时向服务器发送PING保活命令
            uint32_t elapse_tick = xTaskGetTickCount() - curtick;

            if (elapse_tick > (MQTT_PING_INTERVAL_TIME * 1000))
            {
                curtick = xTaskGetTickCount();

                int z = MQTT_PingReq(MQTT_Socket);

                char log_str[50];
                memset(log_str, '\0', sizeof(log_str));

                if (z < 0)
                {
                    sprintf(log_str, "MQTT_PingReq return %d\n", z);
                    uart_printf(log_str, strlen(log_str));
                    // 重连服务器
                    uart_printf("Failed to send a keep-alive ping...\n", strlen("Failed to send a keep-alive ping...\n"));

                    if (++mqtt_pingreq_fail_cnt >= 3)
                    {
                        mqtt_pingreq_fail_cnt = 0;
                        goto MQTT_RECEIVE_CLOSE;
                    }
                }
                else
                {
                    mqtt_pingreq_fail_cnt = 0;
                    // 心跳成功
                    uart_printf("Succeeded to send a keep-alive ping...\n", strlen("Succeeded to send a keep-alive ping...\n"));
                }
            }
        }
    }

MQTT_RECEIVE_CLOSE:
    // 关闭链接
    mqtt_connected = 0;
    transport_close();
    // 重新链接服务器
    goto MQTT_RECEIVE_START;
}
void Aliyun(void) { static int retryCount = 0; // 全局或静态变量 static const int MAX_RETRY = 3; // 1、 WIFI模块连接服务器 if (IOT_state == IOT_RESET) { WIFI_Clean(); for (retryCount = 0; retryCount < MAX_RETRY; retryCount++) { if (0 == WIFI_Connect()) { IOT_state = WIFI_OK; printf("第%d次重连成功", retryCount + 1); break; } delay_ms(1000); // 增加重连间隔 } if (retryCount >= MAX_RETRY) { printf("严重错误:无法连接WiFi"); // 进入错误处理流程 } } /******************************************************************************************************/ // 2、发送连接报文 if (WIFI_OK == IOT_state) { MQTT_Connect( "client123", // clientid "user", // username "pass", // password "devices/status", // will_topic "offline", // will_message 1, // will_qos 1, // will_retain 1, // will_flag 1, // clean_session 1, // user_name_flag 1, // pass_word_flag 60 // keep_alive ); WIFI_Clean(); } // 3、发送订阅报文 if (Connect_OK == IOT_state) { MQTT_Subscribe(0x01, SET_TOPIC, 0, 1); // 发送订阅报文 WIFI_Clean(); } /******************************************************************************************************/ // 一直检测服务器下发的其他报文 if (USART3_RxBuff[0] != 0) { unsigned short id = 0; char qos, dup, retain; mqtt_debug(MQTT_RxBUFF, MQTT_RxCounter, "\r\n\r\n* 接收到服务器数据:%x *\r\n"); switch (USART3_RxBuff[0] >> 4) { case 2: // 2号控制报文:CONNACK – 确认连接请求 if (1 == MQTT_ConnAck()) { mqtt_debug(MQTT_RxBUFF, MQTT_RxCounter, "\r\n* 连接成功 *\r\n"); IOT_state = Connect_OK; } break; case 3: // 3号控制报文:PUBLISH – 发布消息 printf("\r\n* 接收到服务器下发 30 报文 * \r\n"); MQTT_ReceivelPublish(&dup, &qos, &retain, &id, MQTT_RxBUFF); if(qos == 1) { MQTT_PubAck(id); // 回复 PubAck 报文 QoS1 回复 } if(qos == 2) { // MQTT_PubRec(id); // 回复 PubRec 报文 QoS2 第一步 } break; case 4: // 4号控制报文:PUBACK – 发布确认 printf("\r\n* QoS1等级 报文发布成功 * \r\n"); break; case 5: // 5号控制报文:PUBREC – 发布收到(QoS 2 ,第一步) // printf("\r\n* PUBACK –发布确认 * \r\n"); break; case 6: // 6号控制报文:PUBREL – 发布释放(QoS 2 ,第二步) // printf("\r\n* PUBACK –发布确认 * \r\n"); break; case 7: // 7号控制报文:PUBCOMP – 发布 完成(QoS 2 ,第三步) // printf("\r\n* PINGRESP 心跳响应 S -> C * \r\n"); break; case 9: // 9号控制报文:SUBACK – 订阅确认 if (1 == MQTT_SubAck(0xCCCC)) { mqtt_debug(MQTT_RxBUFF, MQTT_RxCounter, "\r\n* 订阅成功 *\r\n"); IOT_state = Subscribe_OK; // 成功发送订阅报文 } break; case 11: // 11号控制报文:UNSUBACK – 取消订阅确认 printf("\r\n* 取消订阅成功 * \r\n"); break; case 13: // 13号控制报文:PINGRESP – 心跳响应 printf("\r\n* 取消订阅成功 * \r\n"); break; default: break; } WIFI_Clean(); } } 完善这段代码
最新发布
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值