【问题标题】:Connecting esp8266 to AWS IoT将 esp8266 连接到 AWS IoT
【发布时间】:2017-01-06 16:48:39
【问题描述】:

我正在尝试使用 https://github.com/heskew/aws-sdk-arduino 将基于 ESP8266 的 WeMos D1 mini 连接到 Amazon Web Service AWS IoT。

但是,当我刷新设备时,我收到了 403,并显示以下消息: "凭据的范围应适用于正确的服务:'execute-api'。"

变化

this->awsService = "iotdata";

this->awsService = "execute-api";

AmazonIOTClient.cpp 中导致 404: “没有找到与 http 方法 POST 匹配的路由 things/my-thing/shadow 的方法。” 并且,根据this thread,服务应该是“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!");
}

keys.cpp 文件:

#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";

【问题讨论】:

    标签: arduino esp8266 aws-iot


    【解决方案1】:

    我终于可以贡献一些东西了:)

    几天前我得到了同样的例子。但是我使用了同一个库只是一个不同的分支iot-get-shadow-and-cleanup。我不记得必须像您提到的那样进行任何更改:

    this-&gt;awsService = "iotdata";this-&gt;awsService = "execute-api";

    以下是进入 keys.cpp 的 AWS 终端节点的正确设置

      awsIotRegion = "us-east-1";
      awsIotEndpoint = "amazonaws.com";
      awsIotDomain = "axxxxs2pxxxrlx.iot.us-east-1.amazonaws.com";`
    

    还要在publish() 的末尾添加delete[] result; 以节省一些宝贵的堆空间。

    我建议使用 iot-get-shadow-and-cleanup 分支,因为它修复了内存泄漏。

    我又进行了一项更改,以解决在持续更新影子时堆空间不足的所有问题。在 AWSClient4.cpp 中,我将 // delete[] server; 更改为 delete[] data; - 我不是 100% 确定这是否有必要,但结合添加 delete[] result; 我能够每分钟连续更新 shadown 一个小时而不会丢失任何堆.

    希望这会有所帮助。

    【讨论】:

    • 遗憾的是,按照您的建议更改 keys.cpp 文件中的设置并没有解决问题(现在我什至没有从服务器得到响应),即使使用 iot-get -shadow-and-cleanup 分支。不过感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多