Perpustakaan Golang Untuk mengirim dan menerima data melalui Lora Phy melalui koneksi serial ke RF95Modem.
Perpustakaan ini diuji terhadap RF95Modem Commit 8f163aa , sedikit setelah versi 0.7.3.
Fokus utama perpustakaan ini adalah mengirim dan menerima data melalui lapisan fisik Lora, Lora Phy, dengan bantuan RF95Modem.
Oleh karena itu rf95.Modem memungkinkan interaksi langsung dengan RF95MODEM yang terhubung, termasuk perubahan konfigurasi, mengirim, dan menerima pesan Lora Phy mentah. Selain itu rf95.Stream memungkinkan penggunaan antarmuka io.Reader dan io.Writer yang diketahui untuk pertukaran data. rf95.Stream terhubung ke rf95.Modem sebagai penangan terdaftar, di mana, tentu saja, penangan khusus juga dapat diimplementasikan dan terhubung.
Dua contoh kode pendek berikut menunjukkan cara menggunakan rf95.Modem dan rf95.Stream di atas. Rincian lebih lanjut tersedia dalam dokumentasi. Ada juga contoh program yang tersedia di bawah ./cmd , yang juga dijelaskan di bawah ini.
// 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 ())
}Skrip logger sederhana untuk pesan yang masuk dengan RSSI dan SNR mereka.
$ 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
Bukti kecil konsep adalah rf95pty untuk mengikat RF95MODEM ke perangkat pseudoterminal baru. Kode ini harus berfungsi untuk sistem operasi 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