Golang -Bibliothek senden und empfangen Daten über Lora Phy über eine serielle Verbindung zu einem RF95Modem.
Diese Bibliothek wurde gegen das RF95Modem Commit 8f163aa leicht nach Version 0.7.3 getestet.
Der Hauptaugenmerk dieser Bibliothek liegt auf dem Senden und Empfangen von Daten über die physische Schicht Lora Phy von LORA mit Hilfe eines RF95Modems.
Daher ermöglicht das rf95.Modem eine direkte Interaktion mit einem verbundenen RF95Modem, einschließlich Konfigurationsänderungen, Senden und Empfangen von RAW -LORA -Phy -Nachrichten. Zusätzlich ermöglicht der rf95.Stream die Verwendung der bekannten io.Reader und io.Writer -Schnittstellen für den Datenaustausch. Ein rf95.Stream wird als registrierter Handler an den rf95.Modem angeschlossen, wo natürlich auch benutzerdefinierte Handler implementiert und verbunden werden können.
Die folgenden zwei kurzen Code -Beispiele zeigen, wie rf95.Modem und rf95.Stream verwendet werden. Weitere Details finden Sie in der Dokumentation. Es gibt auch Beispielprogramme unter ./cmd , die auch unten beschrieben werden.
// Example of how to use a rf95.Modem to establish a connection, configure the
// rf95modem, send some bytes and wait for the first answere.
package main
import (
"context"
"fmt"
"github.com/dtn7/rf95modem-go/rf95"
)
func checkError ( err error ) {
if err != nil {
panic ( err )
}
}
func main () {
// Create and configure a rf95.Modem for rf95modem usage
modem , err := rf95 . OpenSerial ( "/dev/ttyUSB0" , context . Background ())
checkError ( err )
checkError ( modem . Frequency ( 868.23 ))
checkError ( modem . Mode ( rf95 . FastShortRange ))
// Broadcast a message
_ , err = modem . Transmit ([] byte ( "Hello LoRa PHY from rf95modem{,-go}" ))
checkError ( err )
// Register a handler to print a received message and exit
finChan := make ( chan struct {})
_ , err = modem . RegisterHandlers ( func ( rx rf95. RxMessage ) {
fmt . Printf ( "%#v n " , rx )
close ( finChan )
}, nil )
checkError ( err )
<- finChan
checkError ( modem . Close ())
} // Another example which utilizes a rf95.Stream to send a local files and dump a
// received sample to another file.
package main
import (
"context"
"fmt"
"io"
"os"
"github.com/dtn7/rf95modem-go/rf95"
)
func checkError ( err error ) {
if err != nil {
panic ( err )
}
}
func main () {
// Create and configure a rf95.Modem for rf95modem usage
modem , err := rf95 . OpenSerial ( "/dev/ttyUSB0" , context . Background ())
checkError ( err )
checkError ( modem . Frequency ( 868.23 ))
checkError ( modem . Mode ( rf95 . FastShortRange ))
// Create a rf95.Stream using our modem
stream , err := rf95 . NewStream ( modem )
checkError ( err )
// Send part of our source code over LoRa, because we are so Free(tm)
fOut , err := os . Open ( "rf95/modem.go" )
checkError ( err )
defer fOut . Close ()
n , err := io . Copy ( stream , fOut )
checkError ( err )
fmt . Printf ( "send %d bytes over LoRa n " , n )
// Dump 256 bytes received via LoRa to a tempfile
fIn , err := os . CreateTemp ( "" , "lora_dump_" )
checkError ( err )
defer fIn . Close ()
n , err = io . Copy ( fIn , io . LimitReader ( stream , 256 ))
checkError ( err )
fmt . Printf ( "wrote %d bytes received over LoRa to %s n " , n , fIn . Name ())
checkError ( modem . Close ())
}Ein einfaches Logger -Skript für eingehende Nachrichten mit RSSI und SNR.
$ go build ./cmd/rf95logger
# Logging messages from /dev/ttyUSB0 at 868.1 MHz on mode 1, fast+short range
$ ./rf95logger /dev/ttyUSB0 868.1 1 | tee loralog.csv
Ein kleiner Proof of Concept ist rf95pty , um ein RF95Modem an ein neues pseudoterminales Gerät zu binden. Dieser Code sollte für POSIX -Betriebssysteme funktionieren.
$ go build ./cmd/rf95pty
# Node A provides a shell over LoRa - stupid idea, btw
$ ./rf95pty /dev/ttyUSB0
Starting modem with Status(...)
Opening pty device /dev/pts/5
$ socat /dev/pts/5,raw,nonblock,echo=0 exec:sh,pty,stderr,setsid,sigint,sane
# Node B uses this shell
$ ./rf95pty /dev/ttyUSB1
Starting modem with Status(...)
Opening pty device /dev/pts/7
$ screen /dev/pts/7