Это коллекция сценариев Python (2 выполненных, все еще развивающихся, больше впереди) и другая информация о доске Breakout Rak3272S. На данный момент это поставляется с прошивкой. Поскольку STM32WL является новым чипом, немного сложно настроить среду для написания кода C ++ для него (я посмотрю на STM32Cubeide, и я все еще кружится из-за глубокого погружения ...), так что пока я сосредотачиваюсь на написании кода, который делает использование AT AT-прошивки немного менее болезненным и более удобным для пользователя.
STM32WL был добавлен в STM32 Arduino BSP, без части LORA. Как только Лора будет доступна, я перенесю в этот чип свой минимальный прошивку LORA, и мы сможем использовать что -то немного менее Kludgy. В промежутке я собираюсь работать над инструментами, которые имитируют поведение минимальной Лоры.
Есть 2 сценария, которые делают только по одному: получение или отправка. То, как настраивается прошивка AT для P2P, немного сложно иметь оба. По сути, прошивка помещает чип в режим TX, и если вы хотите получить, вы должны сообщить о прошивке, что дает ему значение тайм -аута (глупая идея, если вы спросите меня). Это 16-битное значение, поэтому максимальное значение, 65535, означает ждать вечно. Что -нибудь еще, он ждет этого количества миллисекундов. Pfffrt. Но что еще хуже, даже если вы находитесь в режиме «подождать вечно», как только вы получите линию, вы вернулись в режим TX. Это необычная жестокость.
Так что у меня было две доски для прорыва, и каждый был подключен к компьютеру, работающему с одним сценарием. При запуске скрипт помещает прошивку в режим P2P, устанавливает параметры (частота, SF, BW и т. Д.) И устанавливает режим TX или RX. Получатель будет сброшен в режим приема каждый раз, когда получает сообщение.
Поскольку эти 2 работают в той же сети устройств Bastwan, которые у меня есть, мне нужно эмулировать протокол:
UUID , from и cmd -клавиш. После чего могут или не могут быть другие ключи. Отправитель больше не добавляет, но некоторые из моих устройств Bastwan делают. Приемник знает, что отобразить. Это также отмечает пакеты, чтобы вы могли вести журнал пакетов.В общем, они уже делают немного. Я ищу их слияние и добавляю больше параметров Minimal_lora. Более надежное решение может включать в себя приложение GUI в Xojo. Посмотрим ...

Я добавил новый сценарий, RAK3272S_Minimal_LoRa.py , который в некоторой степени имитирует прошивку BastWAN_Minimal_LoRa , и у меня было больше проблем с комбинациями SF/BW, связанных с полезными нагрузками. В SF 10, BW 7 (125 кГц), пакеты, отправленные с устройств Bastwan, получены всей сетью, как Bastwan, так и Rak3272S. С другой стороны, пакеты, отправленные RAK3272S, вообще не получены устройствами Bastwan и искажаются на других RAK3272S. Проверяя мой SDR, что -то действительно отправляется, но устройства Bastwan даже не реагируют на это. Я думаю, что прошивка AT, либо само аппаратное обеспечение гораздо более строго, чем необходимо, когда дело доходит до ограничений полезной нагрузки: в конце концов, если RAK3272S может получить длинные (~ 180 байт) полезные нагрузки, он должен быть в состоянии отправить их тоже (и они были немного короче, около 160 байтов).
Таким образом, в то время как я веду с командой продукта, я изменил комбинацию SF/BW на SF 10, BW 9 (500 кГц), а длинные пакеты работают нормально. 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 ]
]Это все еще немного хрупко, но, кажется, достаточно хорошо работает! Веселиться!


Добавлена функция calcMaxPayload() , которая вычисляет максимальную полезную нагрузку, которую вы можете отправить на основе конфигурации SF/BW. Возвращает -1 if (в любом случае) недействителен. Данные, полученные из 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 в текущем файле 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
