Ciao,
da quanto ho capito a differenza dell'http classico con SignalR è il server che contatta i client per inviare messaggi.
Non precisamente.
Anche nel caso di SignalR è il client a iniziare la connessione con il server. Questa connessione è persistente, cioè resta aperta finché il client è connesso e permette ad entrambe le parti di scambiarsi messaggi liberamente.
Quello che non mi è chiaro però è come fa il server a sapere quali client sono in attesa.
SignalR, lato server, mantiene internamente un elenco dei client connessi.
Se io volessi invece far arrivare un messaggio ad un altro client, ad esempio una scheda raspberry collegata ad internet, come dovrei fare?
Usando i gruppi, ma procediamo per gradi.
Ogni volta che un client si collega, gli viene assegnato un ConnectionId. Questo valore non è predicibile, quindi se si collegano 10 client, tu non puoi sapere quale di quelli è la raspberry PI.
Bisogna che la raspberry PI dica qualcosa di sé stessa al server. Per esempio, potrebbe chiedere di unirsi a un gruppo dal nome noto, come per esempio un GUID che la rappresenta. Il GUID può essere totalmente arbitrario o
calcolato.
Tu nel database del server avrai una tabella "dispositivi" che mantiene la corrispondenza tra quel GUID e la raspberry pi. Se hai 10 raspnerry pi, ognuna avrà il proprio GUID univoco.
Quando ti colleghi tu dal browser, dovrai mostrare nella pagina web l'elenco dei dispositivi. Quando ne scegli uno, ti unirai al gruppo che come nome porta il GUID relativo al dispositivo. A questo punto, dato che sia tu e sia la raspberry pi siete collegati allo stesso gruppo, vi potete scambiare messaggi.
Ecco la documentazione sui gruppo di SignalR per ASP.NET Core.
https://docs.microsoft.com/it-it/aspnet/core/signalr/groups?view=aspnetcore-2.2Oppure, se è per utilizzo professionale, potresti valutare un servizio apposito come IoT Hubs di Azure che ha tante funzionalità specifiche per i dispositivi IoT.
https://azure.microsoft.com/it-it/services/iot-hub/ciao,
Moreno