Πώς να μετρήσετε τη θερμοκρασία και να την στείλετε στο AWS IoT χρησιμοποιώντας ένα Raspberry Pi

Τι γίνεται αν θέλετε να διορθώσετε τη θερμοκρασία στο γραφείο σας; Ή τι γίνεται αν θέλετε να κατανοήσετε το περιβάλλον του γραφείου σας χρησιμοποιώντας αισθητήρες IoT;

Εάν αυτό σας ενδιαφέρει, διαβάστε παρακάτω.

Αρχικά, πρέπει να ρυθμίσουμε έναν αισθητήρα ανάγνωσης θερμοκρασίας. Το συνδέουμε με ένα Arduino που συνδέεται με ένα RaspberryPi.

Το επόμενο βήμα είναι να ρυθμίσετε το AWS IoT SDK στο Raspberry Pi σας.

Ρυθμίστε το πράγμα

  1. Δημιουργήστε ένα πράγμα στο AWS IoT:

2. Δημιουργήστε ένα μόνο πράγμα για να ξεκινήσετε με:

3. Δημιουργήστε κάτι συγκεκριμένου τύπου. Χρησιμοποιούμε το RaspberryPi εδώ (οι τύποι αποτελούνται από εσάς).

4. Δημιουργήστε ένα πιστοποιητικό για το πράγμα σας για επικοινωνία με το AWS:

5. Κατεβάστε τα πιστοποιητικά, μια αρχή έκδοσης πιστοποιητικών ρίζας (CA), ενεργοποιήστε το πράγμα και επισυνάψτε την πολιτική.

6. Ο κωδικός πολιτικής είναι εδώ. Μπορεί να φαίνεται λίγο ανεκτικό, αλλά είναι εντάξει για την εφαρμογή επίδειξης.

Ρυθμίστε το RaspberryPi σας

Πριν ξεκινήσετε την εγκατάσταση, αντιγράψτε όλα τα πιστοποιητικά και όλα τα αρχεία CA root στο RaspberryPI (το scp μπορεί να σας βοηθήσει). Πρέπει επίσης να εγκαταστήσετε το Node.js εάν δεν το έχετε ήδη.

Θα χρειαστεί επίσης να εγκαταστήσετε το SDK της συσκευής 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

Εδώ είναι ο κωδικός που διαβάζει τα δεδομένα από τη σειριακή θύρα και στέλνει μετρήσεις θερμοκρασίας χρησιμοποιώντας το SDK της συσκευής AWS IoT. Ο κωδικός βασίζεται στα παραδείγματα του 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 })); }

Τώρα τι μπορείτε να κάνετε με αυτά τα δεδομένα;

Μπορείτε να γράψετε μια λάμδα που ενεργοποιεί τα δεδομένα για επεξεργασία. Μπορεί να μοιάζει με αυτό:

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

Και το αρχείο serverless.com μπορεί να μοιάζει με αυτό:

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

Ελπίζω αυτή η ανάρτηση να σας εξοικονομήσει λίγο χρόνο κατά τη ρύθμιση της συσκευής σας. Ευχαριστώ για την ανάγνωση!