Cómo medir la temperatura y enviarla a AWS IoT usando una Raspberry Pi

¿Qué sucede si desea autocorregir la temperatura en su oficina? ¿O qué pasa si tiene curiosidad por comprender el entorno de su oficina utilizando sensores de IoT?

Si esto te parece interesante, sigue leyendo.

Para empezar, necesitamos configurar un sensor de lectura de temperatura. Lo conectamos a un Arduino que se conecta a un RaspberryPi.

El siguiente paso es configurar AWS IoT SDK en su Raspberry Pi.

Configurar la cosa

  1. Cree algo en AWS IoT:

2. Crea una sola cosa para empezar:

3. Cree una cosa de un tipo particular. Estamos usando RaspberryPi aquí (los tipos los crea usted).

4.Cree un certificado para que Thing se comunique con AWS:

5. Descargue los certificados, una autoridad de certificación raíz (CA), active Thing y adjunte la política.

6. El código de política está aquí. Puede parecer un poco permisivo, pero está bien para la aplicación de demostración.

Configura tu RaspberryPi

Antes de comenzar la configuración, copie todos los certificados y todos los archivos de CA raíz en RaspberryPI (scp podría ayudarlo). También necesita instalar Node.js si aún no lo tiene.

También deberá instalar el SDK del dispositivo AWS IoT.

sudo apt-get update sudo apt-get upgrade sudo apt-get install nodejs openssl x509 -in ./CA-roots/VeriSign-Class\ 3-Public-Primary-Certification-Authority-G5.pem -inform PEM -out root-CA.crt chmod 775 root-CA.crt npm install aws-iot-device-sdk

Este es el código que lee los datos del puerto serie y envía lecturas de temperatura mediante el SDK del dispositivo AWS IoT. El código se basa en los ejemplos de Amazon.

'use strict'; console.log('Running...'); const SerialPort = require('serialport'); const Readline = require('@serialport/parser-readline') const portName = '/dev/ttyACM0'; const port = new SerialPort(portName, (err) => { if (err) { return console.log('Error: ', err.message); } }); const deviceModule = require('aws-iot-device-sdk').device; const parser = port.pipe(new Readline({ delimiter: '\r\n' })); const rePattern = new RegExp(/C: (.+)F:(.+)/); parser.on('data', (data) => { const arrMatches = data.match(rePattern); if(arrMatches && arrMatches.length >= 1) { const readingInC = arrMatches[1].trim(); console.log(readingInC); sendDataToTheNube(readingInC); } }); const defaults = { protocol: 'mqtts', privateKey: './iot/f5b0580f5c-private.pem.key', clientCert: './iot/f5b0580f5c-certificate.pem.crt', caCert: './iot/root-CA.crt', testMode: 1, /* milliseconds */ baseReconnectTimeMs: 4000, /* seconds */ keepAlive: 300, /* milliseconds */ delay: 4000, thingName: 'cuttlefish-hub-01', clientId: 'nouser' + (Math.floor((Math.random() * 100000) + 1)), Debug: false, Host: 'a7773lj8lvoid9a.iot.ap-southeast-2.amazonaws.com', region: 'ap-southeast-2' }; function sendDataToTheNube(readingInC) { const device = deviceModule({ keyPath: defaults.privateKey, certPath: defaults.clientCert, caPath: defaults.caCert, clientId: defaults.clientId, region: defaults.region, baseReconnectTimeMs: defaults.baseReconnectTimeMs, keepalive: defaults.keepAlive, protocol: defaults.Protocol, port: defaults.Port, host: defaults.Host, debug: defaults.Debug }); device.publish(`temperature/${defaults.thingName}`, JSON.stringify({ temperature: readingInC })); }

Entonces, ¿qué puedes hacer ahora con esos datos?

Puede escribir una Lambda que ponga en cola los datos para su procesamiento. Puede verse así:

require("source-map-support").install(); import { Callback, Handler } from "aws-lambda"; import { baseHandler } from "../shared/lambda"; import logger from "../shared/logger"; import {Models} from "../shared/models"; import {QueueWriter} from "./queue-writer"; const handler: Handler = baseHandler((event: any, callback: Callback) => { logger.json("Event:", event); const writer = new QueueWriter(); const { temperature, sensorId } = event; const reading: Models.Readings.TemperatureReading = { temperature, sensorId, }; writer.enqueue(reading) .then(() => callback()) .catch(callback); }); export { handler };

Y su archivo serverless.com puede verse así:

functions: sensorReadings: name: ${self:provider.stage}-${self:service}-sensor-readings handler: sensor-readings/index.handler description: Gets triggered by AWS IoT timeout: 180 environment: READING_QUEUE_NAME: ${self:provider.stage}_${self:custom.productName}_reading READING_DL_QUEUE_NAME: ${self:provider.stage}_${self:custom.productName}_reading_dl tags: service: ${self:service} events: - iot: sql: "SELECT * FROM '#'"

Espero que esta publicación te haya ahorrado algo de tiempo configurando tu dispositivo. ¡Gracias por leer!