You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino能否订阅Firebase Cloud Messaging(FCM)通知并处理消息?

Arduino订阅FCM主题并接收消息实现方案

完全可以实现Arduino订阅FCM主题并接收消息,以此替代轮询实时数据库的低效方案,下面是具体实现步骤和注意事项:

一、依赖库选择

使用Firebase官方的Arduino库(FirebaseESP8266 适配ESP8266,FirebaseESP32 适配ESP32),该库原生支持FCM的主题订阅与消息接收功能。

二、Arduino端实现步骤

1. 基础配置与连接

  • 先完成WiFi连接,再初始化Firebase实例,填入你的项目URL、数据库密钥(或使用匿名认证)。
  • 库会自动生成并维护设备的FCM实例ID,无需手动处理。

2. 订阅FCM主题

调用库的subscribeTopic()方法完成主题订阅,示例代码如下:

if (Firebase.subscribeTopic(firebaseData, "marker_updates")) {
  Serial.println("主题订阅成功");
} else {
  Serial.println("订阅失败: " + firebaseData.errorReason());
}

3. 处理接收的FCM消息

通过设置FCM回调函数,在消息到达时自动触发处理逻辑。回调函数可以解析通知内容或自定义数据字段,执行对应操作:

void fcmCallback(FirebaseData &data) {
  Serial.println("=== 收到FCM消息 ===");
  Serial.print("标题: ");
  Serial.println(data.fcm.notification.title);
  Serial.print("内容: ");
  Serial.println(data.fcm.notification.body);
  
  // 解析自定义标记数据
  if (data.fcm.data.containsKey("marker")) {
    String markerVal = data.fcm.data["marker"];
    Serial.print("标记更新为: ");
    Serial.println(markerVal);
    // 根据标记值执行动作,比如控制LED
    digitalWrite(LED_BUILTIN, markerVal == "ON" ? HIGH : LOW);
  }
}

// 在setup中绑定回调
Firebase.setFCMCallback(fcmCallback);

4. 完整示例代码(ESP8266)

#include <ESP8266WiFi.h>
#include <FirebaseESP8266.h>

#define WIFI_SSID "你的WiFi名称"
#define WIFI_PWD "你的WiFi密码"
#define FIREBASE_HOST "你的Firebase项目URL"
#define FIREBASE_AUTH "你的数据库密钥"

FirebaseData firebaseData;

void fcmCallback(FirebaseData &data) {
  Serial.println("=== 收到FCM消息 ===");
  Serial.print("标题: ");
  Serial.println(data.fcm.notification.title);
  Serial.print("内容: ");
  Serial.println(data.fcm.notification.body);
  
  if (data.fcm.data.containsKey("marker")) {
    String markerVal = data.fcm.data["marker"];
    Serial.print("标记更新: ");
    Serial.println(markerVal);
    digitalWrite(LED_BUILTIN, markerVal == "ON" ? HIGH : LOW);
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  
  // 连接WiFi
  WiFi.begin(WIFI_SSID, WIFI_PWD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi连接成功");
  
  // 初始化Firebase
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
  Firebase.reconnectWiFi(true);
  
  // 设置FCM回调
  Firebase.setFCMCallback(fcmCallback);
  
  // 订阅主题
  if (Firebase.subscribeTopic(firebaseData, "marker_updates")) {
    Serial.println("订阅主题成功");
  } else {
    Serial.println("订阅失败: " + firebaseData.errorReason());
  }
}

void loop() {
  Firebase.loop(); // 必须在loop中调用,处理Firebase事件
}

三、配合实时数据库触发FCM消息

当移动APP修改数据库标记时,需要通过Firebase云函数自动发送FCM主题消息,步骤如下:

1. 编写云函数(Node.js)

创建监听数据库节点更新的触发器,当标记变化时发送FCM消息:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.sendMarkerUpdate = functions.database.ref('/markers/main')
  .onUpdate((change) => {
    const newMarker = change.after.val();
    const message = {
      topic: "marker_updates",
      notification: {
        title: "标记已更新",
        body: `新值: ${newMarker}`
      },
      data: {
        marker: newMarker.toString()
      }
    };
    return admin.messaging().send(message)
      .then(res => {
        console.log("消息发送成功", res);
        return null;
      })
      .catch(err => console.log("发送失败", err));
  });

2. 部署云函数

通过Firebase CLI部署该函数,默认配置下函数已拥有发送FCM消息的权限。

四、注意事项

  • 网络稳定性:FCM基于长连接,WiFi断开后库会自动重连并重新订阅主题,建议在代码中添加WiFi状态检查逻辑。
  • 消息类型:优先使用FCM数据消息,通知消息在部分场景下可能无法触发回调,数据消息可直接获取自定义字段。
  • 库版本:确保使用最新版本的Firebase Arduino库,旧版本可能不支持FCM接收功能。
  • 权限配置:确保Firebase数据库规则允许设备访问,云函数拥有FCM发送权限。

内容的提问来源于stack exchange,提问作者Alladin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:19:53