/** * @brief MQTT协议测试主循环 * @retval None **/ void MQTT_Loop(void) { static int timeout_count = 0; int publish_state = 0; int exit = 0; int j = 0; /*初始化MQTT上下文,在该api内部配置了设备ID等信息*/ if(MqttSample_Init(smpctx) < 0) { return; } printf("\r\ndevice id:%s\r\n", MQTT_DEVICE_ID); printf("we publish topic:%s %s %s\r\n",DS_TO_PUBLISH,DS_TO_PUBLISH_T,DS_TO_PUBLISH_RH); printf("connect to mqtt server\r\n"); /*发送MQTT连接请求报文*/ MqttSample_CmdConnect(smpctx); printf("\r\n"); mDelay(2000); Mqtt_RecvPkt(smpctx->mqttctx); mDelay(2000); /*发送MQTT订阅topic报文*/ MqttSample_CmdSubscribe(smpctx);//开机订阅 printf("\r\n"); mDelay(2000); Mqtt_RecvPkt(smpctx->mqttctx); printf("begin loop\n"); /*进入主循环*/ while(!exit) { j++; if(j == 3) { //MqttSample_CmdPublish(smpctx,TIME_OUT); /*周期性发布温湿度和一个状态数据,状态每次取反*/ publish_state = MqttSample_CmdPublishNormal(smpctx, TIME_OUT); if(publish_state < 0) { timeout_count++; if(timeout_count == 5) { timeout_count = 0; /*you can do some thing*/ } } j = 0; } if(Mqtt_RecvPkt(smpctx->mqttctx)<0) { smpctx->publish_state=0; } printf("\r\n"); mDelay(100); } /*reclaim the resource防止内存泄露*/ MqttBuffer_Destroy(smpctx->mqttbuf); Mqtt_DestroyContext(smpctx->mqttctx); printf("bye...\n"); return; }
static int MqttSample_HandleSocket(struct MqttSampleContext *ctx, uint32_t events) { struct epoll_event evt[1]; evt->data.fd = ctx->mqttfd; evt->events = EPOLLIN; if(events & EPOLLIN) { while(1) { int err; err = Mqtt_RecvPkt(ctx->mqttctx); if(MQTTERR_ENDOFFILE == err) { printf("The connection is disconnected.\n"); close(ctx->mqttfd); epoll_ctl(ctx->epfd, EPOLL_CTL_DEL, ctx->mqttfd, NULL); ctx->mqttfd = -1; return 0; } if(MQTTERR_IO == err) { if((EAGAIN == errno) || (EWOULDBLOCK == errno)) { break; } printf("Send TCP data error: %s.\n", strerror(errno)); return -1; } if(MQTTERR_NOERROR != err) { printf("Mqtt_RecvPkt error is %d.\n", err); return -1; } } } if(events & EPOLLOUT) { if(-1 != ctx->sendedbytes) { int bytes = Mqtt_SendPkt(ctx->mqttctx, ctx->mqttbuf, ctx->sendedbytes); if(bytes < 0) { return -1; } else { ctx->sendedbytes += bytes; if(ctx->sendedbytes == ctx->mqttbuf->buffered_bytes) { MqttBuffer_Reset(ctx->mqttbuf); ctx->sendedbytes = -1; } else { evt->events |= EPOLLOUT; } } } } epoll_ctl(ctx->epfd, EPOLL_CTL_MOD, ctx->mqttfd, evt); return 0; }
int Recv() { return Mqtt_RecvPkt(m_ctx); }