Если все устройства находятся в одной локальной сети, вы можете просто заставить их обнаруживать друг друга с помощью широковещательного или многоадресного UDP, а затем (когда они знают IP-адреса друг друга) обмениваться данными друг с другом напрямую либо через UDP, либо по TCP. (разумеется, количество требуемых прямых TCP-соединений очень быстро увеличивается с увеличением количества устройств, поэтому оно будет масштабироваться только до определенной степени. UDP может масштабироваться и дальше, поскольку не требуется устанавливать соединение между каждой парой устройства).
Реальная проблема заключается в том, что (как это возможно) устройства находятся в разных местах в Интернете, и некоторые или все из них находятся за NAT и межсетевыми экранами. В этом случае единственное, на что вы можете положиться - это способность устройств устанавливать исходящее TCP-соединение, и в этом случае вам почти необходим сервер для подключения к ним, поскольку они не смогут подключаться напрямую к каждому из них. другие в большинстве случаев (что NAT / межсетевые экраны будут фильтровать входящие пакеты TCP-соединения по соображениям безопасности).