Я начал работать над этим приложением node.js, используя express для отправки данных датчика через http-запрос в мою базу данных (из arduino, чтобы указать c). Основная цель приложения - получить значения датчиков из URL и создать новый документ в моем облачном пожарном хранилище.
var admin = require('firebase-admin');
const functions = require('firebase-functions');
const cors = require('cors')({origin: true});
const express = require('express');
var serviceAccount = require("./minicapcollar-firebase-adminsdk-ovdpm-cda3767493.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://minicapcollar.firebaseio.com"
});
let db = admin.firestore();
const app = express();
app.use(cors);
//Declare the field view for the timestamp
let FieldValue = require('firebase-admin').firestore.FieldValue;
app.get('/send/sensorData', (req, res) => {
var id = 'HpwWiJSGHNbOgJtYi2jM'; //variable to store the id of the collar, TODO: req.query.id
var lat = req.query.lat/1000000;
var lon = req.query.lon/1000000;
var hr = req.query.hr;
var et = req.query.et;
var it = req.query.it;
//Rest of the values
//Declare the index of the collar id
let indexRef = db.collection('dogs').doc(id);
//Declare the index of the position
let posRef = indexRef.collection('position').doc();
//Declare the index of the heartrate
let hrRef = indexRef.collection('heartrate').doc();
//Declare the index of the external temperature
let etRef = indexRef.collection('external_temperature').doc();
//Declare the index of the internal temperature
let itRef = indexRef.collection('temperature').doc();
//Save the current time
var time = FieldValue.serverTimestamp();
//Set position
let setPos = posRef.set({
timestamp: time,
value: new admin.firestore.GeoPoint(lat,lon)
}).then(function() {
console.log("Position data saved to Firestore");
return null;
}).catch(function(error) {
console.log("Got an error: ", error);
});
//Set heartrate
let setHr = hrRef.set({
timestamp: time,
value: hr
}).then(function() {
console.log("Heartrate data saved to Firestore");
return null;
}).catch(function(error) {
console.log("Got an error: ", error);
});
//Set external temperature
let setET = etRef.set({
timestamp: time,
value: et
}).then(function() {
console.log("External temperature data saved to Firestore");
return null;
}).catch(function(error) {
console.log("Got an error: ", error);
});
//Set internal temperature
let setIT = itRef.set({
timestamp: time,
value: it
}).then(function() {
console.log("Data saved to Firestore");
return null;
}).catch(function(error) {
console.log("Got an error: ", error);
});
res.send(`All sensor data sent`);
});
app.get('/send/pos', (req, res) => {
var id = 'HpwWiJSGHNbOgJtYi2jM'; //variable to store the id of the collar, TODO: req.query.id
var lat = req.query.lat/1000000;
var lon = req.query.lon/1000000;
//Rest of the values
//Declare the index of the collar id
let indexRef = db.collection('dogs').doc(id);
//Declare the index of the position
let posRef = indexRef.collection('position').doc();
//Save the current time
var time = FieldValue.serverTimestamp();
//Set position
let setPos = posRef.set({
timestamp: time,
value: new admin.firestore.GeoPoint(lat,lon)
}).then(function() {
console.log("Position data saved to Firestore");
return null;
}).catch(function(error) {
console.log("Got an error: ", error);
});
res.send(`Position sent`);
});
app.get('/send/hr', (req, res) => {
var id = 'HpwWiJSGHNbOgJtYi2jM'; //variable to store the id of the collar, TODO: req.query.id
var hr = req.query.hr;
//Declare the index of the collar id
let indexRef = db.collection('dogs').doc(id);
//Declare the index of the heartrate
let hrRef = indexRef.collection('heartrate').doc();
//Save the current time
var time = FieldValue.serverTimestamp();
//Set heartrate
let setHr = hrRef.set({
timestamp: time,
value: hr
}).then(function() {
console.log("Heartrate data saved to Firestore");
return null;
}).catch(function(error) {
console.log("Got an error: ", error);
});
res.send(setHr & `Heartrate value sent`);
});
app.get('/send/temp', (req, res) => {
var id = 'HpwWiJSGHNbOgJtYi2jM'; //variable to store the id of the collar, TODO: req.query.id
var et = req.query.et;
var it = req.query.it;
//Declare the index of the collar id
let indexRef = db.collection('dogs').doc(id);
//Declare the index of the external temperature
let etRef = indexRef.collection('external_temperature').doc();
//Declare the index of the internal temperature
let itRef = indexRef.collection('temperature').doc();
//Save the current time
var time = FieldValue.serverTimestamp();
//Set external temperature
let setET = etRef.set({
timestamp: time,
value: et
}).then(function() {
console.log("External temperature data saved to Firestore");
return null;
}).catch(function(error) {
console.log("Got an error: ", error);
});
//Set internal temperature
let setIT = itRef.set({
timestamp: time,
value: it
}).then(function() {
console.log("Data saved to Firestore");
return null;
}).catch(function(error) {
console.log("Got an error: ", error);
});
res.send(`Temperature values sent`);
});
exports.app = functions.https.onRequest(app);
Как только я закончил приложение, я протестировал его на своем локальном хосте, и он работал отлично. Я смог без проблем записать новые данные в облачный пожарный магазин. После развертывания приложения при отправке запроса я получаю 403 (ошибка: запрещено. У вашего клиента нет разрешения на получение URL / app / send / pos /? Lat = 11111111 & lon = 22222222 с этого сервера.)
В правилах пожарного депо я указал, что любой может читать и писать, чтобы увидеть, если это было проблемой, но проблема сохраняется.
Я также пытался следовать этому уроку: https://www.youtube.com/watch?v=LOeioOKUKI8, но у меня возникла та же проблема при попытке получить доступ к "http://baseURL.firebaseapp.com/timestamp", при развертывании я получил ошибку 403 (на локальном хосте это тоже отлично работало)
ПРИМЕЧАНИЕ. Это Мой первый опыт работы с node.js, пожалуйста, прости любые плохие практики. Я студент-электрик, поэтому программирование - не моя главная сила. ЗАРАНЕЕ СПАСИБО ЗА ПОМОЩЬ!