นี่คือคอลเลกชันของสคริปต์ Python (2 เสร็จแล้วยังคงพัฒนามากขึ้น) และข้อมูลอื่น ๆ เกี่ยวกับกระดานฝ่าวงล้อม RAK3272S ตอนนี้มันมาพร้อมกับเฟิร์มแวร์ เนื่องจาก STM32WL เป็นชิปใหม่จึงค่อนข้างซับซ้อนในการตั้งค่าสภาพแวดล้อมในการเขียนรหัส C ++ สำหรับมัน (ฉันได้ดู STM32Cubeide และฉันยังคงเวียนหัวจากการดำน้ำลึก ... ) ดังนั้นตอนนี้ฉันมุ่งเน้นไปที่รหัสการเขียน
STM32WL ถูกเพิ่มเข้าไปใน STM32 Arduino BSP ซึ่งเป็นส่วน Lora เมื่อ Lora พร้อมใช้งานฉันจะพอร์ตเฟิร์มแวร์ LORA ขั้นต่ำของฉันไปยังชิปนี้และเราจะสามารถใช้สิ่งที่น้อยกว่าเล็กน้อย ในระหว่างนั้นฉันจะทำงานเกี่ยวกับเครื่องมือที่เลียนแบบพฤติกรรมของ Lora น้อยที่สุด
มีสคริปต์ 2 สคริปต์ที่ทำสิ่งเดียวเท่านั้น: รับหรือส่ง วิธีการตั้งค่า AT Firmware สำหรับ P2P นั้นมีความซับซ้อนเล็กน้อยที่จะมีทั้งคู่ โดยทั่วไปเฟิร์มแวร์จะทำให้ชิปอยู่ในโหมด TX และหากคุณต้องการรับคุณต้องแจ้งให้เฟิร์มแวร์ทราบให้ค่าหมดเวลา (ความคิดโง่ ๆ ถ้าคุณถามฉัน) มันเป็นค่า 16 บิตดังนั้นค่าสูงสุด 65535 หมายถึงรอตลอดไป สิ่งอื่นใดมันรอจำนวนมิลลิวินาที pfffrt แต่สิ่งที่แย่กว่านั้นแม้ว่าคุณจะอยู่ในโหมด "รอตลอดไป" เมื่อคุณได้รับบรรทัดคุณจะกลับไปที่โหมด TX นั่น คือความโหดร้ายที่ผิดปกติ
ดังนั้นฉันจึงมีกระดานฝ่าวงล้อมสองอันและแต่ละอันเชื่อมต่อกับคอมพิวเตอร์ที่ใช้สคริปต์หนึ่งสคริปต์ เมื่อเริ่มต้นสคริปต์จะทำให้เฟิร์มแวร์ในโหมด P2P ตั้งค่าพารามิเตอร์ (ความถี่, SF, BW, ฯลฯ ) และตั้งค่าโหมด TX หรือ RX ผู้รับจะรีเซ็ตเป็นโหมดรับทุกครั้งที่ได้รับข้อความ
เนื่องจาก 2 เหล่านี้ทำงานบนเครือข่ายอุปกรณ์ Bastwan เดียวกันที่ฉันมีฉันจึงต้องเลียนแบบโปรโตคอล:
UUID from และคีย์ cmd หลังจากนั้นอาจมีหรือไม่มีกุญแจอื่น ๆ ผู้ส่งไม่ได้เพิ่มสิ่งอื่นใด แต่อุปกรณ์ Bastwan ของฉันบางส่วนทำ ผู้รับรู้ว่าจะแสดงอะไร นอกจากนี้ยังทำการประทับเวลาแพ็คเก็ตเพื่อให้คุณสามารถเก็บบันทึกแพ็คเก็ตโดยรวมแล้วพวกเขาทำค่อนข้างน้อย ฉันกำลังมองหาการรวมเข้าด้วยกันและเพิ่มตัวเลือกที่น้อยที่สุด _lora ทางออกที่แข็งแกร่งยิ่งขึ้นอาจเกี่ยวข้องกับการสร้างแอพ GUI ใน Xojo เราจะเห็น ...

ฉันเพิ่มสคริปต์ใหม่ RAK3272S_Minimal_LoRa.py ซึ่งเลียนแบบเฟิร์มแวร์ BastWAN_Minimal_LoRa ในระดับหนึ่งและฉันมีปัญหาเพิ่มเติมเกี่ยวกับชุดค่าผสม SF/BW ที่เกี่ยวข้องกับการบรรทุก ที่ SF 10, BW 7 (125 kHz) แพ็คเก็ตที่ส่งจากอุปกรณ์ Bastwan ได้รับจากเครือข่ายทั้งหมดทั้ง Bastwan และ Rak3272s ในทางกลับกันแพ็คเก็ตที่ส่งโดย RAK3272S จะไม่ได้รับโดยอุปกรณ์ Bastwan และอ่านย้อนกลับไปที่ RAK3272 อื่น ๆ การตรวจสอบ SDR ของฉันมีบางอย่างถูกส่งไปอย่างแน่นอน แต่อุปกรณ์ Bastwan ไม่ได้ตอบสนองต่อมัน ฉันคิดว่าแอตเฟิร์มแวร์หรือฮาร์ดแวร์นั้นเข้มงวดกว่าที่จำเป็นมากเมื่อพูดถึงข้อ จำกัด ของน้ำหนักบรรทุก: หลังจากทั้งหมดหาก Rak3272s สามารถรับน้ำหนักบรรทุกได้นาน (~ 180 ไบต์) มันควรจะสามารถส่งพวกเขาได้เช่นกัน (และสั้นกว่าเล็กน้อยประมาณ 160 ไบต์)
ดังนั้นในขณะที่ฉันหารือกับทีมผลิตภัณฑ์ฉันได้เปลี่ยนคอมโบ SF/BW เป็น SF 10, BW 9 (500 kHz) และแพ็คเก็ตยาวทำงานได้ดีตอนนี้ SF 9, BW 7 ก็ดูเหมือนจะทำงานได้เช่นกัน ฉันกำลังเพิ่มไฟล์ prefs JSON ต่างๆสำหรับการทดสอบ คุณสามารถเลือกไฟล์ 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() เช่นเมื่อรีเซ็ตตัวเลือกสำหรับชิป
ฉัน refactored ส่วนของรหัสที่วิเคราะห์อินพุตของผู้ใช้และประเมินคำสั่ง คำสั่ง, 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 เพื่อแสดงแพ็กเก็ตในรูปแบบ hex เพื่อจุดประสงค์ในการดีบัก เรียกว่าเฉพาะในช่วง sendPacket() สำหรับตอนนี้ แต่ควรเพิ่มในภายหลังในอีกไม่กี่สถานที่ ในที่สุดมันจะถูกเลือกด้วยการกำหนด #DEBUG -like
ฟังก์ชั่นได้รับการอัปเดตเพื่ออนุญาตให้บัฟเฟอร์ยาวกว่า 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
