Model-driven engineering of middleware-based ubiquitous services