TRX-DOCสำหรับนักพัฒนาอุปกรณ์

ESP32: sensor node และ OTA

ต่อสาย ตั้งค่า แฟลช และอัปเดต firmware ผ่านอินเทอร์เน็ต

firmware ตัวอย่างของ TRIX สำหรับ ESP32 มี 2 ชุด ขอไฟล์ source ได้จากทีม TRIX

  • sensor node อ่าน DHT22 (อุณหภูมิ ความชื้น) แล้วส่งเข้า TRIX Monitor ผ่าน MQTT บน WSS ด้วย login ของอุปกรณ์เอง
  • OTA client ตรวจและติดตั้ง firmware รุ่นใหม่จาก TRIX ผ่าน HTTPS มีหน้าเว็บในตัวเครื่องพร้อมปุ่ม "Check for Update"

1. sensor node

DHT22 --> ESP32 --WiFi--> wss://mqtt.trix.technology/mqtt --> TRIX Monitor --> dashboard

ทำไมใช้ WSS และ login แยกต่อเครื่อง

  • เข้ารหัสตั้งแต่บอร์ดถึง server MQTT ธรรมดาส่งรหัสผ่านเป็นข้อความเปล่าและใช้ได้เฉพาะใน LAN ส่วน WSS ใช้ได้จากทุกเครือข่ายและเป็น TLS firmware ตรวจใบรับรองด้วย certificate bundle ของ ESP-IDF จึงไม่ผูกกับ CA ตัวเดียว
  • หนึ่งบอร์ดหนึ่ง login login ส่งได้เฉพาะ trix/<site>/<device>/# ถ้าบอร์ดหายหรือรหัสหลุด ยกเลิกเฉพาะเครื่องนั้น เครื่องอื่นทำงานต่อ (สอดคล้อง ETSI EN 303 645 ข้อ 5.1 และ 5.5 และ NIST IR 8259A)

ต่อสาย

ขา DHT22 ESP32
VCC 3V3
DATA GPIO4 (ต่อตัวต้านทาน pull-up 10 kOhm ไป 3V3)
GND GND

ตั้งค่า Arduino IDE

  1. Boards Manager ติดตั้ง esp32 (Espressif Systems) รุ่น 3.x ซึ่งมี esp-mqtt และ certificate bundle (ทดสอบกับ 3.3.12)
  2. Library Manager ติดตั้ง DHT sensor library (Adafruit) และ Adafruit Unified Sensor

ใส่ login

  1. ขอ login ของอุปกรณ์จากทีม TRIX จะได้บรรทัด #define 5 บรรทัด
  2. วางในส่วน CONFIG ของ esp32-sensor.ino แล้วตั้ง WIFI_SSID และ WIFI_PASS

รหัสผ่านแสดงครั้งเดียว ระบบเก็บเฉพาะค่า hash ถ้าทำหายต้องขอรหัสใหม่แล้วแฟลชอีกครั้ง

แฟลชและตรวจผล

Serial Monitor ที่ 115200 ควรขึ้นแบบนี้

TRIX sensor fw 2.0.0
WiFi: connecting to ... ok, ip=192.168.x.x
MQTT: connected (wss)
-> trix/<site>/sensor-01/temperature_c 25.3
-> trix/<site>/sensor-01/humidity_pct 61.0

MQTT: refused แปลว่า login ผิดหรือถูกยกเลิกแล้ว

บอร์ดที่แฟลช fw 1.x ไว้ยังใช้ได้ (ดึง login ของ site จาก config.json และใช้ MQTT ธรรมดาใน LAN) ควรย้ายมาใช้ login ของอุปกรณ์เมื่ออัปเดตครั้งถัดไป

2. OTA client

สิ่งที่ต้องมี

  • ESP32 รุ่นใดก็ได้ (esp32, esp32-s2, esp32-s3, esp32-c3)
  • Arduino IDE 2.x หรือ PlatformIO
  • ไลบรารี ArduinoJson 7.x (ที่เหลือมากับ board package)

ตั้งค่า

#define WIFI_SSID       "your-wifi"
#define WIFI_PASS       "your-password"
#define DEVICE_TYPE     "esp32-sensor"      // ต้องตรงกับชนิด firmware ที่ลงทะเบียนใน TRIX
#define CURRENT_VERSION "1.0.0"             // semver
#define OTA_HOST        "https://trix.technology"

แฟลช

  • Arduino IDE: Tools > Board > ESP32 Dev Module แล้ว Tools > Partition Scheme เลือกแบบที่มี OTA partition เช่น "Default 4MB with spiffs" จากนั้น Upload
  • PlatformIO: pio run -t upload

ทดสอบ

  1. บูตเครื่อง Serial Monitor จะแสดง IP: 192.168.x.x
  2. เปิดเบราว์เซอร์ไปที่ http://192.168.x.x/
  3. กด Check for Update ถ้ามีรุ่นใหม่ เครื่องจะดาวน์โหลด แฟลช และรีบูตเอง

ปล่อย firmware รุ่นใหม่

ส่งไฟล์ .bin (Arduino: Sketch > Export Compiled Binary) พร้อมชนิดอุปกรณ์และเลขรุ่นให้ทีม TRIX ทีม TRIX ลงลายเซ็นและตั้งเป็นรุ่นล่าสุด อุปกรณ์จะได้รุ่นใหม่เมื่อถึงรอบตรวจหรือเมื่อกดปุ่ม

ความปลอดภัย

  • ตรวจใบรับรอง HTTPS ด้วย root CA ที่ฝังไว้ใน firmware
  • เทียบ semver ปฏิเสธการ downgrade
  • firmware ตามมาตรฐาน trix-node/1 ต้องตรวจลายเซ็น Ed25519 และ sha256 ก่อนแฟลชทุกครั้ง

ปัญหาที่พบบ่อย

อาการ สาเหตุ / วิธีแก้
HTTPS connection failed ใบรับรองหมดอายุ อัปเดต root CA ใน firmware
OTA update failed: Not enough space partition scheme ไม่มี OTA เปลี่ยนในเมนู Tools
ขึ้น Already up to date แต่มีรุ่นใหม่แล้ว DEVICE_TYPE สะกดไม่ตรงกับที่ลงทะเบียนไว้
รีบูตวนหลังแฟลช firmware ใหม่มีปัญหา ESP32 ที่มีสอง partition ย้อนกลับรุ่นเดิมได้ ขึ้นกับ partition table
ติดปัญหาหรือต้องการข้อมูลเพิ่ม ติดต่อทีม TRIX
แชท LINEโทรหาเรา