static void mqttClient_connExpiryHndlr(le_timer_Ref_t timer) { mqttClient_t* clientData = le_timer_GetContextPtr(timer); int32_t rc = LE_OK; LE_ASSERT(clientData); rc = mqttClient_close(clientData); if (rc) { LE_ERROR("mqttClient_close() failed(%d)", rc); goto cleanup; } LE_DEBUG("<--- reconnect"); rc = mqttClient_connect(clientData); if (rc) { LE_ERROR("mqttClient_connect() failed(%d)", rc); goto cleanup; } cleanup: return; }
MqttReturnCode mqttClient_startPub(AJBMqttClient *client,MqttConfigure config,MqttDispatcher dispatcher){ newAJBMqttClient(client,config.username, config.password, config.clientid,config.cleansession); client->keepAlive = config.keepAlive; //default is 20s client->qos = 2; //default is QOS2 client->timout_ms = config.timeout_ms; //default is 2000ms client->aliveAttr = config.aliveAttr; MqttLog("%d-%d-%d-%d",client->aliveAttr.auto_con,client->aliveAttr.recon_int,client->aliveAttr.recon_max,client->aliveAttr.reconnecting); client->dispatcher = dispatcher; client->dispatcher.shouldReSubscribe = NULL; mqttClient_setDispatcher(client,dispatcher); client->keepworking = 1; mqttClient_connect(client,config.host,config.port); // client->keepworking = 0; strcpy(client->topic, config.topic); dispatcher.shouldReSubscribe = dispatcher.shouldReSubscribe; printf("%s\n",client->clientId); return 0; }
static int mqttClient_write(mqttClient_t* clientData, int length) { int bytes = length ? length:clientData->session.tx.bytesLeft; le_result_t rc = LE_OK; LE_ASSERT(clientData); clientData->session.cmdLen = length; if (clientData->session.sock == MQTT_CLIENT_INVALID_SOCKET) { rc = mqttClient_connect(clientData); if (rc) { LE_ERROR("mqttClient_connect() failed(%d)", errno); rc = LE_IO_ERROR; goto cleanup; } } else { while (bytes > 0) { mqttClient_dumpBuffer(clientData->session.tx.ptr, bytes); int sent = write(clientData->session.sock, clientData->session.tx.ptr, bytes); if (sent == -1) { if (errno == EAGAIN) { le_fdMonitor_Enable(clientData->session.sockFdMonitor, POLLOUT); clientData->session.tx.bytesLeft = bytes; LE_WARN("send blocked(%u)", clientData->session.tx.bytesLeft); goto cleanup; } else { LE_ERROR("write() failed(%d)", errno); rc = LE_IO_ERROR; goto cleanup; } } else { clientData->session.tx.ptr += sent; bytes -= sent; } } le_timer_Restart(clientData->session.pingTimer); clientData->session.tx.ptr = clientData->session.tx.buf; clientData->session.rx.ptr = clientData->session.rx.buf; } cleanup: return rc; }
static void mqttClient_cmdExpiryHndlr(le_timer_Ref_t timer) { mqttClient_t* clientData = le_timer_GetContextPtr(timer); int32_t rc = LE_OK; LE_ASSERT(clientData); if (clientData->session.cmdRetries < MQTT_CLIENT_MAX_SEND_RETRIES) { if (clientData->session.sock == MQTT_CLIENT_INVALID_SOCKET) { LE_DEBUG("<--- reconnect"); rc = mqttClient_connect(clientData); if (rc) { LE_ERROR("mqttClient_connect() failed(%d)", rc); goto cleanup; } } else { LE_DEBUG("<--- resend CMD(%u)", clientData->session.cmdRetries++); rc = mqttClient_write(clientData, clientData->session.cmdLen); if (rc) { LE_ERROR("mqttClient_write() failed(%d)", rc); goto cleanup; } } } else { LE_ERROR("maximum retries reached(%u)", MQTT_CLIENT_MAX_SEND_RETRIES); goto cleanup; } cleanup: return; }
MqttReturnCode mqttClient_start2(AJBMqttClient *client,MqttConfigure config,MqttDispatcher dispatcher){ newAJBMqttClient(client,config.username, config.password, config.clientid,config.cleansession); client->keepAlive = config.keepAlive; //default is 20s client->qos = 2; //default is QOS2 client->timout_ms = config.timeout_ms; //default is 2000ms client->aliveAttr = config.aliveAttr; // MqttLog("%d-%d-%d-%d",client->aliveAttr.auto_con,client->aliveAttr.recon_int,client->aliveAttr.recon_max,client->aliveAttr.reconnecting); // setWill(&client, "c/test1234567890/info", "this is a will"); client->dispatcher = dispatcher; client->dispatcher.shouldReSubscribe = NULL; mqttClient_setDispatcher(client,dispatcher); int raw = client->keepworking; client->keepworking = 1; mqttClient_connect(client,config.host,config.port); client->keepworking = raw; char topic[MAX_TOPIC_LEN]={}; getSuggestTopic(topic, client->clientId); if ((!config.disable_subscribe) || (client->cleanSession!=0)) { mqttClient_subscribe(client, topic, 2); } else{ MqttLog("[SUB %s] skip subscribe",client->clientId); } // mqttClient_subscribe(client, "c/lixiao-0612/info", 2); dispatcher.shouldReSubscribe = dispatcher.shouldReSubscribe; // client->keepRunning(client); return 0; }
MqttReturnCode mqttClient_reconnect(AJBMqttClient *client){ logToLocal(client->indexTag,log_erro_path,"[CONNECT reconnect] %s:%d ---> %s",client->host,client->port,client->clientId); return mqttClient_connect(client, client->host, client->port); }
static int mqttClient_startSession(mqttClient_t* clientData) { int rc = LE_OK; LE_ASSERT(clientData); memcpy(&clientData->session.config, &clientData->config, sizeof(clientData->config)); clientData->session.connTimer = le_timer_Create(MQTT_CLIENT_CONNECT_TIMER); if (!clientData->session.connTimer) { LE_ERROR("le_timer_Create() failed"); rc = LE_BAD_PARAMETER; goto cleanup; } rc = le_timer_SetHandler(clientData->session.connTimer, mqttClient_connExpiryHndlr); if (rc) { LE_ERROR("le_timer_SetHandler() failed(%d)", rc); goto cleanup; } rc = le_timer_SetMsInterval(clientData->session.connTimer, MQTT_CLIENT_CONNECT_TIMEOUT_MS); if (rc) { LE_ERROR("le_timer_SetMsInterval() failed(%d)", rc); goto cleanup; } rc = le_timer_SetContextPtr(clientData->session.connTimer, clientData); if (rc) { LE_ERROR("le_timer_SetContextPtr() failed(%d)", rc); goto cleanup; } clientData->session.cmdTimer = le_timer_Create(MQTT_CLIENT_COMMAND_TIMER); if (!clientData->session.cmdTimer) { LE_ERROR("le_timer_Create() failed"); rc = LE_BAD_PARAMETER; goto cleanup; } rc = le_timer_SetHandler(clientData->session.cmdTimer, mqttClient_cmdExpiryHndlr); if (rc) { LE_ERROR("le_timer_SetHandler() failed(%d)", rc); goto cleanup; } rc = le_timer_SetMsInterval(clientData->session.cmdTimer, MQTT_CLIENT_CMD_TIMEOUT_MS); if (rc) { LE_ERROR("le_timer_SetMsInterval() failed(%d)", rc); goto cleanup; } rc = le_timer_SetContextPtr(clientData->session.cmdTimer, clientData); if (rc) { LE_ERROR("le_timer_SetContextPtr() failed(%d)", rc); goto cleanup; } clientData->session.pingTimer = le_timer_Create(MQTT_CLIENT_PING_TIMER); if (!clientData->session.pingTimer) { LE_ERROR("le_timer_Create() failed"); rc = LE_BAD_PARAMETER; goto cleanup; } rc = le_timer_SetHandler(clientData->session.pingTimer, mqttClient_pingExpiryHndlr); if (rc) { LE_ERROR("le_timer_SetHandler() failed(%d)", rc); goto cleanup; } rc = le_timer_SetMsInterval(clientData->session.pingTimer, clientData->session.config.keepAlive * 1000); if (rc) { LE_ERROR("le_timer_SetMsInterval() failed(%d)", rc); goto cleanup; } rc = le_timer_SetRepeat(clientData->session.pingTimer, 0); if (rc) { LE_ERROR("le_timer_SetRepeat() failed(%d)", rc); goto cleanup; } rc = le_timer_SetContextPtr(clientData->session.pingTimer, clientData); if (rc) { LE_ERROR("le_timer_SetContextPtr() failed(%d)", rc); goto cleanup; } LE_INFO("connect(%s:%d)", clientData->session.config.brokerUrl, clientData->session.config.portNumber); rc = mqttClient_connect(clientData); if (rc) { LE_ERROR("mqttClient_connect() failed(%d)", rc); goto cleanup; } cleanup: if (rc) { LE_INFO("start session failed"); mqttClient_SendConnStateEvent(false, rc, -1); } return rc; }