Architectural Patterns and Techniques for Developing IoT Solutions