Siempre es bueno contar con los SDK adecuados para trabajar y en el caso del IoT Hub de Azure hay muchísimos SDKs pero siempre es bueno contar con la manera más directa de trabajar que es el API REST además de que es de esta manera que garantizas por completo la posibilidad de implementar los escenarios que quieras sin tener que preocuparte por cuestiones de plataforma.
Requisitos del API REST de IoT Hub
Lo que requieres para poder enviar telemetría desde el API REST es naturalmente tener creado un IoT Hub para utilizar uno de sus dispositivos como canal de envío.
También necesitas la URL de acceso, para componerla, necesitas los siguiente.
https://<nombre de tu hub>.azure-devices.net/devices/<nombre de tu dispositivo>/messages/events?api-version=2016-02-03
El resultado sería algo como esto:
https://hubcasa.azure-devices.net/devices/dispositivoCasa/messages/events?api-version=2016-02-03
Después de tener la URL, necesitas tener un token de acceso para confirmar que tienes autorización para acceder al hub, el token se compone de lo siguiente.
SharedAccessSignature sr=<nombre de tu hub>.azure-devices.net%2Fdevices%2F<nombre de tu dispositivo>&sig=<firma del dispositivo>&se=1505405813
Para obtener esto, simplemente descarga el Device Explorer, una herramienta súper útil para todo lo que tiene que ver con el iot Hub, puedes descargarlo desde aquí.
Obtener mi SAS Token
En el explorador de dispositivos, una vez que hayas agregado tu Hub, podrás crear dispositivos desde ahí, con los dispositivos ya creados podrás entonces acceder fácilmente a la SAS.
Muy bien, ya tienes tus dos requisitos indispensables, podremos continuar entonces.
La aplicación con C#
Comienza por crear tres variables globales a cuyos valores después puedas cambiar con facilidad.
static string iotHub = "nombre de tu hub"; static string deviceId = "nombre de tu dispositivo"; static string api = "2016-02-03"; |
El ejemplo que yo hice fue con una aplicación de consola, así que en mi función Main agregué lo necesario para lograr el ingreso de información.
Console.WriteLine("Escribe el comando a enviar"); var receivedString = Console.ReadLine(); string[] handledMessage = receivedString.Split(','); PostRESTIoT(handledMessage[0], handledMessage[1]); |
Crea una clase y agrega las tres propiedades requeridas para enviar un mensaje a este dispositivo.
public class IOTMessage { public string Timestamp { get; set; } public string lightNumber { get; set; } public string lightStatus { get; set; } } |
Para este ejemplo se me ocurrió utilizar la misma mecánica que utilizo en mi proyecto de automatización de luces. Así que en mi caso pude crear dos parametros únicamente, es obvio que tú podrás modificar a tu gusto lo que quieras.
private static void PostRESTIoT(string number, string status) { IOTMessage body = new IOTMessage { Timestamp = DateTime.Now.ToString(), lightNumber = number, lightStatus = status }; string restUri = String.Format("https://{0}.azure-devices.net/devices/{1}/messages/events?api-version={2}", iotHub, deviceId, api); string sas = "SharedAccessSignature sr=secondhubcasa.azure-devices.net%2Fdevices%2FmaquinaCasa&sig=pXYSfn9OM5PvglTCuRXvg2=1505"; HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", sas); var content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); var result = client.PostAsync(restUri, content).Result; Console.WriteLine(String.Format("Tu luz {0}, tiene el estado {1}", number, status)); } |
Nota que debes crear primero lo que vas a crear, después con las llaves de acceso crearás tanto la dirección de acceso como el encabezado de autenticación requeridos.
Solo envía el archivo ahora con un formato JSON y quedarás listo para poder enviar de manera directa los mensajes que necesitas. ¡Muy fácil!