Как исправить этот формат сообщения Firebase, отправленного из ESP32 (Arduino, ESP-IDF - весь текст, библиотека Firebase не используется) - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь заставить работать этот код ниже, который отлично работал год go в последний раз, когда я его пробовал. После запуска я не получаю уведомления в моем приложении. Использование в Arduino IDE на модуле ESP32. В эскиз, который когда-то работал, не было внесено никаких изменений, кроме обновления токена. Я не получаю сообщение «ошибка Firebase» в последовательном выводе, поэтому при условии отсутствия ошибок.

WiFiClient client;
String serve = "MY SERVER KEY";
String appToken = "MY APP TOKEN";
String data = "{";
data = data + "\"to\": \"" + appToken + "\",";
data = data + "\"notification\": {";
data = data + "\"body\": \"example body\",";
data = data + "\"title\" : \"my title\" ";
data = data + "} }";

Serial.println("Send data...");
if (client.connect("fcm.googleapis.com", 80)) {
  Serial.println("Connected to the server..");
  client.println("POST /fcm/send HTTP/1.1");
  client.println("Authorization: key=" + serve + "");
  client.println("Content-Type: application/json");
  client.println("Host: fcm.googleapis.com");
  client.print("Content-Length: ");
  client.println(data.length());
  client.print("\n");
  client.print(data);
  Serial.println("data");
  Serial.println(data);

}
else {
  Serial.println("firebase error");
}
Serial.println("Data sent...Reading response..");
while (client.available()) {
  char c = client.read();
  Serial.print(c);
}
Serial.println("Finished!");
client.flush();
client.stop();
}

Я только что обновил Firebase в своем приложении и мигрировал на AndroidX и могу получать сообщения, отправленные с консоли Firebase, и я В настоящее время я успешно использую эту библиотеку для отправки и получения уведомлений в моем приложении. Ниже приведен пример, который я использую, и он работает отлично.

#include <WiFi.h>
#include <FirebaseESP32.h>

#define WIFI_SSID "YOUR_WIFI_AP"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"
#define FIREBASE_HOST "YOUR_FIREBASE_PROJECT.firebaseio.com" //Do not include https:// in FIREBASE_HOST
#define FIREBASE_AUTH "YOUR_FIREBASE_DATABASE_SECRET"

#define FIREBASE_FCM_SERVER_KEY "YOUR_FIREBASE_PROJECT_CLOUD_MESSAGING_SERVER_KEY"
#define FIREBASE_FCM_DEVICE_TOKEN_1 "RECIPIENT_DEVICE_TOKEN"
#define FIREBASE_FCM_DEVICE_TOKEN_2 "ANOTHER_RECIPIENT_DEVICE_TOKEN"

FirebaseData firebaseData1;

unsigned long lastTime = 0;

int count = 0;

void sendMessage();

void setup()
{

    Serial.begin(115200);

    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    Serial.print("Connecting to Wi-Fi");
    while (WiFi.status() != WL_CONNECTED)
    {
        Serial.print(".");
        delay(300);
    }
    Serial.println();
    Serial.print("Connected with IP: ");
    Serial.println(WiFi.localIP());
    Serial.println();

    Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
    Firebase.reconnectWiFi(true);

    firebaseData1.fcm.begin(FIREBASE_FCM_SERVER_KEY);

    firebaseData1.fcm.addDeviceToken(FIREBASE_FCM_DEVICE_TOKEN_1);

    firebaseData1.fcm.addDeviceToken(FIREBASE_FCM_DEVICE_TOKEN_2);

    firebaseData1.fcm.setPriority("high");

    firebaseData1.fcm.setTimeToLive(1000);

    sendMessage();
}

void loop()
{

    if (millis() - lastTime > 60 * 1000)
    {
        lastTime = millis();

        sendMessage();
    }
}

void sendMessage()
{

    Serial.println("------------------------------------");
    Serial.println("Send Firebase Cloud Messaging...");

    firebaseData1.fcm.setNotifyMessage("Notification", "Hello World! " + String(count));

    firebaseData1.fcm.setDataMessage("{\"myData\":" + String(count) + "}");

    //if (Firebase.broadcastMessage(firebaseData1))
    //if (Firebase.sendTopic(firebaseData1))
    if (Firebase.sendMessage(firebaseData1, 0))//send message to recipient index 0
    {

        Serial.println("PASSED");
        Serial.println(firebaseData1.fcm.getSendResult());
        Serial.println("------------------------------------");
        Serial.println();
    }
    else
    {
        Serial.println("FAILED");
        Serial.println("REASON: " + firebaseData1.errorReason());
        Serial.println("------------------------------------");
        Serial.println();
    }

    count++;
}

Я попытался отправить код вверху в формате данных и уведомлений с приложением на переднем плане и в фоне и не может получить сообщение. Мне интересно, изменилось ли что-то в формате или правилах Firebase за последний год. Мне нужно использовать код сверху вместо библиотеки, потому что я могу просто добавить еще несколько пар ключ-значение в тело сообщения и также отправить в iOS, что я успешно делал в прошлом, используя тот же код. Я уверен, что пары ключей могут быть добавлены в библиотеку, над которой я сейчас работаю, но я бы предпочел простоту верхнего кода. Буду признателен за любые советы.

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Библиотека Arduino Firebase подключается к Firebase через порт SSL 443 (метод HTTPS) для FCM и RTDB.

Ваше предположение неверно.

Ваш токен устройства недействителен или не существует.

Вам не нужно знать код внутри библиотеки Arduino. Google принимает только безопасное соединение для своих услуг. Проблемами могут быть идентификатор устройства или избыточность данных полезной нагрузки FCM. Вы принимаете свой ответ с вашим собственным предположением. Нет решения для этой проблемы. Вам нужно открыть вопрос в репозитории GitHub.

0 голосов
/ 24 января 2020

Я не уверен, но я полагаю, что проблема может заключаться в том, что код Arduino отправляется через HTTP, а не HTTPS, который я прочитал в документации FB. Требуется HTTPS. Может быть, они изменили это, потому что этот код работал идеально для меня год go. Но я находился в процессе переноса моего кода в ESP-IDF, и эта функция, приведенная ниже, работает без проблем, у которых есть небольшие моды для соответствия C ++, который я использую в PlatformIO / VS Code IDE. Это было единственное, что изменилось:

esp_http_client_config_t config = {};
config.url = "https://fcm.googleapis.com/fcm/send";
config.event_handler = _http_event_handler;

Мне не нужно было никакого типа сертификата SSL, я просто отправил код, как показано. Я не пытался слишком много возиться с кодом Arduino для HTTPS.

static void firebasePost() {
    esp_http_client_config_t config = {}; // important to initialize with "{}" when using C++ on ESP-IDF http client or it will crash easily
    config.url = "https://fcm.googleapis.com/fcm/send";
    config.event_handler = _http_event_handler;
    esp_http_client_handle_t client = esp_http_client_init(&config);
    esp_err_t err = esp_http_client_perform(client);
    const char *post_data = "{\"to\": \"eCiC-20m8Zw:APA91bE4i1rkC(SHORTENED)9JZpbW3gFe5Qfz9BhOFmqua3aeZoDZEQ\",\"notification\": {\"body\": \"Sample Body\",\"title\" : \"Sample Title\"} }";
    esp_http_client_set_header(client, "Authorization", "key=AAAAZrM4XXXX:APA91bFnSr_U15y6mX(SHORTENED)WqaWECxYWaCf_rVPE");
    esp_http_client_set_header(client, "Content-Type", "application/json");
    esp_http_client_set_method(client, HTTP_METHOD_POST);
    esp_http_client_set_post_field(client, post_data, strlen(post_data));
    err = esp_http_client_perform(client);
    if (err == ESP_OK) {
        ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %d",
                 esp_http_client_get_status_code(client),
                 esp_http_client_get_content_length(client));
    } else {
        ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err));
    }
    esp_http_client_cleanup(client);
} 
...