Когда я отправляю данные в Arduino UNO с помощью Firebase CLI в базу данных Cloud Firestore, я получаю сообщение об ошибке 404 - PullRequest
0 голосов
/ 29 января 2020

Я хочу отправить данные в базу данных Cloud Firestore с помощью модуля Sim808 GPRS и Arduino UNO.

Код, который я загрузил в Arduino, выглядит следующим образом:

  #include <DFRobot_sim808.h>
  #include <SoftwareSerial.h>

  #define PIN_TX    10
  #define PIN_RX    11
  SoftwareSerial mySerial(PIN_TX,PIN_RX);
  DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,

  char http_cmd[] = "GET /add?lat=45.23164&long=42.45737&date=29.01.2020 HTTP/1.0\r\n\r\n";
  char buffer2[512];

  void setup(){
    mySerial.begin(9600);
    Serial.begin(9600);

    //******** Initialize sim808 module *************
    while(!sim808.init()) {
        delay(1000);
        Serial.print("Sim808 init error\r\n");
    }
    delay(3000);

    //*********** Attempt DHCP *******************
    while(!sim808.join(F("cmnet"))) {
        Serial.println("Sim808 join network error");
        delay(2000);
    }

    //************ Successful DHCP ****************
    Serial.print("IP Address is ");
    Serial.println(sim808.getIPAddress());

    //*********** Establish a TCP connection ************
    if(!sim808.connect(TCP,"us-central1-myprojectname.cloudfunctions.net", 80)) {
        Serial.println("Connect error");
    }else{
        Serial.println("Connect mbed.org success");
    }

    //*********** Send a GET request *****************
    Serial.println("waiting to fetch...");
    sim808.send(http_cmd, sizeof(http_cmd)-1);
    while (true) {
        int ret = sim808.recv(buffer2, sizeof(buffer2)-1);
        if (ret <= 0){
            Serial.println("fetch over...");
            break;
        }
        buffer2[ret] = '\0';
        Serial.print("Recv: ");
        Serial.print(ret);
        Serial.println(" bytes: ");
        Serial.println(buffer2);
        break;
    }

    //************* Close TCP or UDP connections **********
    sim808.close();

    //*** Disconnect wireless connection, Close Moving Scene *******
    sim808.disconnect();
  }

  void loop(){

  }

Затем я создал Firebase Функции проекта с использованием Firebase CLI и кодов, которые я написал в файле index. js, выглядят следующим образом:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const express = require('express');
const app = express();

admin.initializeApp();
var fs = admin.firestore();
app.get("/",(req,res)=>{
    var lat = req.param("lat");
    var long = req.param("long");
    var date = req.param("date");
    fs.collection("locations").add({
        "date":date,
        "lat":lat,
        "long":long
    }).then(()=>{
            res.send("Location :"+lat+","+long);
            return null;
    }).catch((err)=>{
        console.log(err);
        res.send("Error");

    });
});

exports.add = functions.https.onRequest(app);

Затем я получаю ссылку с помощью команды "firebase-deploy". Ссылка на консоль проекта выглядит следующим образом: "https://us-central1-myprojectname.cloudfunctions.net/add?lat=42.23164&long=43.45737&date=29.01.2020"

Наконец, я наблюдаю за Arduino UNO на экране последовательного порта. Но я получаю 404 (Не найдено) ошибку.

Примечание: Когда я go на ссылку с браузером, я могу добавить новые записи в базу данных Firestore.

Почему я получил ошибку 404 (не найдено)? Вы можете помочь мне? Заранее спасибо.

1 Ответ

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

Ваш клиентский запрос слишком прост c. В основном вы используете эту строку в качестве реализации протокола HTTP:

GET /add?lat=45.23164&long=42.45737&date=29.01.2020 HTTP/1.0

Это не будет работать для большинства размещенных служб, которые используют псевдонимы DNS для размещения нескольких сайтов за одним IP-адресом. Сервер на самом деле не знает, на какой проект Cloud Functions вы ссылаетесь.

В идеале вы должны найти и использовать соответствующую клиентскую библиотеку HTTP, которая знает, как делать запросы к современным HTTP-сервисам. Но если вы действительно не можете этого сделать, вы должны хотя бы отправить заголовок Host с вашим запросом, чтобы Cloud Functions могли идентифицировать ваш проект с помощью хоста DNS, назначенного вашему проекту:

GET /add?lat=45.23164&long=42.45737&date=29.01.2020 HTTP/1.0
Host: us-central1-myprojectname.cloudfunctions.net
...