rf95modem go
1.0.0
Golang 라이브러리는 RF95Modem과의 연속 연결을 통해 LORA PHY에 대한 데이터를 보내고받습니다.
이 라이브러리는 버전 0.7.3 이후 약간의 RF95Modem Commit 8f163aa 에 대해 테스트되었습니다.
이 라이브러리의 주요 초점은 RF95Modem의 도움으로 LORA의 물리적 층 Lora Phy를 통해 데이터를 보내고받는 것입니다.
따라서 rf95.Modem 구성 변경, 전송 및 원시 LORA PHY 메시지를 포함하여 연결된 RF95MODEM과 직접 상호 작용할 수 있습니다. 또한 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를 새로운 의사 테마 장치에 바인딩하는 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