簡體   English   中英

帶有 esp8266 的 AWS 物聯網

[英]AWS iot with esp8266

請幫助我使用 esp8266 12e 連接 AWS IOT 服務。 我正在使用 aws-mqtt-websocket 示例,但我無法連接 AWS IOT。 代碼如下,我得到的錯誤是: please start sntp first ! error connection to the websocket server please start sntp first ! error connection to the websocket server

#include <Arduino.h>
#include <Stream.h>

#include <ESP8266WiFi.h>

//AWS
#include "sha256.h"
#include "Utils.h"
#include "AWSClient2.h"

//WEBSockets
#include <Hash.h>
#include <WebSocketsClient.h>

//MQTT PAHO
#include <SPI.h>
#include <IPStack.h>
#include <Countdown.h>
#include <MQTTClient.h>

//AWS MQTT Websocket
#include "Client.h"
#include "AWSWebSocketClient.h"
#include "CircularByteBuffer.h"

//AWS IOT config, change these:

const char* ssid = "XXXX";
const char* password = "XXXXXXXX";
char aws_endpoint[] = "XXXXXXXXXXXXXXXXXXXXXXX";
char aws_key[] = "XXXXXXXXXXXXXXXXXX";
char aws_secret[] = "XXXXXXXXXXXXXXXXXXXX";
char aws_region[] = "XXXXXXXXXXXXXXXX";
const char* aws_topic = "XXXXXXXXXXXXXXXXXX";
int port = 443;

//MQTT config
const int maxMQTTpackageSize = 512;
const int maxMQTTMessageHandlers = 1;

WiFiClientSecure espclient;

AWSWebSocketClient awsWSclient(1000);

IPStack ipstack(awsWSclient);

MQTT::Client<IPStack, Countdown, maxMQTTpackageSize, maxMQTTMessageHandlers> *client = NULL;

//# of connections
long connection = 0;

//generate random mqtt clientID
char* generateClientID() {
    char* cID = new char[23]();
    for (int i = 0; i<22; i += 1)
        cID[i] = (char)random(1, 256);
    return cID;
}

//count messages arrived
int arrivedcount = 0;


//callback to handle mqtt messages
void messageArrived(MQTT::MessageData& md)
{
    MQTT::Message &message = md.message;

    Serial.print("Message ");
    Serial.print(++arrivedcount);
    Serial.print(" arrived: qos ");
    Serial.print(message.qos);
    Serial.print(", retained ");
    Serial.print(message.retained);
    Serial.print(", dup ");
    Serial.print(message.dup);
    Serial.print(", packetid ");
    Serial.println(message.id);
    Serial.print("Payload ");
    char* msg = new char[message.payloadlen + 1]();
    memcpy(msg, message.payload, message.payloadlen);
    Serial.println(msg);
    delete msg;
}

//connects to websocket layer and mqtt layer
bool connect() {

    if (client == NULL) {
        client = new MQTT::Client<IPStack, Countdown, maxMQTTpackageSize, maxMQTTMessageHandlers>(ipstack);
    }
    else {

        if (client->isConnected()) {
            client->disconnect();
        }
        delete client;
        client = new MQTT::Client<IPStack, Countdown, maxMQTTpackageSize, maxMQTTMessageHandlers>(ipstack);
    }


    //delay is not necessary... it just help us to get a "trustful" heap space value
    delay(1000);
    Serial.print(millis());
    Serial.print(" - conn: ");
    Serial.print(++connection);
    Serial.print(" - (");
    Serial.print(ESP.getFreeHeap());
    Serial.println(")");




    int rc = ipstack.connect(aws_endpoint, port);
    Serial.print(rc);

    if (rc != 1)
    {
        Serial.println("error connection to the websocket server");
        return false;
    }
    else {
        Serial.println("websocket layer connected");
    }


    Serial.println("MQTT connecting");
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.MQTTVersion = 3;
    char* clientID = generateClientID();
    data.clientID.cstring = clientID;
    rc = client->connect(data);
    delete[] clientID;
    if (rc != 0)
    {
        Serial.print("error connection to MQTT server");
        Serial.println(rc);
        return false;
    }
    Serial.println("MQTT connected");
    return true;
}

//subscribe to a mqtt topic
void subscribe() {
    //subscript to a topic
    int rc = client->subscribe(aws_topic, MQTT::QOS0, messageArrived);
    Serial.println(rc);
    if (rc != 0) {
        Serial.print("rc from MQTT subscribe is ");
        Serial.println(rc);
        return;
    }
    Serial.println("MQTT subscribed");
}

//send a message to a mqtt topic
void sendmessage() {
    //send a message
    MQTT::Message message;
    char buf[100];
    strcpy(buf, "{\"state\":{\"reported\":{\"on\": false}, \"desired\":{\"on\": false}}}");
    message.qos = MQTT::QOS0;
    message.retained = false;
    message.dup = false;
    message.payload = (void*)buf;
    message.payloadlen = strlen(buf) + 1;
    int rc = client->publish(aws_topic, message);
}

void setup_wifi() {

    delay(10);
    // We start by connecting to a WiFi network
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

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

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}

void setup() {
    Serial.begin(115200);
    setup_wifi();

    Serial.setDebugOutput(1);
    //fill AWS parameters    
    awsWSclient.setAWSRegion(aws_region);
    awsWSclient.setAWSDomain(aws_endpoint);
    awsWSclient.setAWSKeyID(aws_key);
    awsWSclient.setAWSSecretKey(aws_secret);
    awsWSclient.setUseSSL(true);

    if (connect()) {
        subscribe();
        sendmessage();
    }
}

void loop() {
    //keep the mqtt up and running
    if (awsWSclient.connected()) {
        client->yield();
    }
    else {
        //handle reconnection
        if (connect()) {
            subscribe();
        }
    }
}

在此處輸入圖像描述

您需要將AWSIoTFullAccess策略附加到 IAM 中未經身份驗證的角色。

我寫了一篇描述如何將 ESP32 連接到 AWS IoT 的帖子,涵蓋了您必須遵循的所有步驟。 你也可以找到源代碼。 也許它可以幫助你。 看看https://www.survivingwithandroid.com/how-to-connect-esp32-to-aws-iot-core-using-aws-mqtt/

讓我知道它是否對你有用

首先,請向我們詳細介紹您到目前為止所做的工作。

您是否正確安裝了教程中提到的所有必需庫? 另外,正如其他人所說,您是否附加了 AWSIoTFullAccess 政策? 您提到的 IAM 用戶也有所需的權限嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM