static void unsubscribeFromAcceptedAndRejected(uint8_t index) { char TemporaryTopicNameAccepted[MAX_SHADOW_TOPIC_LENGTH_BYTES]; char TemporaryTopicNameRejected[MAX_SHADOW_TOPIC_LENGTH_BYTES]; IoT_Error_t ret_val = SUCCESS; int16_t indexSubList; topicNameFromThingAndAction(TemporaryTopicNameAccepted, AckWaitList[index].thingName, AckWaitList[index].action, SHADOW_ACCEPTED); topicNameFromThingAndAction(TemporaryTopicNameRejected, AckWaitList[index].thingName, AckWaitList[index].action, SHADOW_REJECTED); indexSubList = findIndexOfSubscriptionList(TemporaryTopicNameAccepted); if((indexSubList >= 0)) { if(!SubscriptionList[indexSubList].isSticky && (SubscriptionList[indexSubList].count == 1)) { ret_val = aws_iot_mqtt_unsubscribe(pMqttClient, TemporaryTopicNameAccepted, (uint16_t) strlen(TemporaryTopicNameAccepted)); if(ret_val == SUCCESS) { SubscriptionList[indexSubList].isFree = true; } } else if(SubscriptionList[indexSubList].count > 1) { SubscriptionList[indexSubList].count--; } } indexSubList = findIndexOfSubscriptionList(TemporaryTopicNameRejected); if((indexSubList >= 0)) { if(!SubscriptionList[indexSubList].isSticky && (SubscriptionList[indexSubList].count == 1)) { ret_val = aws_iot_mqtt_unsubscribe(pMqttClient, TemporaryTopicNameRejected, (uint16_t) strlen(TemporaryTopicNameRejected)); if(ret_val == SUCCESS) { SubscriptionList[indexSubList].isFree = true; } } else if(SubscriptionList[indexSubList].count > 1) { SubscriptionList[indexSubList].count--; } } }
IoT_Error_t subscribeToShadowActionAcks(const char *pThingName, ShadowActions_t action, bool isSticky) { IoT_Error_t ret_val = SUCCESS; bool clearBothEntriesFromList = true; int16_t indexAcceptedSubList = 0; int16_t indexRejectedSubList = 0; Timer subSettlingtimer; indexAcceptedSubList = getNextFreeIndexOfSubscriptionList(); indexRejectedSubList = getNextFreeIndexOfSubscriptionList(); if(indexAcceptedSubList >= 0 && indexRejectedSubList >= 0) { topicNameFromThingAndAction(SubscriptionList[indexAcceptedSubList].Topic, pThingName, action, SHADOW_ACCEPTED); ret_val = aws_iot_mqtt_subscribe(pMqttClient, SubscriptionList[indexAcceptedSubList].Topic, (uint16_t) strlen(SubscriptionList[indexAcceptedSubList].Topic), QOS0, AckStatusCallback, NULL); if(ret_val == SUCCESS) { SubscriptionList[indexAcceptedSubList].count = 1; SubscriptionList[indexAcceptedSubList].isSticky = isSticky; topicNameFromThingAndAction(SubscriptionList[indexRejectedSubList].Topic, pThingName, action, SHADOW_REJECTED); ret_val = aws_iot_mqtt_subscribe(pMqttClient, SubscriptionList[indexRejectedSubList].Topic, (uint16_t) strlen(SubscriptionList[indexRejectedSubList].Topic), QOS0, AckStatusCallback, NULL); if(ret_val == SUCCESS) { SubscriptionList[indexRejectedSubList].count = 1; SubscriptionList[indexRejectedSubList].isSticky = isSticky; clearBothEntriesFromList = false; // wait for SUBSCRIBE_SETTLING_TIME seconds to let the subscription take effect init_timer(&subSettlingtimer); countdown_sec(&subSettlingtimer, SUBSCRIBE_SETTLING_TIME); while(!has_timer_expired(&subSettlingtimer)); } } } if(clearBothEntriesFromList) { if(indexAcceptedSubList >= 0) { SubscriptionList[indexAcceptedSubList].isFree = true; } else if(indexRejectedSubList >= 0) { SubscriptionList[indexRejectedSubList].isFree = true; } if(SubscriptionList[indexAcceptedSubList].count == 1) { aws_iot_mqtt_unsubscribe(pMqttClient, SubscriptionList[indexAcceptedSubList].Topic, (uint16_t) strlen(SubscriptionList[indexAcceptedSubList].Topic)); } } return ret_val; }
IoT_Error_t aws_iot_jobs_unsubscribe_from_job_messages( AWS_IoT_Client *pClient, char *topicBuffer) { return aws_iot_mqtt_unsubscribe(pClient, topicBuffer, (uint16_t)strlen(topicBuffer)); }