LoRaMessenger
LoRaMessenger 간단한 무선 웹 인터페이스를 갖춘 LoRa 장착 ESP32 노드 간의 오프 그리드 채팅입니다.
ESP32는 온라인 노드, 수신 및 전송된 메시지, 노드 이름, 대상 노드 및 메시지를 설정하기 위한 일부 텍스트 상자를 표시하는 간단한 채팅과 유사한 인터페이스를 제공하는 Wi-Fi 네트워크를 호스팅합니다.
메시지 송수신에는 LoRa 통신 프로토콜을 사용하므로 2개 이상의 모듈을 설정해 최대 수 킬로미터 거리까지 메시지를 송수신할 수 있다.
TTGO LoRa32 또는 Heltec Wifi LoRa 32와 같은 대부분의 ESP32 LoRa 모듈에는 디스플레이가 장착되어 있으므로 독립적으로 사용하여 호출기처럼 메시지를 수신할 수 있습니다.
노드는 배터리를 장착한 작은 상자 안에 쉽게 설치할 수 있어 전화 신호가 없는 지역에서도 통신이 가능한 통신 시스템을 구축할 수 있다.
웹 인터페이스
ESP32가 시작되면 LoRaMessenger [번호]라는 새로운 Wi-Fi 네트워크가 생성됩니다.
장치가 네트워크에 연결되면 웹 인터페이스가 자동으로 열려야 하며, 아무 일도 일어나지 않으면 웹 브라우저를 열고 기본적으로 1.1.1.1인 ESP32 IP로 이동하여 인터페이스에 액세스할 수 있습니다.
Android에서는 Wi-Fi 네트워크에 연결한 후 웹 인터페이스가 포함된 Wi-Fi 로그인 페이지가 열립니다. 이렇게 하면 LoRaMessenger 사용하는 경우에도 백그라운드 4g 네트워크 연결이 유지됩니다. 네트워크에 로그인하라는 알림은 알림 패널에 유지되어야 하며 언제든지 열어서 인터페이스를 다시 표시할 수 있습니다.
이제 웹 인터페이스가 브라우저에 표시되며 채팅에는 다음 기능이 있습니다.
- 페이지 상단에는 수신자가 누가 글을 쓰고 있는지 알 수 있도록 노드 이름을 입력할 수 있습니다. 업데이트를 누르면 이름이 저장되고 도달 가능한 모든 노드로 전송됩니다.
- 온라인 섹션에는 감지된 모든 사용 가능한 노드가 표시되며, 수신 노드가 사용 중인 릴레이 노드(있는 경우), 수신 RSSI, 릴레이 간 홉 수, 마지막 접촉 이후 경과된 시간과 같은 몇 가지 추가 정보가 표시됩니다.
- 메시지 섹션에는 최근에 보내고 받은 메시지 5개(기본적으로 사용자 설정 가능)가 시간순으로 표시됩니다. 각 메시지 아래에는 메시지를 올바르게 수신한 모든 노드의 이름이 표시됩니다.
- 페이지 하단에는 두 개의 텍스트 상자가 있는데, 첫 번째는 대상 노드를 설정하는 데 사용되고 두 번째는 메시지를 작성하는 데 사용됩니다.
대상 필드에는 기본적으로 Broadcast 값이 포함되어 있습니다. 이렇게 하면 메시지가 사용 가능한 모든 노드로 전송됩니다. 또한 온라인 섹션에 보고된 대로 노드 이름을 정확하게 작성하여 특정 수신자에게만 메시지를 보낼 수도 있습니다.
현재 수신된 메시지와 읽음 확인을 업데이트하려면 페이지를 새로 고쳐야 합니다.
LoRa 프로토콜
LoRaMessenger 사용자 정의 통신 프로토콜을 사용하며 전송된 각 패킷은 헤더와 페이로드로 구성됩니다.
헤더는 네트워크 및 패킷 라우팅이 제대로 작동하는 데 필요한 정보를 제공하며, 헤더에 포함된 매개변수는 다음과 같습니다.
- NETID: config.h에 지정된 네트워크 ID입니다. 이를 통해 여러 개의 독립적인 네트워크를 생성할 수 있습니다.
- TTL: config.h에 지정된 패킷 TTL(Time to Live)입니다. 이 값은 패킷이 수행한 홉 수와 라우팅 알고리즘에 필요한 수를 아는 데 사용됩니다.
- RECEIVER: 수신자 노드 번호.
- SENDER: 송신자 노드 번호.
- LAST NODE: 패킷을 중계한 송신자 노드 번호 또는 마지막 노드입니다.
- NEXT NODE: 패킷을 수신자 노드로 중계하는 데 필요한 수신자 노드 번호 또는 다음 노드입니다.
- ID: 패킷 ID. 동일한 노드에서 전송된 각 패킷은 고유한 4바이트 길이의 ID를 갖습니다. 이는 이미 수신된 패킷을 삭제하고 수신된 승인을 보내는 데 필요합니다.
- PAYLOAD TYPE: 페이로드 유형. 페이로드를 올바르게 해석하는 데 사용됩니다. 가능한 페이로드 유형은 메시지, 승인 및 알림입니다.
메시지 페이로드:
- MESSAGE SIZE: 메시지 읽기에 필요한 메시지 크기(바이트)입니다.
- 메시지: 메시지 내용입니다. 지금은 일반 텍스트로 전송됩니다!
승인 페이로드:
- RECEIVED PACKET ID: 수신된 메시지 패킷의 ID입니다. 이는 보낸 사람에게 패킷이 수신되었음을 알리기 위해 다시 전송됩니다.
페이로드 발표:
- NAME SIZE: 노드 이름 크기(바이트), 이름 읽기에 필요합니다.
- 노드 이름: 노드 이름입니다. 이는 모든 노드 웹 인터페이스에 표시되며, 대상 필드에 작성하여 특정 노드에만 메시지를 보낼 수 있습니다.
패킷 중계 및 라우팅
LoRaMessenger 발신자가 직접 연결할 수 없는 노드에 메시지를 전달할 수 있는 노드 네트워크를 만듭니다.
이를 위해 각 노드는 대상 노드와 해당 노드에 도달하는 최적의 경로가 포함된 자동 라우팅 테이블을 활용합니다. 테이블은 정기적으로 전송되거나 모든 노드에서 이름이 변경될 때 전송되는 알림 패킷을 통해 업데이트됩니다.
현재 라우팅 알고리즘은 매우 간단하며 더 적은 수의 홉을 선호합니다. 동일한 홉 수를 가진 두 경로의 경우 다음으로 가장 강한 노드에 연결된 경로가 선택됩니다.
설치
이 프로그램은 platformio에서 프로젝트를 가져와서 설정을 업데이트하고 보드에 업로드하면 쉽게 설치할 수 있습니다.
구성
포함 폴더에는 config.h라는 구성 파일이 있습니다. 이 파일에는 LoRaMessenger 작동하는 데 필요한 모든 설정이 포함되어 있습니다.
LoRa 구성:
- LORABAND: LoRa 칩 주파수. 주파수는 보드 및 현지에서 허용되는 주파수에 따라 다릅니다. 해당 국가에서 허용되는 주파수만 사용하십시오. 자세한 내용은 여기를 참조하세요.
가능한 값: 433E6, 866E6, 915E6. - SPREADINGFACTOR: LoRa 확산 인자. LoRaMessenger 전송 듀티 사이클을 존중하므로 7보다 높은 값을 사용할 때는 주의하십시오. 값이 높으면 전송 간 대기 시간이 크게 느려지고 올바른 작동에 영향을 미칠 수 있으며 충돌 방지 시간과 같은 기타 조정이 필요할 수 있습니다. 가능한 값: 7 - 12.
- TXDBM: LoRa 칩의 전송 전력.
가능한 값: 1 - 20 - LORADUTY: 전송 듀티 사이클. 해당 국가에서 허용되는 값만 사용하십시오. 가능한 값: 1 - 99.
- NETID: LoRaMessenger 네트워크 ID입니다. 이를 통해 여러 개의 독립적인 네트워크를 생성할 수 있습니다.
가능한 값: 0 - 255.
L1 구성:
- L1BUFFER: 전송 패킷 큐. 대규모 노드 네트워크를 사용하거나 높은 확산 인자를 사용하는 경우 증가합니다.
- TTL: 패킷 수명입니다. 만료되기 전에 패킷이 수행할 수 있는 최대 홉 수를 설정합니다.
가능한 값: 1(직접 메시지만, 릴레이 없음), >1. - BROADCASTADDR: 브로드캐스트 주소 번호.
L3 구성:
- NODENUMBER: 로컬 노드 번호. 각 노드에는 다른 노드 번호가 필요합니다! 이는 일반 네트워크의 IP 주소와 동일하다고 생각할 수 있습니다.
가능한 값: 1 - 255. BROADCASTADDR의 동일한 주소를 사용하지 않도록 주의하십시오! - MAXNODES: 네트워크에서 예상되는 최대 노드 수입니다.
- ANNOUNCEMINS: 노드 존재를 알리고 이름을 업데이트합니다. 이 메시지는 모든 노드에 다른 모든 노드의 존재를 알리는 데 필요합니다. 정적 노드, 높은 확산 인자 또는 대규모 네트워크를 사용하는 경우 스팸을 방지하기 위해 간격을 늘릴 수 있습니다.
- INACTIVEMINS: 노드가 오프라인으로 간주되는 데 필요한 비활성 시간입니다. ANNOUNCEMINS 값의 최소 2~3배를 사용하거나 수신 상태가 좋지 않은 경우 더 큰 값을 사용하도록 주의하세요.
- INACTIVESECONDSREMOVECHECK: 오프라인 노드 제거를 확인하는 간격입니다.
메시지 구성:
- SHOWNMESSAGES: 웹 인터페이스에 표시할 메시지 수입니다.
- KEEPNMESSAGES: 메모리에 보관할 메시지 수입니다.
디스플레이 구성:
- DISPLAYSTBYSECS: 디스플레이가 꺼진 후의 시간(초)입니다.
네트워크 구성:
- WIFIENABLED: Wi-Fi가 활성화되었습니다. 이는 메시지 중계만을 위해 노드를 배포하는 경우 사용되는 전력을 줄이는 데 사용할 수 있습니다.
- NODENAMEOVERRIDEEN: 노드 이름 재정의를 활성화합니다. 기본 노드 이름(노드 [번호])을 NODENAMEOVERRIDE에 지정된 문자열로 재정의하는 데 사용됩니다.
- NODENAMEOVERRIDE: 이름 이름을 재정의합니다. 이는 웹 인터페이스에서 노드 이름을 수정하지 않고 노드 이름을 설정하는 데 사용할 수 있습니다. 릴레이 전용 노드를 설정할 때 유용합니다.
- WIFISSID: Wi-Fi 네트워크 이름 접두사( LoRaMessenger [번호])
- DNSPORT: DNS 포트입니다.
핀아웃:
- SCK: SPI 시계.
- 미소: SPI 미소.
- 모시: 스파이 모시.
- SS: SPI 슬레이브 선택.
- RST: LoRa 칩 재설정.
- DI0: LoRa가 콜백을 수신합니다.
- I2CSCL: I2C 클럭.
- I2CSDA: I2C 데이터.
- LCDRESET: LCD를 재설정합니다.
다른 보드를 사용하는 경우 핀 정의를 편집해야 할 수도 있습니다(핀 정의는 TTGO LoRa32 V2를 기반으로 함).
향후 개선/수정
향후 계획된 다른 기능은 다음과 같습니다.
- 메시지 암호화, 오른쪽부터 모든 메시지는 암호화되지 않은 상태로 전송됩니다.
- 자동 메시지 새로 고침.
- 라우팅 알고리즘 테스트 및 개선.
특허
MIT 라이센스.