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;
}
05-22
3001
