LoRaSimpleGateway测试
2018-09-21 本文已影响14人
小鱼儿他老汉
还是基于Sandee Mistry的LoRa Arduino库和例子。稍作GPIO适配,几乎立刻就直接运行起来了。好简单!
不过Arduino官方源下载的库0.5.0无法直接使用,需要用Github中Checkout最新的库后手动更新到Arduino IDE中。主要是增加了几个函数。
代码
/*
LoRa Simple Gateway/Node Exemple
This code uses InvertIQ function to create a simple Gateway/Node logic.
Gateway - Sends messages with enableInvertIQ()
- Receives messages with disableInvertIQ()
Node - Sends messages with disableInvertIQ()
- Receives messages with enableInvertIQ()
With this arrangement a Gateway never receive messages from another Gateway
and a Node never receive message from another Node.
Only Gateway to Node and vice versa.
This code receives messages and sends a message every second.
InvertIQ function basically invert the LoRa I and Q signals.
See the Semtech datasheet, http://www.semtech.com/images/datasheet/sx1276.pdf
for more on InvertIQ register 0x33.
created 05 August 2018
by Luiz H. Cassettari
*/
#include <SPI.h> // include libraries
#include <LoRa.h>
const long frequency = 915E6; // LoRa Frequency
#if(0)
const int csPin = 10; // LoRa radio chip select
const int resetPin = 9; // LoRa radio reset
const int irqPin = 2; // change for your board; must be a hardware interrupt pin
#endif
const int csPin = D10; // LoRa radio chip select
const int resetPin = A0; // LoRa radio reset
const int irqPin = D2; // change for your board; must be a hardware interrupt pin
void setup() {
Serial.begin(9600); // initialize serial
while (!Serial);
LoRa.setPins(csPin, resetPin, irqPin);
if (!LoRa.begin(frequency)) {
Serial.println("LoRa init failed. Check your connections.");
while (true); // if failed, do nothing
}
Serial.println("LoRa init succeeded.");
Serial.println();
Serial.println("LoRa Simple Gateway");
Serial.println("Only receive messages from nodes");
Serial.println("Tx: invertIQ enable");
Serial.println("Rx: invertIQ disable");
Serial.println();
LoRa.onReceive(onReceive);
LoRa_rxMode();
}
void loop() {
if (runEvery(5000)) { // repeat every 5000 millis
String message = "HeLoRa World! ";
message += "I'm a Gateway! ";
message += millis();
LoRa_sendMessage(message); // send a message
Serial.println("Send Message!");
}
}
void LoRa_rxMode(){
LoRa.disableInvertIQ(); // normal mode
LoRa.receive(); // set receive mode
}
void LoRa_txMode(){
LoRa.idle(); // set standby mode
LoRa.enableInvertIQ(); // active invert I and Q signals
}
void LoRa_sendMessage(String message) {
LoRa_txMode(); // set tx mode
LoRa.beginPacket(); // start packet
LoRa.print(message); // add payload
LoRa.endPacket(); // finish packet and send it
LoRa_rxMode(); // set rx mode
}
void onReceive(int packetSize) {
String message = "";
while (LoRa.available()) {
message += (char)LoRa.read();
}
Serial.print("Gateway Receive: ");
Serial.println(message);
}
boolean runEvery(unsigned long interval)
{
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
return true;
}
return false;
}
LoRaSimpleGateway/LoRaSimpleNode是需要配对使用的,感觉上和PingPong程序差别不大,而且SimpleGateway也没有任何配置代码,无非就是最简单的把信息打印到终端中。而交由主机端来做一些信息的封装,转发给网络服务器。这些任务交给 Node.js/Twisted/Tornado/Netty 这种异步框架就好了。
LoRaWAN网关
接下来测试符合LoRaWAN规格的网关。
硬件种类:
- SX1301 + RPi,最专业,成本最高
- SX127X + RPi,较为简单,成本较低
- SX127X + SPI/USB + RPi,较为简单,成本较低
- SX127X + ESP8266/ESP32,较为简单,成本最低
- SX127X + STM32 + RPi,较为复杂,成本中性,通用性高
软件、固件平台:
- Embedded C for MCU
- Embedded C++ for MCU
- ARM mbed
- Arduino
- WiringPi
- Python
- Node.js
- Lua
- Shell
- Docker