这是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
