Библиотека для отправки PUSH уведомлений с Arduino
Совместима со всеми Arduino платформами (используются Arduino-функции)
- Что мы хотим: получать от ESP8266/ESP32 пуш-уведомления на смартфон или ПК
- Браузер ПК или смартфона (далее - клиент) подписывается на уведомления веб-сайта при помощи нативного механизма самого браузера (на уровне JavaScript, это не бэкэнд), в результате получается "токен"
- Используя токен, можно отправить клиенту пуш-уведомление с любого устройства, которое умеет делать HTTP-запросы (запрос на сервис, обслуживающий браузер, у Chrome/Mozilla/Safari они разные, но механизм работы не отличается). Это непростой процесс, использующий сложное шифрование и аутентификацию, поэтому сама ESP-шка с ним не справится
- Предлагается использовать промежуточный PHP сервер, который принимает токен от ESP и отправляет с его помощью пуш. Вариант не самый безопасный, но очень простой и рабочий, не требующий ведения базы данных подписок на сервере
"Из коробки" доступен мой сайт https://push.gyver.ru/ - он как даёт браузеру подписку, так и обрабатывает запросы от ESP (это полностью бесплатно), т.е. уведомления будут приходить от лица этого сайта.
В репозитории прилагаю исходник веб-приложения и php скрипт - можно поднять аналогичный сервис буквально в пару кликов на своём сервере с доменом.
GyverPush(Client& client);
// настроить на другой сервер
void config(const char* host, uint16_t port, const char* path);
// отправить одному клиенту
bool send(const String& title, const String& body, const char* token);
// отправить одному клиенту, PROGMEM-токен
bool send_P(const String& title, const String& body, const char* token);
// отправить нескольким клиентам
bool send(const String& title, const String& body, const char** tokens, uint8_t len);
// отправить нескольким клиентам, PROGMEM-токены, список RAM
bool send_P(const String& title, const String& body, const char** tokens, uint8_t len);
// отправить из файла, разделитель токенов ';' или '\n'
bool send(const String& title, const String& body, Stream& token);Заходим на https://push.gyver.ru/, жмём подписаться, разрешаем уведомления. Будет получен токен - он уникален для каждого устройства и браузера. Токен довольно тяжёлый - около 500 байт, поэтому хранить его лучше в PROGMEM (статично) или файле (можно менять в процессе работы) - библиотека поддерживает отправку из файла. На сайте два окошка с токеном - один "сырой", второй оформлен для PROGMEM.
Токен характеризует клиента, т.е. можно отправить пуш как кому-то конкретному, так и всем:
// одному
push.send_P("Hello!", "From esp", push_token1);
// нескольким
push.send_P("Hello!", "From esp", tokens, 2);
// File tokens = ...
// push.send("Hello!", "From esp", tokens);- Токены можно сложить в одну строку с разделением
':', отправка будет всем указанным клиентам - Токены в файле можно разделять также переносом строки
'\n'для удобного ведения базы клиентов
- Понадобится хостинг или сервер с PHP версии 8.2 (скрипт написан под неё) и возможностью установки своих пакетов и библиотек
- Понадобится домен с поддержкой SSL (например Let's Encrypt). Домен не обязательно должен быть на этом же хостинге! Сойдёт и бесплатный GitHub Pages. Задача домена и сайта - только отобразить страничку веб-аппы
- Установить на сервер библиотеку
web-push-bundle: https://packagist.org/packages/minishlink/web-push-bundle - Сгенерировать VAPID ключи: https://vapidkeys.com/
- Публичный ключ указать в
package.jsonвеб-приложения и собрать его через Node.js - Оба ключа записать в
push-config.phpи положить его рядом сpush.php - В GyverPush указать свой сервер, порт и путь к php-скрипту
#include <Arduino.h>
#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <GyverPush.h>
#include <WiFiClient.h>
// токены брать тут https://push.gyver.ru/
static const char push_token1[] PROGMEM = "";
static const char push_token2[] PROGMEM = "";
const char* tokens[] = {
push_token1,
push_token2,
};
WiFiClient client;
GyverPush push(client);
void setup() {
Serial.begin(115200);
WiFi.begin("", "");
WiFi.waitForConnectResult();
Serial.println(WiFi.localIP());
// одному
push.send_P("Hello!", "From esp", push_token1);
// нескольким
// push.send_P("Hello!", "From esp", tokens, 2);
// из файла, разделитель токенов - \n или ;
// File f = ...
// push.send("Hello!", "From esp", f);
}
void loop() {
}- v1.0
- Библиотеку можно найти по названию GyverPush и установить через менеджер библиотек в:
- Arduino IDE
- Arduino IDE v2
- PlatformIO
- Скачать библиотеку .zip архивом для ручной установки:
- Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
- Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
- Распаковать и положить в Документы/Arduino/libraries/
- (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек здесь
- Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
- Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
- Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!
При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:
- Версия библиотеки
- Какой используется МК
- Версия SDK (для ESP)
- Версия Arduino IDE
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код