ข้ามไปยังเนื้อหา

ข้อกำหนดทางเทคนิค

หลักการออกแบบ

แอปพลิเคชันนี้สร้างขึ้นโดยใช้ Flutter และใช้ประโยชน์จากเฟรมเวิร์กการจัดการสถานะ Riverpod โดยจะโต้ตอบกับฮาร์ดแวร์ ELRS ผ่าน RESTful API ที่เผยแพร่โดยโมดูล WiFi ในตัวของอุปกรณ์ เพื่อให้มั่นใจในการสื่อสารที่มีความหน่วงต่ำและการซิงโครไนซ์สถานะแบบเรียลไทม์

ระบบสื่อสารกับฮาร์ดแวร์โดยใช้ปลายทาง HTTP ดังต่อไปนี้:

MethodEndpointDescription
GET/configดึงข้อมูลการกำหนดค่าอุปกรณ์ปัจจุบันในรูปแบบ JSON
POST/options.jsonอัปเดตตัวเลือกที่แก้ไขได้ระหว่างรันไทม์ (WiFi SSID, Password เป็นต้น)
POST/configอัปเดตพารามิเตอร์ฮาร์ดแวร์หลักและการแมป PWM
POST/rebootทริกเกอร์การรีเซ็ตฮาร์ดแวร์เพื่อใช้การเปลี่ยนแปลง

โมเดล RuntimeConfig ใช้โครงสร้าง ELRS 4.x ซึ่งแยกพารามิเตอร์ออกเป็นสามโหนดหลัก:

  • settings: ตัวระบุฮาร์ดแวร์และสตริงเวอร์ชันแบบอ่านอย่างเดียว
  • options: การตั้งค่าผู้ใช้ที่แก้ไขได้และข้อมูลประจำตัวเครือข่าย
  • config: การกำหนดค่าฮาร์ดแวร์ระดับต่ำ (Protocols, PWM Arrays)

ตัวอย่างโครงสร้าง JSON:

{
"product_name": "Test RX",
"settings": {
"version": "1.0.0",
"module-type": "RX"
},
"options": {
"bindPhrase": "example",
"wifi-ssid": "SSID",
"domain": 1
},
"config": {
"serial-protocol": 0,
"pwm": [
{"channel": 0, "mode": 5}
]
}
}

ระบบใช้สถาปัตยกรรมแบบ Reactive:

  • ConfigViewModel: จัดการสถานะการเชื่อมต่อแบบสด ตรรกะ heartbeat และการค้นหา IP
  • DeviceEditorViewModel: เก็บสถานะร่างของการกำหนดค่าอุปกรณ์ ทำให้สามารถแก้ไขได้หลายขั้นตอนพร้อมตรรกะ “บันทึก/ยกเลิก” ขั้นสุดท้าย
  • FlashingController: ประสานงานการดาวน์โหลดเฟิร์มแวร์ การแก้ไขไบนารีในเครื่อง และกระบวนการอัปโหลด XH-over-HTTP

ตารางต่อไปนี้กำหนดการแมประหว่างตัวระบุจำนวนเต็มที่ใช้ใน API แล��เทียบเท่าที่มนุษย์อ่านได้

IDLabelDescription
0AU915ออสเตรเลีย/นิวซีแลนด์ 915MHz
1FCC915อเมริกาเหนือ 915MHz
2EU868ยุโรป 868MHz
3IN866อินเดีย 866MHz
4AU433ออสเตรเลีย 433MHz
5EU433ยุโรป 433MHz
6US433อเมริกาเหนือ 433MHz
7US433-Wideอเมริกาเหนือ Wide 433MHz

กำหนดวิธีการจัดเก็บวลีการผูก (binding phrase) บนอุปกรณ์

  • 0: Persistent: บันทึกไปยังหน่วยความจำแฟลช (มาตรฐาน)
  • 1: Volatile: ล้างข้อมูลเมื่อปิดเปิดเครื่องใหม่
  • 2: Returnable: ใช้สำหรับอุปกรณ์ให้ยืม
  • 3: Administered: ใช้ในสภาพแวดล้อมฝูงบินที่มีนักบินหลายคน

ระบบใช้กลยุทธ์การคงอยู่แบบสองเลเยอร์:

  • SharedPreferences: ใช้ผ่าน PersistenceService สำหรับข้อมูลที่ไม่ละเอียดอ่อน เช่น WiFi SSIDs และการตั้งค่าแอปทั่วไป
  • FlutterSecureStorage: ใช้สำหรับข้อมูลที่ละเอียดอ่อน รวมถึง Binding Phrases และ WiFi Passwords เพื่อให้มั่นใจถึงการเข้ารหัสในระดับ OS