<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def _call_rpc(self, header):
 """Call an RPC given a header and possibly a previously sent payload Args: header (bytearray):
 The RPC header we should call """


        length, _, cmd, feature, address = struct.unpack("<BBBBB", bytes(header))
        rpc_id = (feature << 8) | cmd

        payload = self.rpc_payload[:length]

        self._logger.debug("Calling RPC %d:%04X with %s", address, rpc_id, binascii.hexlify(payload))

        exception = None
        response = None

        try:
            response = await self.send_rpc(self.CLIENT_ID, str(self.device.iotile_id), address, rpc_id, bytes(payload), timeout=30.0)
        except VALID_RPC_EXCEPTIONS as err:
            exception = err
        except Exception as err:
            self._logger.exception("Error calling RPC %d:%04X", address, rpc_id)
            exception = err

        status, response = pack_rpc_response(response, exception)
        resp_header = struct.pack("<BBBB", status, 0, 0, len(response))

        await self._send_notification(self.ReceiveHeaderHandle, resp_header)

        if len(response) > 0:
            await self._send_notification(self.ReceivePayloadHandle, response)