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
相关产品推荐
相关产品推荐

