這是Python腳本的集合(已完成2次,仍在不斷發展,將來還會進展更多)以及有關RAK3272S突破板的其他信息。目前,它帶有AT固件。由於STM32WL是一種新的芯片,因此設置一個為其編寫C ++代碼的環境非常複雜(我已經看過STM32Cubeide,而我仍然很頭暈,而深度潛水中的我仍然頭暈目眩...),因此,現在我專注於編寫使用固定器件的編寫代碼,從而使At At At At At At At At At At At At At At At At Ater-Atimelly and-Alim-Alimfly and-fimflyfryfriend。
STM32WL已添加到lora部分的STM32 Arduino BSP中。洛拉(Lora)可用後,我將把我的最小洛拉固件移植到此芯片上,我們將能夠使用一些較少的東西。在兩者之間,我將研究模仿最小洛拉行為的工具。
有2個腳本只能完成一件事:接收或發送。 P2P設置AT固件的方式,兩者都有兩者有點複雜。基本上,固件將芯片放在TX模式下,如果您想接收,則必須讓固件知道,給它一個超時的價值(如果您問我,愚蠢的想法)。這是一個16位值,因此最大值65535表示永遠等待。其他任何東西,它都等待了毫秒。 pfffrt。但是,更糟糕的是,即使您處於“永遠等待”模式,一旦收到一條線,您也會返回TX模式。那是不尋常的殘酷。
因此,我有兩個突破板,每個板連接到了運行一個腳本的計算機。在啟動時,腳本將固件置於P2P模式,設置參數(頻率,SF,BW等),並設置TX或RX模式。每次收到消息時,接收器將重置以接收模式。
由於這兩個在我擁有的bastwan設備網絡上運行,因此我需要效仿協議:
UUID , from cmd鍵。之後,可能會有或可能沒有其他鍵。發件人甚麼也沒添加,但是我的一些Bastwan設備可以。接收器知道顯示什麼。它還可以為數據包提供時間戳,以便您可以保留數據包的日誌。總而言之,他們已經做了很多。我正在考慮合併它們,並添加更多最小值選項。更強大的解決方案可能涉及在Xojo中製作GUI應用程序。我們會看到...

我添加了一個新腳本, RAK3272S_Minimal_LoRa.py ,它在一定程度上模仿了BastWAN_Minimal_LoRa固件,並且我在與有效載荷相關的SF/BW組合中遇到了更多問題。在SF 10,BW 7(125 kHz)時,整個網絡(Bastwan and Rak3272s)收到了從Bastwan設備發送的數據包。另一方面,Bastwan設備根本沒有收到由RAK3272發送的數據包,而是在其他RAK3272上亂逛。檢查我的SDR,確實正在發送某些東西,但是Bastwan設備甚至對此沒有反應。我認為,AT固件或硬件本身要么在有效載荷限制方面比所需的要好得多:畢竟,如果RAK3272可以接收長(約180個字節)有效載荷,那麼它也應該能夠發送它們(並且它們稍微短,大約160個字節)。
因此,當我與產品團隊會議時,我將SF/BW組合更改為SF 10,BW 9(500 kHz),而長包裝包現在正常工作。 SF 9,BW 7似乎也起作用。我正在添加各種JSON PERFS文件進行測試。您可以在啟動時選擇一個prefs文件:
python3 RAK3272S_Minimal_LoRa.py /dev/tty.usbserial-A901LHDG sf9bw7.json
我添加了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 ]
]這仍然有點脆弱,但似乎工作得足夠好!玩得開心!


添加了calcMaxPayload()函數,該功能可以根據SF/BW配置來計算您可以發送的最大有效載荷。返回-1如果(無論如何)無效。數據來自TTN。當調用packOptions() ,即重置芯片選項時,將顯示此計算。
我重構解析用戶輸入的代碼部分並評估命令。這些命令,相關的FN以及是否需要參數,存儲在數組中, knownFunctions 。函數, testFn(line) ,解析數組,如果找到匹配項,則調用相關函數。這使添加命令變得容易得多。
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!" )我添加了幾個命令:
/e0 e0〜 /e1關閉AES或ON/PWxxxxxx將密碼設置為xxxx/dnxxxxxx設置設備名稱為xxxx/save保存的prefs保存到當前的prefs文件

試圖打開不存在的端口時,截取了serial.SerialException 。該代碼以更乾淨的方式存在。

將我的C ++ hexDump()函數移植到Python,以顯示六角形形式的數據包,以進行調試。現在僅在sendPacket()期間稱呼,但應稍後在其他幾個地方添加。最後,將使用#DEBUG (類似於定義)進行可選。
該功能已更新,以允許緩衝區長256個字節。


我添加了日誌:主事件(保存prefs,發送/接收數據包)已記錄到新的日誌文件,該文件在啟動時間從隨機uuid: Log_<UUID>.log創建。我將使用此功能可選,但是就目前而言,在我進行測試時,我會繼續進行。

我添加了更多命令,包括/help和gps 。如果通過/gps命令手動添加,這也反映在首選項中,其中將保存GPS位置。 JSON關鍵字addGPS 。如下所示, /help命令提供了命令(每個函數的__doc__屬性)的說明。
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 ]
]這是/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
