Как измерить температуру и отправить ее в AWS IoT с помощью Raspberry Pi

1656543253 kak izmerit temperaturu i otpravit ee v aws iot s

Что делать если вы хотите самостоятельно регулировать температуру в офисе? Или что если вам интересно понять свою офисную среду с помощью датчиков Интернета вещей?

Если вам это покажется интересным, читайте дальше.

Для начала нам нужно настроить датчик температуры. Мы подключаем его к Arduino, который подключается к RaspberryPi.

1*luZBAP5jAeQXIoKDlm2Lqg

Следующим шагом является настройка AWS IoT SDK на вашем Raspberry Pi.

Настройте вещь

  1. Создайте что-нибудь в AWS IoT:
1*HMoK-8MpdziO3p1KgUu1WQ

2. Для начала создайте одну вещь:

1*Zkpo9cALdjh6y_91NkYlgQ

3. Создайте вещь определенного типа. Здесь мы используем RaspberryPi (типы придуманы вами).

1*wpws9o3IaQd1QrhZerkgxw

4. Создайте сертификат для Thing для связи с AWS:

1*kvhutJBA_nZMl4tCRYlPhw

5. Загрузите сертификаты, корневой центр сертификации (CA), активируйте Thing и добавьте политику.

1*IlIegdjeWhnlsCPsk2CR9A

6. Кодекс политики находится здесь. Это может показаться несколько разрешенным, но для демонстрационной программы это нормально.

1*mY-mP_JRKku7qBxk-PkTVg

Настройте RaspberryPi

Прежде чем начать настройку, скопируйте все сертификаты и все файлы корневого ЦС на 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 '#'"

Надеюсь, что эта публикация сэкономила вам время на настройку устройства. Спасибо, что прочли!

Добавить комментарий

Ваш адрес email не будет опубликован.