Cargando...

IoT y Google Cloud Parte 2

Con Google App Engine, se pueden publicar aplicaciones web sin el problema de planear y diseñar una infraestructura que la atienda, y sólo concentrarnos en el desarrollo de la aplicación.

Este post es una continuación a IoT y Google Cloud Parte 1

La instancia de SQL

Como el objetivo planteado es recopilar las lecturas hechas por el componente IoT, lo primero es crear la base de datos, así que usaré el Google Cloud SQL, sobre un motor de MySQL.

Google Cloud IoT

Ahora, necesito crear la base de datos y tablas en la instancia que he creado, para ello voy a permitir una conexión remota desde la IP que me da salida de internet, y de paso asegurar que cualquier app dentro de mi proyecto también se podrá conectar.

Google Cloud IoT

Así, desde mi consola podré conectarme a la instancia utilizando la IP pública que Google le ha asignado y poder crear la base de datos, las tablas y el usuario dueño de las mismas, es decir, lo típico para almacenar los datos.

Google Cloud IoT

Google Cloud IoT

La API REST

Para el backend voy a utilizar Node.js, ya que con express y knex, voy a poder desarrollar muy rápido la aplicación; así que es momento de configurar la instancia. 

La Google Cloud App Engine, tiene dos entornos disponibles, en el entorno flexible siempre se tiene una cantidad mínima de instancias que atienden las peticiones y se van escalando conforme el tráfico aumenta.

En el entorno estándar se cuenta con una capa gratuita, ya que, si no hay peticiones, las instancias llegan a cero, a cambio de la limitante que represnta el poder trabajar sólo con la versión 10 y 12 de Node.js; este será el entorno que voy a usar, claro, por la posibilidad de gratuidad.

Como yo ya tengo montado el SDK de Google Cloud, voy a usar la consola para crear la app en mi proyecto con el comando:

gcloud app create --project=[YOUR_PROJECT_ID]

Este comando hace una serie de preguntas respecto a tu app, y con ello se crea la estructura básica del código. El archivo importante a revisar es el YAML que servirá para levantar el código en la nube, pues como con cualquier otro servicio que se levanta desde un contenedor, será desde ahí donde podamos definir variables de entorno y otras características necesarias para la ejecución, por ello agregaré ahí los datos de conexión a mi instancia de Google Cloud SQL.

Google Cloud IoT

Ahora necesito instalar las dependencias que necesito:

npm install express knex mysql moment --save

Como ya podemos conectar directo a nuestra instancia de SQL desde nuestra IP, podría hacer la conexión directa desde el código, pero, sólo como algo didáctico y referencia, voy a distinguir si mi ambiente está en producción o no para conectar con la instancia o una base local en el equipo de desarrollo:

const connect = () => {
	const configDB = {
		user: process.env.SQL_USER,
		password: process.env.SQL_PASSWORD,
		database: process.env.SQL_DATABASE,
	};

	if (
	process.env.INSTANCE_CONNECTION_NAME &&
	process.env.NODE_ENV === 'production'
	) {
	configDB.socketPath = `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`;
	} else {
		configDB.user = 'iot';
		configDB.password = 'password';
		configDB.database = 'iot';
		configAPP.secret = 'tokendev';
	}

	// Connect to the database
	const knex = Knex({
		client: 'mysql',
		connection: configDB,
	});

	return knex;
};

Lo que resta es hacer el punto en que se van a registrar las temperaturas desde mi componente IoT, para facilitar esta guía en el momento de conectar el componente a la API, lo haré por un método GET, desde el que reciba la lectura:

app.get('/temperatura', async (req, res, next) => {
	const temperatura = {
		fecha: new Date(),
		temperatura: req.query.valor
	};

	try {
		await addTemperatura(knex, temperatura);

		// Query the last 10 visits from the database.
		const temperaturas = await getTemperatura(knex);
		res
			.status(200)
			.set('Content-Type', 'application/json')
			.send({respuesta: 'ok'})
			.end();
	} catch (err) {
		next(err);
	}
});

Inocando una función que utilice knex para hacer el insert con el objeto de datos que he creado:

const addTemperatura = (knex, temperatura) => {
	return knex('temperaturas').insert(temperatura);
};

Con esto el código base de mi app está completo, así que ahora sólo resta hacer el deploy en la nube, por lo que desde la consola ejecuto:

gcloud app deploy

Lo que hará que mi API esté disponible, y esto lo puedo comprobar accesando a mi consola de Google Cloud y revisando que ahora cuento con una versión publicada de mi app y que es la que atiende todas las peticiones

Google Cloud IoT

Y a la que puedo acceder desde la URL que el deploy ha vinculado o ejecutando desde mi consola

gcloud app browse

Así, concentrandome únicamente en planificar y códificar la aplicación, en un menor tiempo que si hubiera tenido que dedicar tiempo a montar en mi servidor lo necesario para atender las peticiones.