이것은 Python 스크립트 모음 (2 개, 여전히 진화하고 있으며 앞으로 더 많이) 및 RAK3272S 브레이크 아웃 보드에 대한 다른 정보입니다. 현재 AT 펌웨어가 제공됩니다. STM32WL은 새로운 칩이기 때문에 C ++ 코드를 작성하는 환경을 설정하는 것은 상당히 복잡합니다 (STM32Cubeide를 살펴보고 여전히 깊은 다이빙에서 현기증이 나옵니다 ...). 현재 AT 펌웨어를 조금 덜 고통스럽고 사용자 친화적으로 사용하는 코드를 작성하는 데 집중하고 있습니다.
STM32WL은 STM32 Arduino BSP에 추가되었습니다. Lora를 사용할 수있게되면 최소 LORA 펌웨어를이 칩에 포트로 만들고 약간 덜 Kludgy를 사용할 수 있습니다. 그 사이에, 나는 최소한의 lora의 행동을 모방하는 도구에 대해 노력할 것입니다.
각각 한 가지 일을하는 2 개의 스크립트가 있습니다 : 수신 또는 보내기. AT 펌웨어가 P2P를 위해 설정되는 방식은 두 가지를 갖는 것이 약간 복잡합니다. 기본적으로 펌웨어는 칩을 TX 모드에 넣고 수신하려면 펌웨어에 알리고 시간 초과 가치를 제공해야합니다 (저에게 묻는 경우 바보 같은 아이디어). 16 비트 값이므로 최대 값 65535는 영원히 기다리는 것을 의미합니다. 다른 것은 그 양의 밀리 초를 기다립니다. pfffrt. 그러나 더 나쁜 것은 "영원히 기다리는"모드에 있더라도 라인을 받으면 TX 모드로 돌아갑니다. 그것은 비정상적인 잔인합니다.
그래서 두 개의 브레이크 아웃 보드가 있었고 각각 하나의 스크립트를 실행하는 컴퓨터에 연결되었습니다. 시작시 스크립트는 펌웨어를 P2P 모드로 설정하고 매개 변수 (주파수, SF, BW 등)를 설정하고 TX 또는 RX 모드를 설정합니다. 수신자는 메시지를 수신 할 때마다 수신 모드로 재설정됩니다.
이 2 개는 내가 가진 Bastwan 장치의 동일한 네트워크에서 작동하기 때문에 프로토콜을 모방해야합니다.
UUID , from 및 cmd 키가 있습니다. 그 후, 다른 키가있을 수도 있고 아닐 수도 있습니다. 발신자는 다른 것을 추가하지 않지만 일부 Bastwan 장치는 그렇습니다. 수신기는 무엇을 표시 해야하는지 알고 있습니다. 또한 패킷을 보관할 수 있도록 패킷을 타임 스탬프합니다.대체로, 그들은 이미 꽤 많이합니다. 나는 그것들을 병합하고 더 최소한의 옵션을 추가하고 있습니다. 보다 강력한 솔루션에는 Xojo에서 GUI 앱을 만드는 것이 포함될 수 있습니다. 우리는 볼 것입니다 ...

새 스크립트 인 RAK3272S_Minimal_LoRa.py 추가했습니다.이 스크립트는 BastWAN_Minimal_LoRa 펌웨어를 어느 정도 모방했으며 페이로드와 관련된 SF/BW 조합에 더 많은 문제가 있습니다. SF 10, BW 7 (125 kHz)에서 Bastwan 장치에서 전송 된 패킷은 Bastwan 및 RAK3272S 전체 네트워크에 의해 수신됩니다. 반면에, RAK3272가 보낸 패킷은 Bastwan 장치에 의해 전혀받지 못하고 다른 RAK3272에서 얻었습니다. 내 SDR을 확인하면 실제로 무언가가 전송되고 있지만 Bastwan 장치는 반응조차하지 않습니다. AT 펌웨어 또는 하드웨어 자체가 페이로드 제한에있어 필요한 것보다 훨씬 엄격하다고 생각합니다. 결국 RAK3272가 길고 (~ 180 바이트) 페이로드를받을 수 있다면, 그것들도 보낼 수 있어야합니다 (그리고 약 160 바이트).
따라서 제품 팀과 협의하는 동안 SF/BW 콤보를 SF 10, BW 9 (500 kHz)로 변경했으며 긴 패킷이 잘 작동합니다. SF 9, BW 7도 작동하는 것 같습니다. 테스트를 위해 다양한 JSON Prefs 파일을 추가하고 있습니다. 다음을 통해 시작시 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 ]
]이것은 여전히 약간 깨지기 쉽지만 충분히 잘 작동하는 것 같습니다! 재미있게 보내세요!


sf/bw 구성을 기반으로 보낼 수있는 최대 페이로드를 계산하는 calcMaxPayload() 함수가 추가되었습니다. (어쨌든) 잘못된 경우 -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 ~ /e1 은 AES를 끄거나 켜십시오/PWxxxxxx 암호를 xxxx로 설정합니다/dnxxxxxx 장치 이름을 xxxx로 설정합니다/save 저장은 현재 prefs 파일에 pref를 pref입니다 

존재하지 않는 포트를 열 때 제기 된 serial.SerialException 을 가로 채 렸습니다. 코드는 훨씬 더 깨끗한 방식으로 존재합니다.

C ++ hexDump() 기능을 파이썬에 포팅하여 디버그 목적으로 16 진 양식으로 패킷을 표시했습니다. 지금은 sendPacket() 중에 만 호출되지만 나중에 다른 장소에 추가해야합니다. 마지막으로 #DEBUG -like define을 사용하여 선택 사항이됩니다.
256 바이트보다 긴 버퍼를 허용하도록 기능이 업데이트되었습니다.


로그를 추가했습니다 : 메인 이벤트 (저장 프리프, 전송/수신 패킷)는 시작 시간에 무작위 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
