Mocktastic: tự làm node Meshtastic trên Arduino ESP32
Mocktastic là dự án mã nguồn mở giúp lập trình viên tự xây dựng một client LoRa tương thích Meshtastic trên board ESP32 bằng Arduino IDE, kèm ví dụ cảm biến DHT22. Dự án minh họa cách tạo, mã hóa và giải mã gói tin Meshtastic bằng C++, hướng tới mục đích học tập và thử nghiệm.

Mocktastic là dự án mã nguồn mở vừa xuất hiện trên GitHub, cho phép bạn tự dựng một client LoRa tương thích Meshtastic trên các board ESP32 ngay trong môi trường Arduino IDE. Đây là bản triển khai mang tính giáo dục và thử nghiệm, không phải bản fork của firmware Meshtastic chính thức.
Hai chế độ biên dịch
Firmware có hai chế độ được chọn ở thời điểm biên dịch (compile-time):
- DECODER: cung cấp một shell tương tác qua cổng serial để nhận, giải mã và gửi tin nhắn văn bản trên các kênh Meshtastic đã cấu hình cũng như tin nhắn trực tiếp.
- SENSOR: biến board thành một cảm biến nhiệt độ – độ ẩm DHT22, có thể gửi số đo và phản hồi lệnh
/dhttrên kênh riêng đã cấu hình.
Dự án được phát triển nhắm tới board LilyGO T3 LoRa32 V1.6.1 (dùng chip ESP32-PICO và radio SX1276), nhưng có thể chỉnh sửa để chạy trên phần cứng ESP32/LoRa tương thích khác.
Thư viện và cách tổ chức mã
Phần mật mã học trong giai đoạn thử nghiệm dùng MBDTLS (thực chất là mbedTLS), còn Nano-Protobuf đóng vai trò bộ mã hóa Protobuf gọn nhẹ. Các bài kiểm thử được viết bằng framework Doctest.
Mã nguồn nằm trong thư mục meshtastic_decoder/, gồm các phần chính:
meshtastic_decoder.ino: điểm vào Arduino, tích hợp board, thiết lập radio và chọn chế độ.crypto.h/crypto.cpp: các phép mật mã như AES và X25519.meshtastic.h/meshtastic.cpp: xử lý gói tin Meshtastic ở mức cao hơn, mã hóa và payload Protobuf.lora_shell.h/lora_shell.cpp: phân tích lệnh shell và các thao tác tin nhắn — điểm khởi đầu tốt nếu muốn mở rộng client.keys.h: cấu hình kênh và danh tính node.nanopb_meshtastic/: runtime Nanopb và các định nghĩa Protobuf của Meshtastic đã sinh sẵn.test/: các unit test dựa trên Doctest cho phần logic không phụ thuộc phần cứng.
Kiểm thử trên máy tính
Logic giao thức và tiện ích được tách khỏi phần tương tác phần cứng để có thể chạy thử ngay trên máy phát triển. Từ thư mục meshtastic_decoder, chạy:
make test
Makefile sẽ vừa biên dịch vừa chạy test. Các bài test bao phủ hàm độc lập nền tảng, mật mã, xử lý gói tin Meshtastic và phân tích shell. Tài liệu API có thể tạo bằng Doxygen và Graphviz với lệnh make doxygen.
Yêu cầu phần cứng và cách dựng node
Bạn cần một board ESP32 và một radio LoRa thuộc họ Semtech SX1276; bản SENSOR cần thêm cảm biến DHT22. Ngoài Arduino IDE, cần cài các thư viện qua Library Manager:
- LoRa của Sandeep Mistry
- Adafruit Unified Sensor
- DHT sensor library của Adafruit
Trong file build_opt.h, bạn phải khai báo đường dẫn tuyệt đối tới thư mục nanopb_meshtastic/src. Sơ đồ chân cho LilyGO T3 V1.6.1 như sau: SCK nối GPIO 5, MISO nối 19, MOSI nối 27, NSS nối 18, NRESET nối 23, DIO0 nối 26. Các chân này được khai báo bằng macro LORA_SCK, LORA_MISO, LORA_MOSI, LORA_SS, LORA_RST, LORA_DIO0 trong sketch.
Cấu hình tần số và khóa
Sketch mặc định dùng preset EU Medium Fast, khởi tạo với LoRa.begin(869525024), spreading factor 9, băng thông 250 kHz, coding rate 4/5, sync word 0x2B, preamble 16 byte và bật CRC.
Bảng preset tham khảo trong tài liệu dự án trải từ Short Turbo (21,88 kbps) tới Long Slow đã ngừng khuyến nghị (0,18 kbps). Trước khi phát sóng, bạn phải kiểm tra quy định tần số của khu vực mình sinh sống và dùng công cụ Frequency Slot Calculator của Meshtastic để chọn kênh, slot và tần số tương ứng.
Trong keys.h, cần điền tên và khóa của kênh công khai (PublicChannel), kênh riêng (PrivateChannel), thông tin node chính dùng để nhắn tin trực tiếp (Admn — chỉ đặt khóa công khai) và danh tính của node hiện tại (Device — gồm tên, khóa công khai và khóa riêng). Khóa phải ở dạng chuỗi hexadecimal; nếu Meshtastic cung cấp dạng Base64 thì dùng hàm b64StrToHexStr() để chuyển đổi. Tuyệt đối không đưa khóa riêng lên repository công khai.
Cách vận hành
Ở chế độ DECODER, bạn mở serial monitor với tốc độ 115200 baud và dùng các lệnh như:
/pubgửi gói tin lên kênh công khai/cantinegửi lên kênh riêng/admngửi tin nhắn trực tiếp/send_keygửi khóa công khai của node để thiết lập hội thoại riêng/rssi,/pwr17,/gainđể xem cường độ tín hiệu và chỉnh công suất, độ lợi/rlặp lại lệnh trước,/helpxem trợ giúp
Ví dụ, /cantine hello, world! sẽ gửi lời chào lên kênh riêng.
Ở chế độ SENSOR, không có shell tương tác. Bạn điều khiển node bằng cách gửi lệnh /dht trên kênh riêng; node sẽ đo nhiệt độ, độ ẩm và trả kết quả về cùng kênh. Chân dữ liệu DHT22 nối với GPIO 21, và để chạy độc lập cần thêm pin.
Giới hạn cần lưu ý
Nhóm tác giả nói rõ đây là dự án học tập và tạo mẫu. Firmware chưa được thử nghiệm nhiều ngoài thực địa, không đạt độ ổn định hay mức tiết kiệm năng lượng như firmware Meshtastic chính thức, và không nên dùng cho các ứng dụng quan trọng về an toàn hoặc môi trường sản xuất. Thời lượng pin của bản SENSOR, cách xử lý kênh và cấu hình tần số theo khu vực có thể cần chỉnh thêm tùy ứng dụng.
Góc nhìn
Với các kỹ sư IoT và những người đang làm LoRa mesh, Mocktastic là một tài liệu tham khảo hữu ích vì mã nguồn mở ra toàn bộ quy trình tạo, mã hóa và giải mã gói tin Meshtastic bằng C++, kèm bộ test chạy được trên máy tính. Việc tách logic giao thức khỏi phần cứng giúp việc học và mở rộng dễ hơn nhiều so với đọc trực tiếp firmware chính thức.
Tuy nhiên, cần coi đây là điểm khởi đầu chứ không phải giải pháp thay thế firmware chính thức. Những ai muốn triển khai thực tế nên dùng nó để thử nghiệm ý tưởng, kiểm tra tương thích với node Meshtastic có sẵn, rồi chuyển sang firmware chính thức khi cần độ tin cậy và khả năng tiết kiệm pin.
Nguồn: github.com · Quy trình biên tập


