Arduino 将esp8266连接到AWS物联网
我正在尝试使用基于ESP8266的WeMos D1 mini连接到亚马逊网络服务AWS物联网 但是,当我闪存设备时,会返回403,并显示以下消息: “凭据的作用域应为正确的服务:'执行api'。” 改变Arduino 将esp8266连接到AWS物联网,arduino,esp8266,aws-iot,Arduino,Esp8266,Aws Iot,我正在尝试使用基于ESP8266的WeMos D1 mini连接到亚马逊网络服务AWS物联网 但是,当我闪存设备时,会返回403,并显示以下消息: “凭据的作用域应为正确的服务:'执行api'。” 改变 this->awsService = "iotdata"; 到 在AmazonitClient.cpp中,结果为404: “找不到与http方法POST的路由内容/my thing/shadow匹配的方法。” 而且,根据服务的要求,请求成功的前提是“iotdata” 是否有人遇到过同样的
this->awsService = "iotdata";
到
在AmazonitClient.cpp中,结果为404:
“找不到与http方法POST的路由内容/my thing/shadow匹配的方法。”
而且,根据服务的要求,请求成功的前提是“iotdata”
是否有人遇到过同样的问题并找到了让它运行的方法?如果是这样,我们将不胜感激。谢谢
下面是示例的完整代码:
#include <AmazonIOTClient.h>
#include <Esp8266AWSImplementations.h>
#include <AWSFoundationalTypes.h>
#include "keys.h"
const int sleepTimeS = 30;
void printWiFiData();
void printCurrentNetwork();
void publish(const char *topic, String data);
void publishToAWS();
void setup() {
Serial.begin(9600);
Serial.println("Started!");
publishToAWS();
ESP.deepSleep(sleepTimeS * 1000000);
}
void loop() {
}
void printWiFiData() {
// IP address
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// MAC address
byte mac[6];
WiFi.macAddress(mac);
Serial.print("MAC address: ");
Serial.print(mac[5], HEX);
Serial.print(":");
Serial.print(mac[4], HEX);
Serial.print(":");
Serial.print(mac[3], HEX);
Serial.print(":");
Serial.print(mac[2], HEX);
Serial.print(":");
Serial.print(mac[1], HEX);
Serial.print(":");
Serial.println(mac[0], HEX);
}
void printCurrentNetwork() {
// SSID
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// signal strength:
Serial.print("signal strength (RSSI): ");
Serial.println(WiFi.RSSI());
}
void publish(const char *topic, String data) {
AmazonIOTClient iotClient;
ActionError actionError;
Esp8266HttpClient httpClient;
Esp8266DateTimeProvider dateTimeProvider;
Serial.println();
Serial.print("Connecting to ");
Serial.print(wifiSsid);
Serial.println("...");
WiFi.begin(wifiSsid, wifiPwd);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(50);
}
Serial.println("");
Serial.println("WiFi connected");
printCurrentNetwork();
printWiFiData();
delay(50);
Serial.println("Initializing IoT client...");
iotClient.setAWSRegion(awsIotRegion);
iotClient.setAWSEndpoint(awsIotEndpoint);
iotClient.setAWSDomain(awsIotDomain);
iotClient.setAWSPath("/things/my-thing/shadow");
iotClient.setAWSKeyID(awsKeyID);
iotClient.setAWSSecretKey(awsSecKey);
iotClient.setHttpClient(&httpClient);
iotClient.setDateTimeProvider(&dateTimeProvider);
delay(50);
Serial.println("Updating thing shadow...");
MinimalString shadow = ("{\"state\":{\"reported\":{\"text\":" + data + "}}}").c_str();
char* result = iotClient.update_shadow(shadow, actionError);
Serial.print("result: ");
Serial.println(result);
}
void publishToAWS() {
Serial.println("Publishing to AWS IoT Broker");
publish("my-thing/text", "Hello World!");
}
我终于可以贡献一些东西了:) 几天前,我得到了一个非常相似的例子。然而,我使用的是同一个库,只是一个不同的分支。我不记得必须做出任何更改,如您所述:
this->awsService=“iotdata”代码>至本->awsService=“执行api”代码>
以下是进入keys.cpp的AWS端点的正确设置
awsIotRegion = "us-east-1";
awsIotEndpoint = "amazonaws.com";
awsIotDomain = "axxxxs2pxxxrlx.iot.us-east-1.amazonaws.com";`
同时添加delete[]结果
到publish()
的末尾,以节省一些宝贵的堆空间
我建议使用iot get shadow and cleanup分支,因为它修复了内存泄漏
我又做了一个更改,以解决在不断更新卷影时堆空间不足的所有问题。在AWSClient4.cpp中,我更改了//删除[]服务器代码>删除[]数据代码>-我不能100%确定这是否必要,但与添加的delete[]结果相结合代码>我能够在不丢失任何堆的情况下每分钟连续一小时更新阴影
希望这有帮助 遗憾的是,按照您的建议更改keys.cpp文件中的设置并没有解决问题(现在我甚至没有从服务器获得响应),即使使用iot get shadow and cleanup分支也是如此。谢谢你的帮助!
#include "keys.h"
// AWS User Credentials
const char* awsKeyID = "XXXXXXXXXXXXXXXXXXXX";
const char* awsSecKey = "X1xxx23xxxxXXXX34XXxxxxX56xXxxxxxxXx789x";
// AWS IoT
const char* awsIotRegion = "eu-central-1";
const char* awsIotEndpoint = "xxxxxxxxxxxxxx";
const char* awsIotDomain = "iot.eu-central-1.amazonaws.com";
// Init and connect WiFi to local WLAN
char* wifiSsid = "mySSID";
char* wifiPwd = "password";
awsIotRegion = "us-east-1";
awsIotEndpoint = "amazonaws.com";
awsIotDomain = "axxxxs2pxxxrlx.iot.us-east-1.amazonaws.com";`