我创建了一个连接到MQTT代理的云函数我使用了第三方MQTT代理(Mosquito MQTT broker),每次MQTT broker从机器上接收到数据,都会将数据发送到Firebase实时数据库,我是使用GCP控制台编写和部署的,我部署成功,没有出现任何错误,但是在GCP控制台测试的时候,它开始发送数据,但在超时中指定的时间后停止。我尝试了从60到540秒的超时值,但它仍然在指定的时间后停止。我还增加了分配的内存,但它没有解决这个问题,我一直得到相同的超时错误。这是我的代码
const Admin = require("firebase-admin");
const functions = require("firebase-functions");
const mqtt = require('mqtt');
const clientId = 'mqtt_googleserver_********7'
const topic = '#'
const serviceAccount = require("./service.json");
Admin.initializeApp({
credential: Admin.credential.cert(serviceAccount),
databaseURL: "https://***************firebaseio.com/"
});
exports.rtdb_mains = functions.https.onRequest((_request, _response) => {
const client = mqtt.connect('mqtt://**.**.**.****.***',{
clientId,
clean: true,
connectTimeout: 4000,
username: '******',
password: '********',
reconnectPeriod: 1000,
});
const db = Admin.database();
client.addListener('connect', () => {
console.log('Connected');
client.subscribe([topic], { qos: 1 });
console.log(`Subscribe to topic '${topic}'`);
});
client.on('message', async (topic, payload) => {
console.log('Received Message:', topic, payload.toString());
if (payload.toString() !== "" && topic !== "") {
const ref = db.ref("All_machines");
const childref = ref.child(topic.toString());
await childref.set(payload.toString());
const topicDetails = topic.split("/");
const machineId = topicDetails[1];
const machineParameter = topicDetails[2];
if (machineParameter === "BoardID") {
const ref = db.ref(machineParameter);
await ref.set(machineId);
}
}
});
});
有谁能帮我解决这个问题吗?
1条答案
按热度按时间jq6vz3qz1#
推送CF on firebase不需要指定service.json,直接使用默认配置即可:
第二,你使用MQTT实现和cloud函数的方式不正确。你正在监听和等待一个只能由POST或GET请求触发的函数中的消息。我建议使用pub/sub API来做这样的事情,并有一个好的发送/接收消息的实现。
如果您确实需要在MQTT实现中侦听消息,您将需要除Cloud Function之外的其他提供程序,或者调用Cloud Function的原生MQTT
https://cloud.google.com/functions/docs/calling/pubsub
https://www.googlecloudcommunity.com/gc/Serverless/Can-a-cloud-function-subscribe-to-an-MQTT-topic/m-p/402965