ESP8266 메시 네트워크 루트 노드


11

ESP8266 기반의 메쉬 네트워크에서 작업 중이며 Coopdis의 EasyMesh 샘플 코드를 사용하여 모두 잘 작동하는 것 같습니다 . 그의 예에서, 3 ESP8266은 메시에 등록하고 간단한 웹 인터페이스를 제공합니다. 이것은 나에게도 완벽하게 작동합니다.

그러나 내 솔루션에서는 전체 메쉬가 액세스 할 수 있도록 (또는 적어도 메쉬에 액세스 할 수 있도록)이 노드 중 하나를 인터넷에 연결해야합니다. 이것은 EspressifESP8266 메쉬 사용자 안내서 문서 (4 페이지) 에도 언급되어 있습니다. 나는 그들이 정상적이지만 쉽게 이해할 수있는 예제 코드가 없기 때문에 이것에 대해 말하는 모든 다른 문서를 발견했습니다.

라우터에 연결되도록 메시를 구성하는 방법 Wi-Fi 라우터에서 사용하는 것과 동일한 SSID 및 패스 키를 메시 네트워크에 사용하는 것만 큼 간단합니까, 아니면 Wi-Fi 메시의 Raspberry Pi 부분과 같은 것을 만들어 연결해야합니까? 이더넷 연결을 통해 라우터에? 나는 비록 내가 한 연구에서 후자가 필요하다고 생각하지 않습니다.

이를 위해 hello world 샘플 코드가 필요합니다. AT 명령 은 도움이되지 않습니다.


1
3 노드 예제와 관련 하여이 비디오 의 전화 인터페이스와 마찬가지로 웹 인터페이스가 설치되어 있습니까?
벤스 Kaulics

1
@BenceKaulics 이전에 이것을 한 이후로 특별히 테스트하지 않았으므로 이것은 문제가되지 않습니다. 왜 물어? 나는 이것이 "서버"가 단순히 메시에 호스팅 된 REST 호출을 통해 메시 네트워크에 액세스 할 수있는 폴백 옵션이라고 생각했지만 올바른 아키텍처 (IMHO)와 같은 ROOT NODE 옵션에 흥미를 느낀다.
Gineer

1
내가 참조. 네트워크에 액세스하는 다른 옵션이 될 수 있다고 생각했습니다. 그러나 해결책으로 제안하지 않기 때문에 그것이 무엇인지에 대한 의견입니다. 나는 당신이 이미 그것에 대해 생각했다는 것을 몰랐습니다. ;)
Bence Kaulics 2012 년

답변:


6

메시를 쉽게 만드는 또 다른 옵션은 BlackEdder의 painlessMesh를 사용하여 데이터를 외부 세계로 통근하기위한 브리지를 도입하는 것입니다.

painlessMesh gitlab의 메시에서 다른 네트워크에 연결하는 데는 네 가지 솔루션이 설명되어 있습니다. 솔루션은 easyMesh에서도 작동 할 수 있습니다. 문제는 처음에 제기되었으므로 고통스럽지 않은 메시에서도 확실합니다.

나는 그것들을 보았고 가장 효과적인 솔루션은 외부 네트워크에 대한 실제 연결을 처리하기 위해 메쉬에 추가 장치가 필요했습니다.

첫 번째는 프로젝트에 네 번째 esp8266을 소개하는 것입니다. 인터넷에 연결되어 있고 직렬 연결을 통해 노드 중 하나와 통신합니다.

다른 하나는 Raspberry PI 장치를 사용하여 데이터를 수집하고 다른 wifi 카드와 연결하여 다른 네트워크에 연결하는 것입니다.

다른 두 사람은 좋지 않았다. 하나는 저자에 의해 낙담했고, 다른 하나는 esp8266으로 너무 복잡하고 제한되어있어서 시도하지 않을 것이다.

gitlab 의 전체 가이드 .


5

현재 노드 역할을 구현하지 않는 것처럼 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 구현을 통해 읽은 이론적 인 아이디어 일뿐입니다. 구현하기 어렵거나 불가능하게 만드는 몇 가지 중요한 사실을 놓쳤을 수도 있습니다. 또한 문제를 해결하는 가장 효율적인 방법은 아닙니다. 저는 메쉬 네트워크 전문가가 아닙니다.

네트워크에 루트 노드가 있으면 "루트의 연결이 끊어지면 어떻게됩니까? 새 루트는 어떻게 선택됩니까?"라고 묻습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.