/**
* Created by K. Suwatchai (Mobizt)
*
* Email: [email protected]
*
* Github: https://github.com/mobizt/Firebase-ESP-Client
*
* Copyright (c) 2023 mobizt
*
*/
// This example shows how to send JSON payload FCM to the subscribed topic's recipients via legacy API (requires server key).
// Library allows your ESP device to interact with FCM server through FCM Server protocols.
// https://firebase.google.com/docs/cloud-messaging/server#choose
// This means your device now is not a FCM app client and unable to get the notification messages.
// The device registratzion tokens used in this example were taken from the FCM mobile app (Android or iOS)
// or web app that athenticated to your project.
// For FCM client app quick start
// https://github.com/firebase/quickstart-android/tree/master/messaging
// https://github.com/firebase/quickstart-ios
// https://github.com/firebase/quickstart-js
#include <Arduino.h>
#include <WiFi.h>
#include <FirebaseESP32.h>
/* 1. Define the WiFi credentials */
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
/** 2 Define the Firebase project Server Key which must be taken from
* https://console.firebase.google.com/u/0/project/_/settings/cloudmessaging
*
* The API, Android, iOS, and browser keys are rejected by FCM
*
*/
#define FIREBASE_FCM_SERVER_KEY "AAAAkRsuRPA:APA91bENERJI27PTj48A5zZInadnZHDFDVjCeX0L0GK__M64tohLNp-NKm_Y0Tu7YcXkj89PFWRlVSGTcv6Q0ygNR4mlj7iu9weS8ztT_bWkMQ-f_OQ6zP6qXUBXT9fqlUaZbtaID0CR"
// Define Firebase Data object
FirebaseData fbdo;
unsigned long lastTime = 0;
int count = 0;
#if defined(ARDUINO_RASPBERRY_PI_PICO_W)
WiFiMulti multi;
#endif
void sendMessage();
void setup()
{
Serial.begin(115200);
#if defined(ARDUINO_RASPBERRY_PI_PICO_W)
multi.addAP(WIFI_SSID, WIFI_PASSWORD);
multi.run();
#else
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
#endif
Serial.print("Connecting to Wi-Fi");
unsigned long ms = millis();
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
#if defined(ARDUINO_RASPBERRY_PI_PICO_W)
if (millis() - ms > 10000)
break;
#endif
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
Serial.printf("Firebase Client v%s\n\n", FIREBASE_CLIENT_VERSION);
// required for legacy HTTP API
Firebase.FCM.setServerKey(FIREBASE_FCM_SERVER_KEY);
// Comment or pass false value when WiFi reconnection will control by your code or third party library e.g. WiFiManager
Firebase.reconnectNetwork(true);
// Since v4.4.x, BearSSL engine was used, the SSL buffer need to be set.
// Large data transmission may require larger RX buffer, otherwise connection issue or data read time out can be occurred.
fbdo.setBSSLBufferSize(4096 /* Rx buffer size in bytes from 512 - 16384 */, 1024 /* Tx buffer size in bytes from 512 - 16384 */);
sendMessage();
}
void loop()
{
if (millis() - lastTime > 10 * 1000 || lastTime == 0)
{
lastTime = millis();
sendMessage();
}
}
void sendMessage()
{
Serial.print("Send Firebase Cloud Messaging... ");
// Read more details about legacy HTTP API here https://firebase.google.com/docs/cloud-messaging/http-server-ref
FCM_Legacy_HTTP_Message msg;
// please change this topic name to your specific topic to prevent TOPICS_MESSAGE_RATE_EXCEEDED error
msg.targets.to = "/topics/weather";
msg.options.time_to_live = "1000";
msg.options.priority = "high";
msg.payloads.notification.title = "Notification title";
msg.payloads.notification.body = "Notification body";
msg.payloads.notification.icon = "myicon";
msg.payloads.notification.click_action = "OPEN_ACTIVITY_1";
FirebaseJson payload;
// all data key-values should be string
payload.add("temp", "28");
payload.add("unit", "celsius");
payload.add("timestamp", "1609815454");
msg.payloads.data = payload.raw();
if (Firebase.FCM.send(&fbdo, &msg)) // send message to recipient
Serial.printf("ok\n%s\n\n", Firebase.FCM.payload(&fbdo).c_str());
else
Serial.println(fbdo.errorReason());
count++;
}