현재 노드 역할을 구현하지 않는 것처럼 EasyMesh의 기존 구현을 약간 수정합니다. 각 노드는 동일하며 서로 만 연결할 수 있습니다. 보시다시피 라우팅 테이블에 서버를 추가하거나 서버에 연결된 테이블에 특정 연결 레코드를 표시하는 방법은 없습니다.
노드는 메시지 라우팅 / 전달에 연결 목록을 사용합니다. 필요한 것은 서버에 대한 연결 레코드가있는 노드입니다. 이것이 루트 노드입니다.
이제 노드에 전원이 공급되면 사용 가능한 AP (액세스 포인트)를 검색하고 메쉬 접두사로 시작하지 않는 노드를 필터링 한 다음 최상의 RSSI로 AP에 연결합니다. 또한 모든 노드는 이름 메시 접두사 + 노드 고유 칩 ID로 자체 AP를 만듭니다 .
사용 가능한 다른 노드가 없으면 다른 노드가 연결될 때까지 기다립니다. 그리고 이것이 변경 사항을 적용해야하는 첫 번째 지점입니다. 메시 접두사 + "서버" 와 같은 이름으로 고유 AP를 하드 코딩하거나 구성 할 수 있으며 다른 EasyMesh AP를 사용할 수없는 경우 노드는이 AP에 연결해야하며 사전 정의 된 meshConnectionType
객체를 연결 목록에 저장해야 합니다.
제출 된이 오브젝트는 서버와 노드 간의 메시지 교환에 의해 결정되지 않지만 espconn
필드를 제외하고 고정 된 값일 수 있습니다 . 그것은 다른 경우와 마찬가지로 획득해야합니다. 다음 구조체에서는 첫 번째 멤버 변수 만 필요합니다.
struct meshConnectionType {
espconn *esp_conn;
uint32_t chipId = 0;
String subConnections;
timeSync time;
uint32_t lastRecieved = 0;
bool newConnection = true;
(...)
};
는 chipId
메쉬 네트워크에서 서버의 주소가됩니다. ESP8266 칩 ID가 될 수없는 하나의 값을 선택해야합니다.
따라서 기본적으로 네트워크에서 전원을 켜는 첫 번째 노드는 "루트"노드입니다. 다른 노드가 서버로 메시지를 보내려는 경우 메시지는 간접 연결 (코드에서 하위 연결이라고 함) 레코드를 기반으로 "루트"노드로 전송됩니다.
그러면 "루트"노드는 서버 (라우터 / 인터넷)에 직접 연결되어 있고 다른 방법으로 메시를 전달하지 않아야한다는 메시지를 서버에 전달한다는 메시지를 알게됩니다. . 서버의 IP 주소 및 사용 된 포트와 같은 추가 정보가 필요합니다. 또한 기본적으로 또는 일부 구성 방법으로 노드를 모든 노드에 저장해야합니다.
마지막으로 "루트"노드는 서버에 IP 메시지를 보내며, 이는 다시 구현해야합니다.
TL; DR; 결론:
- 서버 AP가 있어야하고 첫 번째 노드 (전원이 켜질 첫 번째 노드 만)에 연결해야합니다. 루트 노드가됩니다.
- 서버는 서버에
destId
메시지를 보낼 때 메시 네트워크에서 사용될 주소 ( )를 가져야 합니다. 이 정보는 기본적으로 모든 노드에서 사용할 수 있어야합니다.
- 루트 노드는 서버 / 인터넷에 "직접"연결되어 있음을 알아야합니다. 서버와의 연결 레코드를
destId
루트 노드의 연결 목록 에 추가하면 됩니다.
- 루트 노드는 서버에 연결되어 있음을 알고 인터넷을 통해 메시지를 적절하게 전달할 수 있습니다.
이것은 EasyMesh 구현을 통해 읽은 이론적 인 아이디어 일뿐입니다. 구현하기 어렵거나 불가능하게 만드는 몇 가지 중요한 사실을 놓쳤을 수도 있습니다. 또한 문제를 해결하는 가장 효율적인 방법은 아닙니다. 저는 메쉬 네트워크 전문가가 아닙니다.
네트워크에 루트 노드가 있으면 "루트의 연결이 끊어지면 어떻게됩니까? 새 루트는 어떻게 선택됩니까?"라고 묻습니다.