Comment mesurer la température et l'envoyer à AWS IoT à l'aide d'un Raspberry Pi

Et si vous souhaitez corriger automatiquement la température de votre bureau? Ou que faire si vous êtes curieux de comprendre votre environnement de bureau à l'aide de capteurs IoT?

Si cela vous semble intéressant, veuillez lire la suite.

Pour commencer, nous devons mettre en place un capteur de lecture de température. Nous le connectons à un Arduino qui se connecte à un RaspberryPi.

L'étape suivante consiste à configurer AWS IoT SDK sur votre Raspberry Pi.

Configurer la chose

  1. Créez un objet dans AWS IoT:

2. Créez une seule chose pour commencer:

3. Créez une chose d'un type particulier. Nous utilisons RaspberryPi ici (les types sont créés par vous).

4.Créez un certificat pour que votre Thing communique avec AWS:

5. Téléchargez les certificats, une autorité de certification racine (CA), activez la chose et attachez la stratégie.

6. Le code de politique est ici. Cela peut sembler un peu permissif, mais c'est OK pour l'application de démonstration.

Configurez votre RaspberryPi

Avant de commencer l'installation, veuillez copier tous les certificats et tous les fichiers racine de l'autorité de certification sur le RaspberryPI (scp peut vous aider). Vous devez également installer Node.js si vous ne l'avez pas déjà.

Vous devrez également installer le SDK de l'appareil 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

Voici le code qui lit les données du port série et envoie des lectures de température à l'aide du kit SDK de l'appareil AWS IoT. Le code est basé sur les exemples d'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 })); }

Alors maintenant, que pouvez-vous faire avec ces données?

Vous pouvez écrire un Lambda qui met les données en file d'attente pour le traitement. Cela peut ressembler à ceci:

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 };

Et votre fichier serverless.com peut ressembler à ceci:

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 '#'"

J'espère que cet article vous a permis de gagner du temps lors de la configuration de votre appareil. Merci d'avoir lu!