Bibliothèque Golang pour envoyer et recevoir des données sur Lora Phy via une connexion série à un RF95Modem.
Cette bibliothèque a été testée contre le RF95Modem Commit 8f163aa , légèrement après la version 0.7.3.
L'objectif principal de cette bibliothèque est d'envoyer et de recevoir des données via la couche physique de Lora, Lora Phy, à l'aide d'un RF95Modem.
Par conséquent, le rf95.Modem permet une interaction directe avec un RF95Modem connecté, y compris les modifications de configuration, l'envoi et la réception de messages RAW LORA Phy. De plus, le rf95.Stream permet d'utiliser les interfaces io.Reader et io.Writer connues pour l'échange de données. Un rf95.Stream est accroché au rf95.Modem en tant que gestionnaire enregistré, où, bien sûr, les gestionnaires personnalisés peuvent également être implémentés et connectés.
Les deux exemples de code court suivants montrent comment utiliser rf95.Modem et rf95.Stream en haut. Plus de détails sont disponibles dans la documentation. Il existe également des exemples de programmes disponibles sous ./cmd , qui sont également décrits ci-dessous.
// 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 ())
}Un script d'enregistrement simple pour les messages entrants avec leur RSSI et 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
Une petite preuve de concept est rf95pty pour lier un RF95Modem à un nouveau dispositif pseudotermiminal. Ce code devrait fonctionner pour les systèmes d'exploitation POSIX.
$ 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