  Software developers usually start coding an application with no formal
architecture in mind and relying on intuition and experience instead of on
well-known design patters. A different approach is recommended for the
development of IoT smart applications due to its high complexity that combines
sensors, actuators, communication technologies, and big data analytics, as well
as its distributed nature that spans for different layers of field, fog, and
cloud infrastructure. Literature reports many experiences of software
development for IoT smart applications. However, architectural solutions are
presented with no rationale for the choice of software components and the way
they relate to each other. This paper proposes a classification for software
components and their relationships in order to model a software architecture
for a particular IoT smart application. Three smart applications for cities,
buildings, and agriculture were selected as examples of using some components,
connectors, and well-known design patterns. Finally, the problems and
challenges involved in the choice of software architectures for IoT are
discussed.
