Internet of Fun – Demostrando el concepto IoT

big-bang-t3e23-jaestevan

En un artículo anterior, hacía una introducción del concepto de Internet of Things (IoT, Internet de las Cosas) y por qué iba a ser relevante en el futuro en multitud de procesos empresariales, procesos que inevitablemente van a llegar al mundo del ERP en mayor o menor medida.

Uno de los factores que, en mi opinión, van a hacer que estas prácticas se disparen en un futuro cercano es su accesibilidad. La facilidad de desarrollarlos y el bajo coste con el que se puede empezar a hacer cosas útiles y de eso estamos hablando, ¿Verdad?… de cosas 🙂

En la demostración que empieza con este post vamos a crear un ejemplo funcional sencillo para comprobar las posibilidades de las que disponemos en cada caso, y comprobar lo sencillo que puede ser investigar y crear prototipos que luego podremos convertir en sistemas reales. Utilizaremos materiales de bajo coste para hacer pruebas, que luego podremos convertir en sistemas reales con material industrial equivalente.

Este artículo contará por lo menos con tres partes (puede que más, si el tema interesa) teniendo en cuenta los que para mi son los tres boques de estas técnicas: Sistemas que van a generar la información (las “cosas” del IoT), los consumidores que harán uso de esta información, y los canales que nos permitirán capturar, almacenar y procesar la información generada.

grafico-iot-jaestevan

Productores (o símplemente… “cosas“)

Esta es posiblemente la parte más divertida del ejemplo. Podríamos haber utilizado un emulador o algún tipo de software para simularlo, pero es mucho más educativo utilizar realmente una “cosa” para el ejemplo. En mi caso he utilizado una Raspberry Pi 3 Model B por su facilidad de uso y porque podemos instalarle un Windows 10 IoT Core y programar desde Visual Studio tal y como estamos acostumbrados.

Raspberry Pi 3 Model B

Hay muchas más opciones, por supuesto. Diferentes precios, diferentes especificaciones y que soportan diferentes sistemas operativos y entornos de desarrollo. Algunas son más parecidas a un ordenador y otras son más placas de prototipado puro. Depende de nuestros gustos y necesidades. Estas son las más conocidas:

Además de una placa más o menos complicada y nuestro entorno de desarrollo favorito, necesitaremos también algunos componentes electrónicos, dependiendo de lo que queramos hacer. Se pueden encontrar multitud de kits de inicio para todas estas placas (casi siempre compatibles entre sí) pero suele ser más económico comprar los componentes sueltos en alguna tienda de barrio.

Para mi ejemplo voy a utilizar un sensor DHT11 que captura la temperatura y la humedad. Es un sensor muy barato (un par de euros), que no ofrece mucha precisión, pero suficiente para empezar. Programar este sensor en C# resulta más complicado de lo que pensaba en un principio debido a ciertas limitaciones de .NET en cuanto a controlar periodos de tiempo muy pequeños, así que me he basado en este ejemplo de hackster.io, que utiliza código C++ para leer del sensor y capturar las lecturas desde una aplicación universal de Windows. Es muy interesante:

De momento y para esta parte del artículo sólo he hecho una pequeña modificación. El proyecto original muestra las lecturas por pantalla, yo quiero que se guarden para poder usar la Raspberry sin conexión y después procesar los datos leídos cuando la conecte a la red. Estos son los cambios:

Nuevo struct para manejar los datos más fácilmente:

public struct TempSample
{
	public float Temperature;
	public float Humidity;
	public DateTimeOffset LastUpdated;
	public DateTime Timestamp;
 
	public string Json => JsonConvert.SerializeObject(this);
 
	public override string ToString() => String.Format("T: {0}, H: {1}", Temperature, Humidity);
 
	async public Task SaveFileAsync()
	{
		StorageFolder folder = await KnownFolders.DocumentsLibrary.CreateFolderAsync("TempSamples", CreationCollisionOption.OpenIfExists);
		StorageFile file = await folder.CreateFileAsync(Timestamp.ToString("yyyyMMdd-HHmmss-fff.json"), CreationCollisionOption.OpenIfExists);
		await FileIO.AppendTextAsync(file, this.Json);
	}
}

Modificado el proceso de lectura para guardar los datos en un fichero después de cada lectura:

// Fichero: DHT Solution / Sensors.OneWire / MainPage.xaml.cs
// https://github.com/porrey/dht/blob/master/source/Windows%2010%20IoT%20Core/DHT%20Solution/Sensors.OneWire/MainPage.xaml.cs
private async void _timer_Tick(object sender, object e)
{
	//...
 
	if (reading.IsValid)
	{
		this.TotalSuccess++;
		this.Temperature = Convert.ToSingle(reading.Temperature);
		this.Humidity = Convert.ToSingle(reading.Humidity);
		this.LastUpdated = DateTimeOffset.Now;
 
		this.OnPropertyChanged(nameof(SuccessRate));
 
		// JAEE - Begin
		TempSample sample = new TempSample
		{
			Temperature = this.Temperature,
			Humidity = this.Humidity,
			LastUpdated = this.LastUpdated,
			Timestamp = DateTime.Now
		};
 
		await sample.SaveFileAsync();
		// JAEE - End
	}
 
	//...
}

Y con esto tenemos nuestras medidas de temperatura guardadas en la tarjeta de memoria del dispositivo en cada lectura, en formato JSON. Así podremos ponerla a funcionar en cualquier sitio, sólo conectada a la electricidad (configurando nuestra aplicación para que se ejecute al inicio), sin necesidad de conectarla a internet:

 

Pero si no se conecta a internet, ¿entonces es Internet of Things o es sólo una Cosa? 🙂 La conectaremos en el siguiente artículo. Os daré una pista: IoT Hub throttling and you

jaestevan
Microsoft Dynamics AX MVP. Programador y consultor técnico de soluciones Microsoft Dynamics AX y Business Intelligence. Experiencia con Dynamics AX, SQL Server y lenguajes como VB6, .NET C#, PHP, Java, etc. para desarrollos de escritorio, PDA, sitios y servicios web, interfaces de integración, etc.