gpt4 book ai didi

amazon-web-services - 带有 esp8266 的 AWS 物联网

转载 作者:行者123 更新时间:2023-12-01 12:23:14 28 4
gpt4 key购买 nike

请帮助我使用 esp8266 12e 连接 AWS IOT 服务。我正在使用 aws-mqtt-websocket 示例,但我无法连接 AWS IOT。代码如下,我得到的错误是:please start sntp first !与 websocket 服务器的连接错误

#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();
}
}
}

enter image description here

最佳答案

您需要将 AWSIoTFullAccess 政策附加到 IAM 中未经身份验证的角色。

关于amazon-web-services - 带有 esp8266 的 AWS 物联网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42089596/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com