Я пытаюсь настроить сеть связи LoRa.
У меня есть модуль шлюза RHF0M301-915, PRI 2 Bridge RHF4T002 с Raspberry Pi 3 B (в качестве шлюза Lora);доска seeeduino с GPS, RHF76-052AM.
Оба зарегистрированы на сервере Loriot.
Мне удалось отправить данные GPS с платы seeeduino на приборную панель сервера Loriot методом ABP.Я хочу вывести данные в мое мобильное приложение для Android, чтобы показать пользователям, где находится конечный узел на карте.
Я решил использовать HTTP Push (один из вариантов вывода, предоставляемых сервером Loriot).
Я следовал этим рекомендациям .
Я смог отправить данные GPS на сервер Loriot, но HTTP-push не может отправить данные на листы Google, созданные в соответствии с инструкциями.В журнале сервера Loriot появляются следующие сообщения об ошибках:
Сообщение об ошибке POSTing |"err": "сообщение POSTing для \" https://script.google.com/macros/s/AKfycbyUaIl4t8PZxoXswCW2kc0I-ZfUl5DVucsD0CwtW3Rn4YAP2qpo/exec\" не выполнено с кодом состояния 302 "," appid ": 3195667320," url ":" https://script.google.com/macros/s/AKfycbyUaIl4t8PZxoXswCW2kc0I-ZfUl5DVucsD0CwtW3Rn4YAP2qpo/exec","seqno":132,"deveui":"4786C58B003C002A","data":{"statusCode":302},"message":"POSTing сообщение для \ "https://script.google.com/macros/s/AKfycbyUaIl4t8PZxoXswCW2kc0I-ZfUl5DVucsD0CwtW3Rn4YAP2qpo/exec\"ошибка с кодом состояния 302 "," targetUrl ":" https://script.google.com/macros/s/AKfycbyUaIl4t8PZxoXswCW2kc0I-ZfUl5DVucsD0CwtW3Rn4YAP2qpo/exec","statusCode":302,"reqBody":null,"errName":"Error","instance":"nwk-1"
Следующий код отправил данные на лист Google:
// 2017 by Daniel Eichhorn, https://blog.squix.org
// Inspired by https://gist.github.com/bmcbride/7069aebd643944c9ee8b
// Create or open an existing Sheet and click Tools > Script editor and enter the code below
// 1. Enter sheet name where data is to be written below
var SHEET_NAME = "Sheet1";
// 2. Publish > Deploy as web app
// - enter Project Version name and click 'Save New Version'
// - set security level and enable service (most likely execute as 'me' and access 'anyone, even anonymously)
// 3. Copy the 'Current web app URL' and post this in your form/script action
var SCRIPT_PROP = PropertiesService.getScriptProperties(); // new property service
// If you don't want to expose either GET or POST methods you can comment out the appropriate function
function doGet(e){
return handleResponse(e);
}
function doPost(e){
return handleResponse(e);
}
function handleResponse(e) {
Logger.log("arrived in handleResponse");
var jsonData = JSON.parse(e.postData.contents);
try {
// next set where we write the data - you could write to multiple/alternate destinations
var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
var sheet = doc.getSheetByName(SHEET_NAME);
var nextRow = sheet.getLastRow()+1; // get next row
var row = [];
var headerRow = [];
row.push(jsonData.rssi);
row.push(jsonData.seqno);
row.push(jsonData.data);
var humidityHex = jsonData.data.substring(0, 2);
row.push(parseInt(humidityHex, 16));
var tempHex = jsonData.data.substring(2, 4);
row.push(parseInt(tempHex, 16) - 100);
var latHex = jsonData.data.substring(4, 10);
var lonHex = jsonData.data.substring(10, 16);
var latEncoded = parseInt(latHex, 16);
var lonEncoded = parseInt(lonHex, 16);
row.push((latEncoded / 8388606) * 90);
row.push((lonEncoded / 8388606) * 180);
row.push(jsonData.freq);
row.push(jsonData.ack);
row.push(jsonData.fcnt);
row.push(jsonData.dr);
row.push(jsonData.bat);
row.push(jsonData.port);
row.push(jsonData.snr);
row.push(jsonData.EUI);
row.push(jsonData.cmd);
row.push(jsonData.ts);
// more efficient to set values as [][] array than individually
sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
// return json success results
return ContentService
.createTextOutput(JSON.stringify({"result":"success", "row": nextRow}))
.setMimeType(ContentService.MimeType.JSON);
} catch(e) {
// if error return this
return ContentService
.createTextOutput(JSON.stringify({"result":"error", "error": e}))
.setMimeType(ContentService.MimeType.JSON);
}
}
Этот код дает команду плате seeeduino отправлять данные gps на сервер Loriot.
#include <TinyGPS++.h>
#include <LoRaWan.h>
#include "DHT.h"
TinyGPSPlus gps;
#define DHTPIN A0 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
char buffer[256];
void setup(void)
{
SerialUSB.begin(115200);
Serial.begin(9600);
lora.init();
memset(buffer, 0, 256);
lora.getVersion(buffer, 256, 1);
SerialUSB.print(buffer);
memset(buffer, 0, 256);
lora.getId(buffer, 256, 1);
SerialUSB.print(buffer);
SerialUSB.println("That was the id");
// void setId(char *DevAddr, char *DevEUI, char *AppEUI);
lora.setId("00C4E57D", "4786C58B003C002A", "526973696E674846");
// setKey(char *NwkSKey, char *AppSKey, char *AppKey);
lora.setKey("2B7E151628AED2A6ABF7158809CF4F3C", "2B7E151628AED2A6ABF7158809CF4F3C", "8413360695ABE271EB2A515386F0093E ");
lora.setDeciveMode(LWOTAA);
lora.setDataRate(DR2, AS923);
lora.setChannel(0, 923.0);
lora.setChannel(1, 923.2);
lora.setChannel(2, 923.4);
lora.setChannel(3, 923.6);
lora.setChannel(4, 923.8);
lora.setChannel(5, 924.0);
lora.setChannel(6, 924.2);
lora.setChannel(7, 924.4);
lora.setReceiceWindowFirst(2, 923.0);
lora.setReceiceWindowSecond(923.2, DR2);
lora.setAdaptiveDataRate(false);
lora.setPower(10);
while(!lora.setOTAAJoin(JOIN, 20000));
SerialUSB.println("After OTAA join");
// Start DHT sensor
dht.begin();
}
void loop(void)
{
while (Serial.available() > 0) {
gps.encode(Serial.read());
}
if (gps.altitude.isUpdated()) {
SerialUSB.println(gps.altitude.meters());
SerialUSB.print("LAT="); SerialUSB.println(gps.location.lat(), 6);
SerialUSB.print("LONG="); SerialUSB.println(gps.location.lng(), 6);
SerialUSB.print("ALT="); SerialUSB.println(gps.altitude.meters());
long latEncoded = (gps.location.lat() * 8388606) / 90;
long lonEncoded = (gps.location.lng() * 8388606) / 180;
SerialUSB.print("Lat encoded: ");
SerialUSB.println(latEncoded);
SerialUSB.print("Lon encoded: ");
SerialUSB.println(lonEncoded);
float h = dht.readHumidity();
float t = dht.readTemperature();
SerialUSB.print("Humidity is: ");
SerialUSB.print(h);
SerialUSB.print(", Temperature: ");
SerialUSB.print(t);
bool result = false;
byte data[10] = {0};
data[0] = h;
data[1] = t + 100;
data[2] = (byte) (latEncoded >> 16);
data[3] = (byte) (latEncoded >> 8);
data[4] = (byte) latEncoded;
data[5] = (byte) (lonEncoded >> 16);
data[6] = (byte) (lonEncoded >> 8);
data[7] = (byte) lonEncoded;
result = lora.transferPacket(data, 10);
//result = lora.transferPacket(data, 10, 10);
if(result)
{
short length;
short rssi;
memset(buffer, 0, 256);
length = lora.receivePacket(buffer, 256, &rssi);
if(length)
{
SerialUSB.print("Length is: ");
SerialUSB.println(length);
SerialUSB.print("RSSI is: ");
SerialUSB.println(rssi);
SerialUSB.print("Data is: ");
for(unsigned char i = 0; i < length; i ++)
{
SerialUSB.print("0x");
SerialUSB.print(buffer[i], HEX);
SerialUSB.print(" ");
}
SerialUSB.println();
}
delay(1000 * 60 * 5);
}
}
}
Как я могу обработать код состояния 302, я знаю, что это связано с перенаправлением целевого URL, который я использовал, на какой-то временный URL.Но я понятия не имею, как с этим справиться.