هذه مجموعة من البرامج النصية Python (تم القيام بها ، لا تزال تتطور ، وأكثر من ذلك) ومعلومات أخرى حول لوحة Breakout Rak3272s. في الوقت الحالي ، يأتي مع برنامج ثابت. نظرًا لأن STM32WL عبارة عن شريحة جديدة ، فمن المعقد بعض الشيء إعداد بيئة لكتابة رمز C ++ لها (لديّ نظرة على STM32Cubeide ، وما زلت بالدوار من الغوص العميق ...) ، لذلك أنا الآن أركز على رمز الكتابة الذي يجعل استخدام البرامج الثابتة أقل قليلاً.
تمت إضافة STM32WL إلى STM32 Arduino BSP ، بلا جزء من Lora. بمجرد توفر Lora ، سأقوم بتوظيف البرامج الثابتة Lora الخاصة بي إلى هذه الشريحة ، وسنكون قادرين على استخدام شيء أقل بقليل من Kludgy. بين ما بين ، سأعمل على الأدوات التي تحاكي سلوك الحد الأدنى من لورا.
هناك نصيتان يقومان بعمل شيء واحد فقط: الاستلام أو الإرسال. الطريقة التي يتم بها إعداد البرامج الثابتة لـ P2P ، من المعقد بعض الشيء أن يكون لديك كليهما. في الأساس ، تضع البرامج الثابتة الرقاقة في وضع TX ، وإذا كنت ترغب في تلقي ، فيجب عليك إخبار البرامج الثابتة ، مع إعطائها قيمة مهلة (فكرة غبية إذا سألتني). إنها قيمة 16 بت ، وبالتالي فإن القيمة القصوى ، 65535 ، تعني الانتظار إلى الأبد. أي شيء آخر ، فهو ينتظر هذا المبلغ من المللي ثانية. pfffrt. ولكن ما هو أسوأ ، حتى لو كنت في وضع "Wait Forever" ، بمجرد تلقي خط ، تعود إلى وضع TX. هذا هو القسوة غير العادية.
لذلك كان لدي لوحان من اللوحات ، وكان كل منهما متصلاً بجهاز كمبيوتر يقوم بتشغيل برنامج نصي واحد. عند بدء التشغيل ، يضع البرنامج النصي البرنامج الثابت في وضع P2P ، ويقوم بإعداد المعلمات (التردد ، SF ، BW ، وما إلى ذلك) ويقوم بتعيين وضع TX أو RX. سيتم إعادة تعيين المتلقي لاستلام الوضع في كل مرة يتم فيها تلقي رسالة.
نظرًا لأن هذين 2 يعملون على نفس الشبكة من أجهزة Bastwan التي لدي ، أحتاج إلى محاكاة البروتوكول:
UUID ، from و cmd مفاتيح. بعد ذلك ، قد يكون هناك أو لا يكون هناك مفاتيح أخرى. لا يضيف المرسل أي شيء آخر ، لكن بعض أجهزتي Bastwan تفعل. المتلقي يعرف ما الذي يجب عرضه. كما أنه يقوم على الطوابع الزمنية للحزم بحيث يمكنك الاحتفاظ بسجل من الحزم.الكل في الكل ، يفعلون بالفعل قليلا. أنا أبحث في دمجها ، وإضافة المزيد من خيارات minimal_lora. يمكن أن يتضمن الحل الأكثر قوة صنع تطبيق واجهة المستخدم الرسومية في Xojo. سنرى ...

لقد أضفت نصًا جديدًا ، RAK3272S_Minimal_LoRa.py ، الذي يحاكي البرامج الثابتة BastWAN_Minimal_LoRa إلى حد ما ، وقد واجهت المزيد من المشكلات مع مجموعات SF/BW المتعلقة بالحمولات الصافية. في SF 10 ، BW 7 (125 كيلو هرتز) ، يتم تلقي الحزم المرسلة من أجهزة Bastwan من قبل الشبكة بأكملها ، كل من Bastwan و Rak3272s. من ناحية أخرى ، لم يتم استلام الحزم التي أرسلتها RAK3272s ، على الإطلاق ، بواسطة أجهزة Bastwan ، وتشوهها RAK3272s الأخرى. عند التحقق من سحفي ، يتم إرسال شيء ما بالفعل ، لكن أجهزة Bastwan لا تتفاعل معها. أعتقد أن إما أن تكون البرامج الثابتة ، أو الأجهزة نفسها ، أكثر صرامة مما هو مطلوب عندما يتعلق الأمر بقيود الحمولة النافعة: بعد كل شيء ، إذا كان بإمكان 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 إذا (من المفترض على أي حال) غير صالح. البيانات مصدرها 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 الحالي 

اعتراض serial.SerialException . الكود موجود بطريقة أنظف بكثير.

نقلت وظيفة C ++ hexDump() إلى Python لإظهار الحزم في نموذج السداسي لأغراض التصحيح. اتصل فقط أثناء sendPacket() في الوقت الحالي ، ولكن يجب إضافته لاحقًا في بعض الأماكن الأخرى. أخيرًا ، سيتم صنعه اختياريًا مع تعريف #DEBUG .
تم تحديث الوظيفة للسماح للمخازن المؤقتة لفترة طويلة من 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
