Ini adalah kumpulan skrip Python (2 selesai, masih berkembang, lebih banyak yang akan datang) dan info lainnya tentang papan pelarian RAK3272S. Untuk saat ini ia hadir dengan firmware AT. Karena STM32WL adalah chip baru, agak rumit untuk mengatur lingkungan untuk menulis kode C ++ untuk itu (saya sudah melihat STM32Cubeide, dan saya masih pusing dari menyelam dalam ...), jadi untuk saat ini saya fokus pada penulisan kode yang membuat menggunakan firmware AT sedikit lebih tidak menyakitkan dan lebih ramah pengguna.
STM32WL telah ditambahkan ke STM32 Arduino BSP, tanpa bagian Lora. Setelah Lora tersedia, saya akan port firmware Lora minimal saya ke chip ini, dan kami akan dapat menggunakan sesuatu yang sedikit kurang kludgy. Di antaranya, saya akan mengerjakan alat yang meniru perilaku Lora minimal.
Ada 2 skrip yang melakukan satu hal masing -masing hanya: menerima atau mengirim. Cara firmware AT diatur untuk P2P, agak rumit untuk memiliki keduanya. Pada dasarnya, firmware menempatkan chip dalam mode TX, dan jika Anda ingin menerima, Anda harus memberi tahu firmware, memberikan nilai batas waktu (ide bodoh jika Anda bertanya kepada saya). Ini adalah nilai 16-bit, jadi nilai maksimal, 65535, berarti menunggu selamanya. Hal lain, menunggu jumlah milidetik sebesar itu. Pfffrt. Tapi apa yang lebih buruk, bahkan jika Anda berada dalam mode "tunggu selamanya", setelah Anda menerima garis, Anda kembali ke mode TX. Itu adalah kekejaman yang tidak biasa.
Jadi saya memiliki dua papan pelarian, dan masing -masing terhubung ke komputer yang menjalankan satu skrip. Saat startup, skrip menempatkan firmware dalam mode P2P, mengatur parameter (frekuensi, SF, BW, dll) dan mengatur mode TX atau RX. Penerima akan diatur ulang untuk menerima mode setiap kali pesan diterima.
Karena 2 ini beroperasi di jaringan perangkat Bastwan yang sama yang saya miliki, saya perlu meniru protokol:
UUID , from dan kunci cmd . Setelah itu, mungkin ada atau mungkin tidak ada kunci lain. Pengirim tidak menambahkan apa pun, tetapi beberapa perangkat Bastwan saya melakukannya. Penerima tahu apa yang harus ditampilkan. Ini juga mencatat waktu paket sehingga Anda dapat menyimpan log paket.Secara keseluruhan, mereka sudah melakukan sedikit. Saya ingin menggabungkannya, dan menambahkan lebih banyak opsi minimal_lora. Solusi yang lebih kuat dapat melibatkan pembuatan aplikasi GUI di Xojo. Kita akan lihat ...

Saya menambahkan skrip baru, RAK3272S_Minimal_LoRa.py , yang meniru firmware BastWAN_Minimal_LoRa sampai batas tertentu, dan saya telah memiliki lebih banyak masalah dengan kombinasi SF/BW terkait dengan muatan. Di SF 10, BW 7 (125 kHz), paket yang dikirim dari perangkat Bastwan diterima oleh seluruh jaringan, baik Bastwan dan RAK3272S. Di sisi lain, paket yang dikirim oleh RAK3272S tidak diterima, sama sekali, oleh perangkat Bastwan, dan kacau di RAK3272 lainnya. Memeriksa SDR saya, ada sesuatu yang memang dikirim, tetapi perangkat Bastwan bahkan tidak bereaksi terhadapnya. Saya pikir firmware AT, atau perangkat keras itu sendiri, jauh lebih ketat daripada yang dibutuhkan ketika datang ke batasan muatan: setelah semua, jika RAK3272 dapat menerima muatan panjang (~ 180 byte), itu harus dapat mengirimnya juga (dan mereka sedikit lebih pendek, sekitar 160 byte).
Jadi sementara saya berunding dengan tim produk, saya telah mengubah kombo SF/BW menjadi SF 10, BW 9 (500 kHz) dan paket panjang bekerja dengan baik sekarang. SF 9, BW 7 juga tampaknya berhasil. Saya menambahkan berbagai file json prefs untuk pengujian. Anda dapat memilih file prefs saat diluncurkan dengan melakukan:
python3 RAK3272S_Minimal_LoRa.py /dev/tty.usbserial-A901LHDG sf9bw7.json
Saya telah menambahkan beberapa perintah dari minimal_lora:
knownFunctions = [
[ "/p" , sendPing , 0 ], [ "/>" , sendMsg , 1 ], [ "/hm" , setHmac , 1 ],
[ "/cr" , setCr , 1 ], [ "/tx" , setTx , 1 ], [ "/bw" , setBw , 1 ],
[ "/sf" , setSf , 1 ], [ "/r" , setRP , 1 ], [ "/fq" , setFq , 1 ],
[ "/as" , setAs , 1 ], [ "/e" , setEnc , 1 ], [ "/dn" , setDeviceName , 1 ],
[ "/PW" , setPwd , 1 ], [ "/save" , savePrefs , 0 ], [ "/msl" , sendMSL , 1 ],
[ "/gps" , setGPS , 1 ], [ "/help" , showHelp , 0 ]
]Ini masih agak rapuh, tetapi tampaknya bekerja dengan cukup baik! Selamat bersenang-senang!


Menambahkan fungsi calcMaxPayload() yang menghitung muatan maksimum yang dapat Anda kirim berdasarkan konfigurasi SF/BW. Mengembalikan -1 jika (seharusnya) tidak valid. Data yang bersumber dari TTN. Perhitungan ini ditampilkan saat memanggil packOptions() , yaitu ketika mengatur ulang opsi untuk chip.
Saya memperbaiki bagian kode yang menguraikan input pengguna dan mengevaluasi perintah. Perintah, FN yang relevan, dan apakah mereka membutuhkan argumen atau tidak, disimpan dalam array, knownFunctions . Fungsi, testFn(line) , mem -parsing array, dan jika menemukan kecocokan, memanggil fungsi yang relevan. Ini membuatnya lebih mudah untuk menambahkan perintah.
knownFunctions = [
# Updated list as of 2021/08/05
[ "/p" , sendPing , 0 ], [ "/>" , sendMsg , 1 ], [ "/hm" , setHmac , 1 ],
[ "/cr" , setCr , 1 ], [ "/tx" , setTx , 1 ], [ "/bw" , setBw , 1 ],
[ "/sf" , setSf , 1 ], [ "/r" , setRP , 1 ], [ "/fq" , setFq , 1 ],
[ "/as" , setAs , 1 ], [ "/e" , setEnc , 1 ], [ "/dn" , setDeviceName , 1 ],
[ "/PW" , setPwd , 1 ], [ "/save" , savePrefs , 0 ]
]
def testFn ( line ):
# This function takes one line from user input
# And looks for a know command (see above)
# If the command requires no arguments, 3rd value
# in the array is 0, and the Fn is called as is.
# Or the remainder of the line is passed as argument.
# eg:
# '/p' PING, no argument need. ["/p", sendPing, 0]
# '/fq' Set Frequency, frequency needs to be passed: ["/fq", setFq, 1]
global knownFunctions
for x in knownFunctions :
if line . startswith ( x [ 0 ]):
if x [ 2 ] == 0 :
x [ 1 ]()
else :
param = line [ len ( x [ 0 ]):]
x [ 1 ]( param )
return
print ( "Unknown command!" )Saya menambahkan beberapa perintah:
/e0 ~ /e1 mematikan AE atau aktif/PWxxxxxx mengatur kata sandi ke xxxx/dnxxxxxx mengatur nama perangkat ke xxxx/save hemat prefs ke file prefs saat ini 

Mencegat serial.SerialException . Kode ada dengan cara yang jauh lebih bersih.

Porting fungsi C ++ hexDump() saya ke Python untuk menampilkan paket dalam bentuk hex untuk tujuan debug. Dipanggil hanya selama sendPacket() untuk saat ini, tetapi harus ditambahkan nanti di beberapa tempat lain. Akhirnya, itu akan dibuat opsional dengan define #DEBUG -seeffe.
Fungsi ini telah diperbarui untuk memungkinkan buffer lama dari 256 byte.


Saya menambahkan log: acara utama (menyimpan prefs, paket pengiriman/penerima) dicatat ke file log baru, dibuat pada waktu startup dari uuid acak: Log_<UUID>.log . Saya akan fungsionalitas ini opsional, tetapi untuk saat ini, saat saya menguji, saya akan membiarkannya.

Saya telah menambahkan lebih banyak perintah, termasuk /help dan gps . Ini juga tercermin dalam preferensi, di mana posisi GPS akan disimpan, jika ditambahkan secara manual melalui perintah /gps . addGPS Kata Kunci JSON. Seperti yang ditunjukkan di bawah ini, perintah /help memberikan penjelasan tentang perintah (properti __doc__ dari setiap fungsi).
knownFunctions = [
[ "/p" , sendPing , 0 ], [ "/>" , sendMsg , 1 ], [ "/hm" , setHmac , 1 ],
[ "/cr" , setCr , 1 ], [ "/tx" , setTx , 1 ], [ "/bw" , setBw , 1 ],
[ "/sf" , setSf , 1 ], [ "/r" , setRP , 1 ], [ "/fq" , setFq , 1 ],
[ "/as" , setAs , 1 ], [ "/e" , setEnc , 1 ], [ "/dn" , setDeviceName , 1 ],
[ "/PW" , setPwd , 1 ], [ "/save" , savePrefs , 0 ], [ "/msl" , sendMSL , 1 ],
[ "/gps" , setGPS , 1 ], [ "/help" , showHelp , 0 ]
] Berikut output dari perintah /help :
/help
/p: Sends a ping packet. 0 args
/>: Sends a custom packet (message). 1 args
/hm: Sets HMAC parameter (0/1). 1 args
/cr: Sets C/R parameter (5..8). 1 args
/tx: Sets Tx power (7..22). 1 args
/bw: Sets bandwidth parameter (7..9). 1 args
/sf: Sets spreading factor parameter (6..12). 1 args
/r: Sets pong back parameter (0/1). 1 args
/fq: Sets LoRa frequency. 1 args
/as: Sets autosend parameter (0/XX seconds). 1 args
/e: Sets AES encryption parameter (0/1). 1 args
/dn: Sets device name. 1 args
/PW: Sets AES encryption key. 1 args
/save: Saves preferences to disk. 0 args
/msl: Sets Mean Sea Level air pressure (dor altitude calculation). 1 args
/gps: Sets GPS coords (or turns off GPS location). 1 args
/help: Shows this help. 0 args
