2

https://github.com/heskew/aws-sdk-arduinoを使用して、ESP8266 ベースの WeMos D1 mini を Amazon Web Service AWS IoT に接続しようとしています。

ただし、デバイスをフラッシュすると、403 が返され、次のメッセージが表示されます。

変化

this->awsService = "iotdata";

this->awsService = "execute-api";

AmazonIOTClient.cppで404: 「http メソッド POST のルート things/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!");
}

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

1 に答える 1

3

私はついに何かを貢献することができます:)

数日前にこのまったく同じ例が機能しました。ただし、同じライブラリを別のブランチiot-get-shadow-and-cleanup で使用しました。あなたが言及したような変更を加える必要があったことを思い出しません:

this->awsService = "iotdata";this->awsService = "execute-api";

keys.cpp に入る AWS エンドポイントの正しい設定は次のとおりです。

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

また、貴重なヒープ スペースを節約するためdelete[] result;に の最後に追加します。publish()

iot-get-shadow-and-cleanup ブランチを使用することをお勧めします。これにはメモリ リークが修正されているためです。

シャドウを継続的に更新するときにヒープ領域が不足するというすべての問題を解決するために、もう 1 つ変更を加えました。AWSClient4.cpp で変更// delete[] server;しましたdelete[] data;- これが必要かどうかは 100% わかりませんがdelete[] result;、ヒープを失うことなく 1 時間連続してシャドウンを 1 分ごとに更新することができました。

お役に立てれば。

于 2016-11-10T02:36:41.630 に答える