int MQTTUnsubscribe (Client *c, const char *topicFilter) { int rc = FAILURE; int len = 0; Timer timer; MQTTString topic = MQTTString_initializer; topic.cstring = (char*) topicFilter; InitTimer (&timer); countdown_ms (&timer, c->command_timeout_ms); if (!c->isconnected) goto exit; if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0) goto exit; if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet goto exit; // there was a problem if (waitfor(c, UNSUBACK, &timer) == UNSUBACK) { unsigned short mypacketid; // should be the same as the packetid above if (MQTTDeserialize_unsuback(&mypacketid, c->readbuf, c->readbuf_size) == 1) rc = 0; } else rc = FAILURE; // timed out - no UNSUBACK received exit: return rc; }
int MQTTUnsubscribe(MQTTClient* c, const char* topicFilter) { int rc = FAILURE; Timer timer; MQTTString topic = MQTTString_initializer; topic.cstring = (char *)topicFilter; int len = 0; #if defined(MQTT_TASK) FreeRTOS_MutexLock(&c->mutex); #endif if (!c->isconnected) goto exit; TimerInit(&timer); TimerCountdownMS(&timer, c->command_timeout_ms); if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0) goto exit; if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet goto exit; // there was a problem if (waitfor(c, UNSUBACK, &timer) == UNSUBACK) { unsigned short mypacketid; // should be the same as the packetid above if (MQTTDeserialize_unsuback(&mypacketid, c->readbuf, c->readbuf_size) == 1) rc = 0; } else rc = FAILURE; exit: #if defined(MQTT_TASK) FreeRTOS_MutexUnlock(&c->mutex); #endif return rc; }
int MQTTUnsubscribe(MQTTClient* c, const char* topicFilter) { int rc = MQTT_FAILURE; Timer timer; MQTTString topic = MQTTString_initializer; topic.cstring = (char *)topicFilter; int len = 0; platform_mutex_lock(&c->mutex); if (!c->isconnected) goto exit; platform_timer_init(&timer); platform_timer_countdown(&timer, c->command_timeout_ms); if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0) goto exit; if ((rc = sendPacket(c, len, &timer)) != MQTT_SUCCESS) // send the subscribe packet goto exit; // there was a problem if (waitfor(c, UNSUBACK, &timer) == UNSUBACK) { unsigned short mypacketid; // should be the same as the packetid above if (MQTTDeserialize_unsuback(&mypacketid, c->readbuf, c->readbuf_size) == 1) rc = 0; } else { rc = MQTT_CONNECTION_LOST; } exit: platform_mutex_unlock(&c->mutex); return rc; }
int MQTTUnsubscribe(MQTTClient *c, const char *topicFilter) { int rc = FAILURE; Timer timer; MQTTString topic = MQTTString_initializer; topic.cstring = (char *)topicFilter; int len = 0; #if defined(MQTT_TASK) MutexLock(&c->mutex); #endif if (!c->isconnected) { goto exit; } TimerInit(&timer); TimerCountdownMS(&timer, c->command_timeout_ms); if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0) { goto exit; } if ((rc = sendPacket(c, len, &timer)) != SUCCESS) { // send the subscribe packet goto exit; // there was a problem } if (waitfor(c, UNSUBACK, &timer) == UNSUBACK) { unsigned short mypacketid; // should be the same as the packetid above if (MQTTDeserialize_unsuback(&mypacketid, c->readbuf, c->readbuf_size) == 1) { /* remove the subscription message handler associated with this topic, if there is one */ MQTTSetMessageHandler(c, topicFilter, NULL); } } else { rc = FAILURE; } exit: if (rc == FAILURE) { MQTTCloseSession(c); } #if defined(MQTT_TASK) MutexUnlock(&c->mutex); #endif return rc; }
int MQTTUnsubscribe(Client* c, const char* topicFilter) { int rc = FAILURE; MQTTString topic = MQTTString_initializer; topic.cstring = (char *)topicFilter; int len = 0; if (!c->isconnected) goto exit; if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0) goto exit; if ((rc = sendPacket_ev(c, len)) != SUCCESS) // send the subscribe packet goto exit; // there was a problem exit: return rc; }
int MQTTUnsubscribe(Client* c, const char* topicFilter) { int rc = FAILURE; Timer timer; MQTTString topic = MQTTString_initializer; topic.cstring = (char *)topicFilter; int len = 0; int i=0; InitTimer(&timer); countdown_ms(&timer, c->command_timeout_ms); if (!c->isconnected) goto exit; if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0) goto exit; if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the unsubscribe packet goto exit; // there was a problem if (waitfor(c, UNSUBACK, &timer) == UNSUBACK) { unsigned short mypacketid; // should be the same as the packetid above if (MQTTDeserialize_unsuback(&mypacketid, c->readbuf, c->readbuf_size) == 1){ for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i){ if (c->messageHandlers[i].topicFilter != 0 && (strcmp(c->messageHandlers[i].topicFilter, topicFilter)==0)){ c->messageHandlers[i].topicFilter = 0; // We dont want to break here, if the same topic is registered with 2 callbacks. Unlikeley scenario. } } rc = 0; } } else rc = FAILURE; exit: DeInitTimer(&timer); //STM: added this line return rc; }
int mqttClient_unsubscribe(mqttClient_t* clientData, const char* topicFilter) { MQTTString topic = MQTTString_initializer; int rc = LE_OK; LE_ASSERT(clientData); if (!clientData->session.isConnected) { LE_WARN("not connected"); goto cleanup; } topic.cstring = (char *)topicFilter; int len = MQTTSerialize_unsubscribe(clientData->session.tx.buf, sizeof(clientData->session.tx.buf), 0, mqttClient_getNextPacketId(clientData), 1, &topic); if (len <= 0) { LE_ERROR("MQTTSerialize_unsubscribe() failed(%d)", len); rc = LE_BAD_PARAMETER; goto cleanup; } rc = mqttClient_write(clientData, len); if (rc) { LE_ERROR("mqttClient_write() failed(%d)", rc); goto cleanup; } rc = le_timer_Start(clientData->session.cmdTimer); if (rc) { LE_ERROR("le_timer_Start() failed(%d)", rc); goto cleanup; } cleanup: return rc; }