**Description**

        Retrieve the device shadow JSON document from AWS IoT by publishing an empty JSON document to the 
        corresponding shadow topics. Shadow response topics will be subscribed to receive responses from 
        AWS IoT regarding the result of the get operation. Retrieved shadow JSON document will be available 
        in the registered callback. If no response is received within the provided timeout, a timeout 
        notification will be passed into the registered callback.

        **Syntax**

        .. code:: python

          # Retrieve the shadow JSON document from AWS IoT, with a timeout set to 5 seconds
          BotShadow.shadowGet(customCallback, 5)

        **Parameters**

        *srcCallback* - Function to be called when the response for this shadow request comes back. Should 
        be in form :code:`customCallback(payload, responseStatus, token)`, where :code:`payload` is the 
        JSON document returned, :code:`responseStatus` indicates whether the request has been accepted, 
        rejected or is a delta message, :code:`token` is the token used for tracing in this request.

        *srcTimeout* - Timeout to determine whether the request is invalid. When a request gets timeout, 
        a timeout notification will be generated and put into the registered callback to notify users.

        **Returns**

        The token used for tracing in this shadow request.

def shadowGet(self, srcCallback, srcTimeout):
        """
        **Description**

        Retrieve the device shadow JSON document from AWS IoT by publishing an empty JSON document to the 
        corresponding shadow topics. Shadow response topics will be subscribed to receive responses from 
        AWS IoT regarding the result of the get operation. Retrieved shadow JSON document will be available 
        in the registered callback. If no response is received within the provided timeout, a timeout 
        notification will be passed into the registered callback.

        **Syntax**

        .. code:: python

          # Retrieve the shadow JSON document from AWS IoT, with a timeout set to 5 seconds
          BotShadow.shadowGet(customCallback, 5)

        **Parameters**

        *srcCallback* - Function to be called when the response for this shadow request comes back. Should 
        be in form :code:`customCallback(payload, responseStatus, token)`, where :code:`payload` is the 
        JSON document returned, :code:`responseStatus` indicates whether the request has been accepted, 
        rejected or is a delta message, :code:`token` is the token used for tracing in this request.

        *srcTimeout* - Timeout to determine whether the request is invalid. When a request gets timeout, 
        a timeout notification will be generated and put into the registered callback to notify users.

        **Returns**

        The token used for tracing in this shadow request.

        """
        with self._dataStructureLock:
            # Update callback data structure
            self._shadowSubscribeCallbackTable["get"] = srcCallback
            # Update number of pending feedback
            self._shadowSubscribeStatusTable["get"] += 1
            # clientToken
            currentToken = self._tokenHandler.getNextToken()
            self._tokenPool[currentToken] = Timer(srcTimeout, self._timerHandler, ["get", currentToken])
            self._basicJSONParserHandler.setString("{}")
            self._basicJSONParserHandler.validateJSON()
            self._basicJSONParserHandler.setAttributeValue("clientToken", currentToken)
            currentPayload = self._basicJSONParserHandler.regenerateString()
        # Two subscriptions
        if not self._isPersistentSubscribe or not self._isGetSubscribed:
            self._shadowManagerHandler.basicShadowSubscribe(self._shadowName, "get", self.generalCallback)
            self._isGetSubscribed = True
            self._logger.info("Subscribed to get accepted/rejected topics for deviceShadow: " + self._shadowName)
        # One publish
        self._shadowManagerHandler.basicShadowPublish(self._shadowName, "get", currentPayload)
        # Start the timer
        self._tokenPool[currentToken].start()
        return currentToken