ห้องสมุด Golang เพื่อส่งและรับข้อมูลผ่าน Lora Phy ผ่านการเชื่อมต่ออนุกรมกับ RF95Modem
ห้องสมุดนี้ได้รับการทดสอบกับ RF95Modem ที่กระทำ 8f163aa เล็กน้อยหลังจากเวอร์ชัน 0.7.3
จุดสนใจหลักของห้องสมุดนี้คือการส่งและรับข้อมูลผ่านเลเยอร์ทางกายภาพของ Lora Lora PHY ด้วยความช่วยเหลือของ 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 ())
}สคริปต์ Logger อย่างง่ายสำหรับข้อความขาเข้าด้วย 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 กับอุปกรณ์ pseudoterminal ใหม่ รหัสนี้ควรใช้งานได้กับระบบปฏิบัติการ 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