Tôi sẽ sửa đổi một chút việc triển khai EasyMesh hiện có, vì hiện tại nó dường như không thực hiện các vai trò nút. Mỗi nút bằng nhau và họ chỉ có thể xây dựng các kết nối với nhau. Như tôi thấy, không có cách nào để thêm một máy chủ vào các bảng định tuyến của họ cũng như không đánh dấu một bản ghi kết nối cụ thể trong các bảng có kết nối với máy chủ.
Các nút sử dụng một danh sách kết nối để định tuyến / chuyển tiếp tin nhắn. Những gì bạn cần là một nút có bản ghi kết nối cho máy chủ, đây là nút gốc.
Bây giờ, hiện tại khi một nút được cấp nguồn, nó sẽ quét các AP có sẵn (Điểm truy cập), lọc ra các nút không bắt đầu bằng tiền tố lưới và sau đó kết nối với AP bằng RSSI tốt nhất. Ngoài ra mỗi nút tạo AP riêng của mình với tiền tố lưới tên + ID chip duy nhất của nút .
Nếu không có nút nào khác, nó sẽ chỉ chờ người khác kết nối. Và đây là điểm đầu tiên mà những thay đổi nên được áp dụng. Bạn có thể mã hóa hoặc tạo một AP có thể định cấu hình bằng cách nào đó với một tên như tiền tố lưới + "Máy chủ" và nếu không có AP EasyMesh nào khác, nút sẽ kết nối với AP này và nên lưu trữ một meshConnectionType
đối tượng được xác định trước trong danh sách kết nối của nó.
Đối tượng này của đệ sẽ không được xác định bằng cách trao đổi thông điệp giữa máy chủ và các nút nhưng có thể được cố định giá trị, trừ các espconn
lĩnh vực. Đó là một trong những trường hợp khác. Trong cấu trúc sau, bạn sẽ chỉ cần biến đầu tiên cho thành viên.
struct meshConnectionType {
espconn *esp_conn;
uint32_t chipId = 0;
String subConnections;
timeSync time;
uint32_t lastRecieved = 0;
bool newConnection = true;
(...)
};
Các chipId
sẽ là địa chỉ của máy chủ trong mạng lưới. Bạn nên chọn một giá trị không thể là ID chip ESP8266.
Vì vậy, về cơ bản, nút đầu tiên để tăng sức mạnh trong mạng của bạn sẽ là nút "root". Nếu các nút khác muốn gửi tin nhắn đến máy chủ thì tin nhắn sẽ được gửi đến nút "gốc" dựa trên các bản ghi kết nối trực tiếp (được gọi là kết nối phụ trong mã).
Sau đó, nút "root" sẽ phát hiện ra rằng nó có kết nối trực tiếp đến máy chủ (với bộ định tuyến / internet) và vì nó là một thông báo cho máy chủ rằng nó sẽ chuyển tiếp tin nhắn này theo một cách khác (không phải theo kiểu lưới) . Rõ ràng thông tin bổ sung là cần thiết ở đây như địa chỉ IP của máy chủ và cổng được sử dụng chẳng hạn. Chúng cũng nên được lưu trữ một nút (trên mỗi nút) theo mặc định hoặc theo một số phương thức cấu hình.
Vì vậy, cuối cùng nút "root" sẽ gửi một thông điệp IP đến máy chủ, điều này sẽ được bạn thực hiện lại.
TL; DR; Phần kết luận:
- Cần có một AP máy chủ và nút đầu tiên (chỉ nút đầu tiên được cấp nguồn) sẽ kết nối với nó, đây sẽ là nút gốc.
- Máy chủ nên có một địa chỉ (
destId
) sẽ được sử dụng trong mạng lưới khi gửi tin nhắn đến máy chủ. Thông tin này nên có sẵn cho tất cả các nút theo mặc định.
- Nút gốc nên biết rằng nó được kết nối "trực tiếp" với máy chủ / internet. Điều này có thể đạt được bằng cách thêm một bản ghi kết nối với máy chủ
destId
vào danh sách kết nối của nút gốc.
- Nút gốc biết rằng nó được kết nối với máy chủ có thể chuyển tiếp các thông điệp một cách thích hợp thông qua Internet.
Đây chỉ là một ý tưởng lý thuyết mà tôi nghĩ ra bằng cách đọc qua việc thực hiện EasyMesh. Tôi có thể đã bỏ lỡ một số thực tế quan trọng sẽ làm cho điều này trở nên khó khăn hoặc không thể thực hiện được. Ngoài ra nó có thể không phải là cách hiệu quả nhất để giải quyết vấn đề. Tôi không phải là một chuyên gia mạng lưới.
Có một nút gốc trong mạng hỏi "Điều gì xảy ra nếu root bị ngắt kết nối? Làm thế nào một root mới sẽ được chọn?".