Выбрать главу

Внутри настроек приложения есть параметр “access token”, он будет нужен нам для получения доступа.

Там же выбираем пункт Generate access token:

Нажимаем кнопку “Generate” рядом с “access token”, и получаем ключ вида V3z9NpYlRxEAAAAAAACG5cjBXXXXXXXXXXXXXX, его надо сохранить, мы будем использовать его в дальнейшем.

На этом подготовительная часть закончена. Сам сервис Dropbox имеет разнообразное API для работы с данными, посмотреть список функций можно по адресу https://www.dropbox.com/developers/documentation/http/documentation. Нам для отправки файлов нужна будет всего лишь одна функция upload.

Для того, чтобы отличать файлы друг от друга, мы будем создавать файлы по шаблону “год-месяц-день-чч-мм-сс.txt”. Dropbox требует защищенного соединения по https, поэтому мы используем класс WiFiClientSecure.

Код программы целиком приведен ниже.

#include <WiFi.h>

#include <WiFiClientSecure.h>

#include <time.h>

const char* ssid = "TP-LINK_AB11";

const char* password = "12345678";

WiFiClientSecure client;

void uploadData(String content) {

Serial.println("Dropbox connecting...");

if (client.connect("content.dropboxapi.com", 443)) {

Serial.println("Dropbox connected");

// Сформировать имя файла по шаблону времени

time_t now = time(nullptr);

struct tm timeinfo;

gmtime_r(&now, &timeinfo);

char file_name[64] = {0};

strftime(file_name, 64, "log-%Y-%m-%d-%H-%M-%S.txt", &timeinfo);

Serial.print("Upload "); Serial.println(file_name);

// Отправка запроса

client.println("POST /2/files/upload HTTP/1.1");

client.println("Host: content.dropboxapi.com");

client.println("Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXX");

char dropbox_args[255] = {0};

sprintf(dropbox_args,

"{\"path\": \"/%s\", \"mode\": \"overwrite\", \"autorename\": true, \"mute\": false}", file_name);

client.print("Dropbox-API-Arg: "); client.println(dropbox_args);

client.println("Content-Type: application/octet-stream");

client.print("Content-Length: "); client.println(content.length());

client.println();

client.println(content);

delay(5000);

client.stop();

Serial.println("Disconnect");

Serial.println();

} else {

Serial.println("Error: cannot connect");

Serial.println();

}

}

void setup() {

Serial.begin(115200);

delay(10);

Serial.print("Connecting to "); Serial.println(ssid);

while (WiFi.status() != WL_CONNECTED) {

delay(500);

WiFi.begin(ssid, password);

Serial.print(".");

}

Serial.println("");

Serial.println("IP address: ");

Serial.println(WiFi.localIP());

// Установка времени через SMTP

Serial.print("Setting time using SNTP");

configTime(8*3600, 0, "pool.ntp.org", "time.nist.gov");

time_t now = time(nullptr);

while (now < 8 * 3600 * 2) {

delay(500);

Serial.print(".");

now = time(nullptr);

}

Serial.println("done");

// Загрузка данных #1

uploadData(String("Data from ESP32 - this is a test 1"));

delay(5000);

// Загрузка данных #2

uploadData(String("Data from ESP32 - this is a test 2"));

delay(5000);

// Загрузка данных #3

uploadData(String("Data from ESP32 - this is a test 3"));

}

void loop(){

}

Как можно видеть, мы создали функцию uploadData, которую можно вызывать нужное число раз (имеет смысл делать это не очень часто, например раз в 5 или 30 минут). В данном примере функция вызывается только из setup(), чтобы файлы не создавались постоянно.

Вместо XXXXXXXXXXXXXXXXXXXXXXXXXXXX нужно будет вставить свой токен, полученный в панели управления https://www.dropbox.com/developers/apps.

Результат - запускаем программу, и через некоторое время видим в папке Dropbox 3 файла.

При использовании в реальном приложении, целесообразно отправлять лог лишь по каким-то редким событиям (например срабатывание датчика открывания двери). Если же нужно отправлять лог постоянно, имеет смысл накапливать данные в буфере памяти объемом несколько килобайт, и отправлять данные лишь по мере заполнения буфера.

Важно. Это наверное должно быть и так очевидно, но лучше повторить. Функции любого сервиса, такого как Dropbox, Google, Amazon, всегда поставляются на условиях “как есть” - создатели не гарантируют их абсолютно бесперебойной работы (тем более, если речь идет о бесплатных услугах). Также эти функции могут периодически совершенствоваться и меняться, так что гарантий многолетней и бесперебойной работы устройства, увы, нет. Поэтому подходы, аналогичные описанным выше, не стоит использовать там, где от этого зависит безопасность людей или имущества.

На этом мы закончим описание работы с платой ESP32. Как можно видеть, свою цену в 8$ она отрабатывает на 110%. В следующей части мы рассмотрим работу с Linux на базе одноплатного компьютера Raspberry Pi.

Часть 4. Осваиваем Linux: Raspberry Pi

4.1 Общее знакомство

Одноплатные компьютеры Raspberry Pi появились на рынке несколько лет назад, и сразу получили признание у пользователей. Действительно, всего за 20-30$ покупатель получал практически полноценный компьютер с операционной системой Linux. Мы уже рассматривали платы Arduino, и как нетрудно было видеть, они весьма ограничены в своих возможностях. Linux позволяет использовать практически любые современные средства разработки, от Си или Python, до многопоточных или даже распределенных вычислений.