2016-11-02 2 views
2

Я пытаюсь подключить WiMos D1 mini на основе ESP8266 к Amazon Web Service AWS IoT с помощью https://github.com/heskew/aws-sdk-arduino.Подключение esp8266 к AWS IoT

Однако, когда я прошить устройство, я получаю 403 обратно, со следующим сообщением: «Credential должна быть ограничена, чтобы исправить службы:. Выполнить-апи '»

Изменение

this->awsService = "iotdata"; 

к

this->awsService = "execute-api"; 

в AmazonIOTClient.cpp приводит 404: «Нет меня thod нашел подходящий маршрут вещей/my-thing/shadow для метода POST POST. " и, согласно 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"; 

ответ

2

я могу, наконец, внести что-то :)

я получил это тот же самый пример работая несколько дней назад. Однако я использовал одну и ту же библиотеку только для другого филиала iot-get-shadow-and-cleanup. Я не помню, чтобы делать какие-либо изменения, как один вы упомянули:

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

Вот правильные настройки AWS конечной точки, которая идет в keys.cpp

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

Также добавьте delete[] result; в конец publish(), чтобы сэкономить драгоценное кучное пространство.

Я бы рекомендовал использовать ветку iot-get-shadow-and-cleanup, так как у нее есть исправления утечек памяти.

Я сделал еще одно изменение, чтобы решить все проблемы с запуском кучи пространства при постоянном обновлении тени. В AWSClient4.cpp я изменил // delete[] server; на delete[] data;. Я не уверен на 100%, если это было необходимо, но в сочетании с добавлением delete[] result;. Я мог обновлять shadown каждую минуту непрерывно в течение часа без потери кучи.

Надеюсь, это поможет.

+0

К сожалению, изменение настроек в файле keys.cpp, как вы предложили, не устранило проблему (теперь я даже не получаю ответ с сервера), даже если вы используете iot-get-shadow-and- очистка ветви. Спасибо за помощь! –

Смежные вопросы