rf95modem go
1.0.0
RF95Modemへのシリアル接続を介して、Lora Phyを介してデータを送信および受信するGolangライブラリ。
このライブラリは、バージョン0.7.3のわずかに後、RF95Modemコミット8f163aaに対してテストされました。
このライブラリの主な焦点は、RF95Modemの助けを借りて、Loraの物理層であるLora Phyを介してデータを送信および受信することです。
したがって、 rf95.Modem 、構成の変更、送信、Raw Lora Phyメッセージの受信など、接続されたRF95Modemとの直接的な相互作用を可能にします。さらに、 rf95.Streamでは、データ交換用の既知のio.Readerおよびio.Writerインターフェイスを使用できます。 rf95.Streamは、 rf95.Modemに登録ハンドラーとしてフックされます。もちろん、カスタムハンドラーも実装および接続できます。
次の2つの短いコードの例は、 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
概念の小さな証明は、rf95modemを新しい擬似テルミナルデバイスに結合するためのrf95ptyです。このコードは、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