Programming interactions in collective adaptive systems by relying on attribute-based communication