Библиотека Golang для отправки и получения данных через Lora Phy через серийное соединение с RF95Modem.
Эта библиотека была протестирована против Commit rf95modem 8f163aa , немного после версии 0.7.3.
Основной целью этой библиотеки является отправка и получение данных через физический слой Лоры, Лора Фа, с помощью RF95Modem.
Поэтому rf95.Modem позволяет прямое взаимодействие с подключенным RF95Modem, включая изменения конфигурации, отправку и получение необработанных сообщений Lora PHY. Кроме того, rf95.Stream позволяет использовать известные интерфейсы io.Reader и io.Writer для обмена данными. rf95.Stream подключен к rf95.Modem как зарегистрированный обработчик, где, конечно, пользовательские обработчики также могут быть реализованы и подключены.
Следующие два примера коротких кодов демонстрируют, как использовать rf95.Modem и rf95.Stream сверху. Более подробная информация доступна в документации. Существуют также примеры программы, доступные в соответствии с ./cmd , которые также описаны ниже.
// 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 ())
}Простой скрипт регистрации для входящих сообщений с их RSSI и 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
Небольшое доказательство концепции - rf95pty , чтобы связать RF95Modem с новым псевдотермическим устройством. Этот код должен работать в операционных системах 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