pdf-icon

Arduino-接入-AWS

概述

本教程将使用M5Core2获取ENV Unit(温湿度,气压传感器)数值,并上传至AWS-IoT-Core。举例说明如何通过Arduino编程,使设备接入AWS云服务平台,实现订阅和发布数据。

创建设备

接入前,需要先通过AWS Management Console注册新设备。 点击此处访问AWS Management Console , 完成账号创建后进行登录。

点击AWS services->IoT Core进入AWS IoT管理页面

点击Manage->Things->Create things创建新的设备

根据你的需求创建设备,这里将演示创建最为基本的single thing, 查看更多设备类型详情请参考 AWS官网文档

输入设备名称, 配置设备所属的组与设备分类,点击Next->创建设备证书->配置设备策略->完成创建

在完成设备创建后将会弹出密钥证书的下载页面, 注意:该页面仅会弹出一次,请根据提示将设备证书(Device certificate)+设备公钥(Public Key File)+设备私钥(Private Key File)下载至本地。(这些文件,在后续的操作中将会用于通信验证)

安装依赖与案例库

该教程中,我们将使用M5Core2获取ENV II Unit(温湿度,气压传感器)数值,并上传至AWS-IoT-Core。 开始编程前,我们需要从Github下载AWS-IoT相关依赖库与案例程序, 你可以通过下面git指令直接下载(或是点击下方链接访问对应的项目地址下载zip压缩包, 下载后需进行解压)。并将依赖库放置到Arduino库管理路径(通常为C:/Users/YourUserName/Documents/Arduino/libraries)

Github


git clone git@github.com:aws-samples/aws-iot-esp32-arduino-examples.git

git clone git@github.com:bblanchon/ArduinoJson.git

git clone git@github.com:256dpi/arduino-mqtt.git

git clone git@github.com:adafruit/Adafruit_BMP280_Library.git

git clone git@github.com:adafruit/Adafruit_Sensor.git

git clone git@github.com:m5stack/UNIT_ENV.git
除了之前下载的依赖库之外,你还可以根据你所使用的M5设备类型,引入不同的驱动库。在该实例中,我们将引入 M5Core2.h (适用于CORE2和CORE2 FOR AWS产品)。其他有关M5Stack产品的库,你可以在M5Stack官方 Github 中找到。

git clone git@github.com:m5stack/M5Core2.git

配置项目

我们可以从aws-iot-esp32-arduino-examples文件夹中,复制basic-pubsub案例程序, 作为程序的一个基础模板。

配置证书

我们通常在项目中创建一个secrets.h用来存放密钥与证书WIFI信息, 其包含的内容如下。
提示:
1. 宏定义THINGNAME为我们的创建的设备名称,需要与AWS Management Console中的名称保持一致.
2. 将我们之前在AWS IoT Core中创建设备获取的密钥与证书用编辑器打开,并复制粘贴内容到代码中的对应位置。

复制AWS Management Console->Settings中的Endpoint字段


#include <pgmspace.h>

#define SECRET
#define THINGNAME "ENV-TEST"

const char WIFI_SSID[] = "WIFI_SSID";
const char WIFI_PASSWORD[] = "WIFI_PASSWORD";
const char AWS_IOT_ENDPOINT[] = "xxxxx.amazonaws.com";

// Amazon Root CA 1
static const char AWS_CERT_CA[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgIT........................
-----END CERTIFICATE-----
)EOF";

// Device Certificate
static const char AWS_CERT_CRT[] PROGMEM = R"KEY(
-----BEGIN CERTIFICATE-----
MIIDWjCCAkKgAwIBAgIVA........................
-----END CERTIFICATE-----
)KEY";

// Device Private Key
static const char AWS_CERT_PRIVATE[] PROGMEM = R"KEY(
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAq........................
-----END RSA PRIVATE KEY-----
)KEY";

编辑程序

参考下方程序, 并使用Arduino IDE将其编译上传至设备。


#include "secrets.h"
#include <WiFiClientSecure.h>
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include "WiFi.h"
#include <M5Core2.h>
#include "Adafruit_Sensor.h"
#include "Adafruit_BMP280.h"
#include "SHT3X.h"
SHT3X sht30;
Adafruit_BMP280 bme;

float tmp = 0.0;
float hum = 0.0;
float pressure = 0.0;


// The MQTT topics that this device should publish/subscribe
#define AWS_IOT_PUBLISH_TOPIC   "core2/env"
#define AWS_IOT_SUBSCRIBE_TOPIC "core2/msg"

WiFiClientSecure net = WiFiClientSecure();
MQTTClient client = MQTTClient(256);


void messageHandler(String &topic, String &payload) {
  Serial.println("incoming: " + topic + " - " + payload);
}

void connectAWS()
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  Serial.println("Connecting to Wi-Fi");

  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }

  // Configure WiFiClientSecure to use the AWS IoT device credentials
  net.setCACert(AWS_CERT_CA);
  net.setCertificate(AWS_CERT_CRT);
  net.setPrivateKey(AWS_CERT_PRIVATE);

  // Connect to the MQTT broker on the AWS endpoint we defined earlier
  client.begin(AWS_IOT_ENDPOINT, 8883, net);

  // Create a message handler
  client.onMessage(messageHandler);

  Serial.print("Connecting to AWS IOT");

  while (!client.connect(THINGNAME)) {
    Serial.print(".");
    delay(100);
  }

  if(!client.connected()){
    Serial.println("AWS IoT Timeout!");
    return;
  }

  // Subscribe to a topic
  client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC);

  Serial.println("AWS IoT Connected!");
}

void publishMessage()
{

  pressure = bme.readPressure();
  if(sht30.get()==0){
    tmp = sht30.cTemp;
    hum = sht30.humidity;
  }
  Serial.printf("Temperatura: %2.2f*C  Humedad: %0.2f%%  Pressure: %0.2fPa\r\n", tmp, hum, pressure);
  delay(100);

  StaticJsonDocument<200> doc;
  doc["tmp"] = tmp;
  doc["hum"] = hum;
  doc["pressure"] = pressure;
  char jsonBuffer[512];
  serializeJson(doc, jsonBuffer); // print to client

  client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
}

void setup() {
  M5.begin();
  Wire.begin();
  bme.begin(0x76);
  connectAWS();
}

void loop() {
  publishMessage();
  client.loop();
  delay(1000);
}


订阅发布消息

点击AWS Management Console->Test进入在线测试页面。该功能用于测试AWS账户中设备的MQTT消息, 点击Additional configuration可调整QoS等级。

发布主题:填写TopicMessage payload,点击Publish发布。

订阅主题:填写Topic,点击Subcribe订阅。点击Additional configuration,可设置显示消息的类型,接收到的消息将在页面下方的控制台显示。

On This Page