Вызов Nest API с помощью esp8266 с помощью arduinoEDK

Я пытаюсь подключиться к Nest_API (термостату), используя ESP8266 и Arduino EDK. Но пока безрезультатно.

Я видел, как кто-то задавал здесь тот же вопрос раньше. Но ответ на его проблему мне не помог.

Итак, вот мой код:

Код

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "xxxxx";
const char* password = "xxxxx";

const char* host = "developer-api.nest.com";
const int httpsPort = 443;
const char* BearerKey = "xxxxxxxuB0QSbgw2nsT85dJEHRpwvR7rSyrLHm2E54QpC9vnSzB5PV8OtGDPm0mAh96wgM0MwApmS";

//declaring GPIO's
int gpio13Led = 13;
int gpio12Relay = 12;

// Use web browser to view and copy
// SHA1 fingerprint of the certificate
const char* fingerprint = "87:CB:F2:E6:44:C0:AA:F2:4C:28:B2:97:85:70:18:92:45:1B:A4:57";

void setup() {
// preparing GPIOs
  pinMode(gpio13Led, OUTPUT);
  digitalWrite(gpio13Led, HIGH);

  pinMode(gpio12Relay, OUTPUT);
  digitalWrite(gpio12Relay, HIGH);

  Serial.begin(115200);
  Serial.println();
  Serial.print("connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  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());

  // Use WiFiClientSecure class to create TLS connection
  WiFiClientSecure client;
  Serial.print("connecting to ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }

  if (client.verify(fingerprint, host)) {
    Serial.println("certificate matches");
    digitalWrite(gpio13Led, LOW);
  } else {
    Serial.println("certificate doesn't match");
  }

  String url = "/";
  Serial.print("requesting URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Content-Type: application/json\r\n" + 
               "Authorization: Bearer " + BearerKey + "\r\n\r\n"
               );

  Serial.println("request sent");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    Serial.println(line);
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }

 while (client.available()) {
    String line = client.readStringUntil('\n');
    Serial.println("reply was:");
    Serial.println("==========");
    Serial.println(line);
    Serial.println("==========");
    Serial.println("closing connection");
 }  
}

void loop() {
}   

Я никогда не получаю никакого результата от сервера. Но когда я использую почтальон, он работает. Поэтому мне интересно. Нужно ли использовать строку «host:» + host + ...?

И есть ли способ поймать некоторые ошибки с помощью библиотеки WiFiClientSecure.h. Я также однажды изменил URL-адрес хоста в строке получения. Затем я получил одну ошибку от сервера. Я уже был рад, что все-таки был ответ.

Последовательный вывод

connecting to xxxxx
........
WiFi connected
IP address: 
xxxxx
connecting to developer-api.nest.com
certificate matches
requesting URL: /
request sent
HTTP/1.1 307 Temporary Redirect

Content-Type: application/json; charset=UTF-8

Access-Control-Allow-Origin: *

Cache-Control: private, no-cache, no-store, max-age=0

Pragma: no-cache

Location: https://firebase-apiserver10-tah01-iad01.dapi.production.nest.com:9553/

Connection: close

Authorization: Bearer xxxxx

content-length: 0



headers received
reply was:
==========

==========
closing connection

Теперь я полностью застрял. Было бы неплохо, если бы кто-нибудь мог помочь мне дальше. спасибо


person pingwing    schedule 12.02.2018    source источник
comment
И что именно отображается в последовательном мониторе?   -  person gre_gor    schedule 13.02.2018
comment
@gre_gor Когда я отключаю последнее время(), я получаю это в результате: подключение к xxxxx ...... IP-адрес, подключенный к Wi-Fi: 192.xxx.x.xxx подключение к сертификату developer-api.nest.com соответствует запросу URL: /запрос отправил заголовки получил ответ был: ===== ===== закрытие соединения Было бы неплохо иметь возможность видеть ошибку, которую выдает мне сервер. Может ли быть так, что я получаю код JSON, но не вижу его?   -  person pingwing    schedule 13.02.2018
comment
Добавьте это в вопрос. Внутри комментариев плохо читается. А также распечатать заголовки.   -  person gre_gor    schedule 13.02.2018
comment
Вы абсолютно правы. мой вопрос был отредактирован   -  person pingwing    schedule 13.02.2018
comment
И каковы возвращаемые заголовки?   -  person gre_gor    schedule 13.02.2018
comment
Это проблема. Я понятия не имею, как поймать любую ошибку с сервера. Я должен получить что-то в коде JSON, в котором перечислены все виды данных цензуры с гнездового устройства. Вы также можете увидеть возвращение почтальона в этом сообщении: ссылка   -  person pingwing    schedule 13.02.2018
comment
Распечатайте lines в этом первом цикле while.   -  person gre_gor    schedule 13.02.2018
comment
Я добавил код строки, как вы сказали. Я отредактировал код и вывод в своем первом сообщении. Спасибо за помощь.   -  person pingwing    schedule 13.02.2018


Ответы (1)


Ух ты. Святой дым! У меня есть ответ! Благодаря вашей подсказке это сработало @gre_gor.

Я изменил имя хоста и порт, потому что в моем ответе было что-то вроде этого.

Вот мой окончательный код:

КОД:

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "xxxxx";
const char* password = "xxxxx";

const char* host = "firebase-apiserver10-tah01-iad01.dapi.production.nest.com";
const int httpsPort = 9553; //443;
const char* BearerKey = "xxxxx";

//declaring GPIO's
int gpio13Led = 13;
int gpio12Relay = 12;

// Use web browser to view and copy
// SHA1 fingerprint of the certificate
const char* fingerprint = "87:CB:F2:E6:44:C0:AA:F2:4C:28:B2:97:85:70:18:92:45:1B:A4:57";

void setup() {
// preparing GPIOs
  pinMode(gpio13Led, OUTPUT);
  digitalWrite(gpio13Led, HIGH);

  pinMode(gpio12Relay, OUTPUT);
  digitalWrite(gpio12Relay, HIGH);

  Serial.begin(115200);
  Serial.println();
  Serial.print("connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  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());

  // Use WiFiClientSecure class to create TLS connection
  WiFiClientSecure client;
  Serial.print("connecting to ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }

  if (client.verify(fingerprint, host)) {
    Serial.println("certificate matches");
    digitalWrite(gpio13Led, LOW);
  } else {
    Serial.println("certificate doesn't match");
  }

  String url = "/";
  Serial.print("requesting URL: ");
  Serial.println(url);


  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Content-Type: application/json\r\n" + 
               "Authorization: Bearer " + BearerKey + "\r\n\r\n"
               );

  Serial.println("request sent");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    Serial.println(line);
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }

 while (client.available()) {
    String line = client.readStringUntil('\n');
    Serial.println("reply was:");
    Serial.println("==========");
    Serial.println(line);
    Serial.println("==========");
    Serial.println("closing connection");
 }  
}

void loop() {
}

Серийный монитор:

connecting to xxxxx
...........
WiFi connected
IP address: 
xxxxx
connecting to firebase-apiserver10-tah01-iad01.dapi.production.nest.com
certificate doesn't match
requesting URL: /
request sent
HTTP/1.1 200 OK

Content-Type: application/json; charset=UTF-8

Access-Control-Allow-Origin: *

Cache-Control: private, no-cache, no-store, max-age=0

Pragma: no-cache

Connection: close

content-length: 8060



headers received
reply was:
==========
{"devices":{"thermostats":{"exxx":{"humidity":40,"locale":"nl-NL","temperature_scale":"C","is_using_emergency_heat":false,"has_fan":false,"software_version":"5.6.6-4","has_leaf":true,"where_id":"YygkopgUUc_cIFnCNG7GRDIIQnENO0ScVx9Pa78qfG7XyH-9WDdVgA","device_id":"e97ayjdpIOkPa4vZFxHggZMXiHKfhsyU","name":"Downstairs","can_heat":true,"can_cool":false,"target_temperature_c":15.0,"target_temperature_f":59,"target_temperature_high_c":24.0,"target_temperature_high_f":75,"target_temperature_low_c":20.0,"target_temperature_low_f":68,"ambient_temperature_c":15.5,"ambient_temperature_f":61,"away_temperature_high_c":24.0,"away_temperature_high_f":76,"away_temperature_low_c":8.5,"away_temperature_low_f":48,"eco_temperature_high_c":24.0,"eco_temperature_high_f":76,"eco_temperature_low_c":8.5,"eco_temperature_low_f":48,"is_locked":false,"locked_temp_min_c":20.0,"locked_temp_min_f":68,"locked_temp_max_c":22.0,"locked_temp_max_f":72,"sunlight_correction_active":false,"sunlight_correction_enabled":true,"structure_id":"vEJb634MNif-xxx{"access_token":"xxxx","client_version":2,"user_id":"xxxx"}}
==========
closing connection

Странно то, что мой отпечаток пальца не совпадает, но он все еще продолжает давать мне информацию.

Следующий шаг — прочитать этот ответ и использовать данные, которые я хочу. :-)

person pingwing    schedule 13.02.2018
comment
Как бы вы разместили данные Json? - person hirani89; 19.02.2019