# Meshtastic 기술 리서치 (심층 분석) - **주제:** Meshtastic — LoRa 기반 오프그리드 메시 통신 플랫폼 - **유형:** Technical Research (심층 분석) - **작성일:** 2026-06-11 (보강: 2026-06-12) - **작성자:** moongtaeng - **공식 출처:** [meshtastic.org](https://meshtastic.org) · [Introduction](https://meshtastic.org/docs/introduction/) --- ## 1. Executive Summary **Meshtastic는 저가의 LoRa 무전기를 인터넷·기지국·요금 없이 동작하는 장거리 암호화 메시 통신망으로 바꿔주는 오픈소스 프로젝트다.** 휴대폰과 블루투스로 페어링해 문자 메시지와 GPS 위치를 주고받으며, 각 노드가 수신한 메시지를 자동 재전송(rebroadcast)해 자가 치유(self-healing) 네트워크를 형성한다. ### 핵심 가치 제안 1. **제로 인프라:** 기지국·인터넷·월정액 없이 순수 P2P 통신 2. **극저비용:** 노드 1대 $20~50, 월 운영비 $0 3. **장거리:** 단일 홉 2~5km, 최장 기록 331km 4. **암호화 기본:** AES-256-CTR + PKC(v2.5+) DM 보호 5. **확장성:** 노드 추가만으로 커버리지 자동 확대 --- ## 2. 핵심 개념 | 항목 | 내용 | |------|------| | **정체성** | LoRa P2P 메시 네트워킹 프로토콜 + 소프트웨어 플랫폼 (펌웨어 + 앱) | | **목적** | 셀룰러/Wi-Fi/인터넷이 없는 오프그리드 환경에서의 분산형 통신 | | **창시자/시작** | Kevin Hester, 2020년 초 시작. 수백 명이 참여하는 커뮤니티 주도 | | **라이선스** | 오픈소스 (GPL-3.0 펌웨어, 문서 CC BY-SA 4.0), DIY 지향 | | **면허** | ISM 비면허 대역·저출력 사용 → **무선 면허 불필요** (햄라디오와 차별점) | | **커뮤니티 규모** | GitHub 40,000+ stars, 서브레딧 80,000+ 멤버 | | **현재 버전** | Firmware 2.6.x (2026년 기준, Next-Hop Routing 도입) | | **직렬화** | Protocol Buffers (protobuf) — 다중 벤더/구현체 간 호환 | --- ## 3. 프로토콜 아키텍처 (심층) ### 3.1 4계층 프로토콜 스택 Meshtastic의 라우팅 프로토콜은 [RadioHead](https://www.airspayce.com/mikem/arduino/RadioHead) 메시 라우팅에서 영향을 받았으며, 4개의 개념적 레이어로 구성된다. | 계층 | 역할 | 핵심 메커니즘 | |------|------|------------------| | **Layer 3** | Multi-Hop Messaging | Managed Flooding + Next-Hop Routing (v2.6+) | | **Layer 2** | Reliable Zero-Hop Messaging | WantAck + 재전송 최대 3회 | | **Layer 1** | Unreliable Zero-Hop Messaging | Raw LoRa 패킷 + CSMA/CA | | **Layer 0** | LoRa Radio (물리 계층) | Preamble 16심볼 + SyncWord 0x2B + PHY Header | ### 3.2 패킷 구조 (Layer 1) | 오프셋 | 크기 | 필드 | 설명 | |--------|------|------|------| | 0x00 | 4B | Destination | 목적지 NodeID (0xFFFFFFFF = 브로드캐스트), Little-endian | | 0x04 | 4B | Sender | 발신 NodeID | | 0x08 | 4B | Packet ID | 32비트 고유 ID (암호화 공격 방어용 충분한 엔트로피) | | 0x0C | 1B | Flags | HopLimit[0:2], WantAck[3], ViaMQTT[4], HopStart[5:7] | | 0x0D | 1B | Channel Hash | 복호화 힌트 | | 0x0E | 1B | Next-Hop | 릴레이 대상 노드 (v2.6+) | | 0x0F | 1B | Relay Node | 현재 전송의 릴레이 노드 | | 0x10 | ≤237B | Payload | 암호화된 protobuf SubPacket (미사용 바이트는 미전송) | **NodeID 생성:** Bluetooth MAC 주소의 하위 4바이트. IEEE OUI 할당 체계 덕분에 제조사별 사실상 고유. ### 3.3 채널 접근 제어: CSMA/CA Wi-Fi와 유사한 **Carrier-Sense Multiple Access with Collision Avoidance**를 채택: 1. 전송 전 반드시 **Channel Activity Detection(CAD)** 수행 2. 채널 사용 중(busy)이면 idle까지 대기 3. idle 후에도 **랜덤 슬롯 시간** 대기 (contention window에서 선택) 4. 채널 이용률이 높을수록 CW 크기 증가 → 충돌 확률 감소 ### 3.4 Managed Flooding (브로드캐스트) 초기 버전부터 Meshtastic의 핵심 브로드캐스트 라우팅 전략이며, SNR 기반 우선순위는 점진적으로 개선되어 왔다: 1. 수신 노드가 `HopLimit ≠ 0`이면 감소 후 재전송 **시도** 2. 재전송 전 **SNR 기반 Contention Window**로 대기: - **낮은 SNR(먼 노드) = 작은 CW** → 먼 노드가 먼저 재전송 확률 높음 - 가까운 노드는 먼 노드의 재전송을 들으면 **재전송 취소** 3. `ROUTER`/`REPEATER` 역할은 예외적으로 **항상 우선 재전송** 4. 결과: 메시지가 자연스럽게 **가장 먼 경로로 전파** → 최소 전송으로 최대 커버리지 ``` 예시: Node 0 → [브로드캐스트] → Node 1(가까움), Node 2(멀음) Node 2: 낮은 SNR → 작은 CW → 먼저 재전송 Node 1: Node 2의 재전송 확인 → 재전송 취소 Node 3: Node 2로부터 수신 → HopLimit 확인 후 재전송 ``` ### 3.5 Next-Hop Routing (DM, v2.6+) **다이렉트 메시지(DM)에 대해서만** 적용되는 새 라우팅 전략: 1. **초기:** Managed Flooding으로 목적지까지 전달 2. **학습:** 성공적 전달 후, 응답을 릴레이한 노드를 **next-hop**으로 기록 3. **이후:** 해당 목적지로의 메시지는 next-hop 노드만 릴레이 → 채널 사용량 대폭 감소 4. **폴백:** next-hop 실패 시(이동·RF 변화) → 마지막 재전송에서 Managed Flooding으로 복귀 ### 3.6 자동 트래픽 스케일링 (40+ 노드) 메시가 40개 이상의 활성 노드(최근 2시간 내 감지)를 가지면 자동으로 브로드캐스트 간격을 스케일: ``` ScaledInterval = Interval × (1.0 + ((OnlineNodes - 40) × 0.075)) ``` 예: 62개 노드 → 텔레메트리 30분 기본 → **79.5분**으로 자동 연장 ### 3.7 정기 브로드캐스트 유형 | 유형 | 기본 간격 | 설정 키 | |------|-----------|---------| | Device Telemetry | 30분 | `telemetry.device_update_interval` | | Position | 15분 (Smart Broadcast) | `position.position_broadcast_secs` | | NodeInfo | 3시간 | `device.node_info_broadcast_secs` | --- ## 4. 노드 역할(Device Role) — 운영의 핵심 > ⚠️ **가장 흔한 실수가 ROLE 오설정.** 공식 문서는 대부분의 경우 `CLIENT` 계열 유지를 강력 권장. | 역할 | 동작 | 권장 용도 | |------|------|-----------| | **CLIENT** (기본) | 송수신 + SNR 기반 스마트 지연 후 재전송 | 거의 모든 일반 사용자, 하이킹·이동 | | **CLIENT_MUTE** | 송수신만, 재전송 안 함 | 트래픽 혼잡 지역, 여러 대 중 보조 기기 | | **CLIENT_BASE** | CLIENT + 즐겨찾기 노드 우선 재전송 | 거점(집/사무실) 기기 | | **ROUTER** | 우선순위 재전송, 절전 최적화, 텔레메트리 축소 | **산 정상·고층 옥상 등 전략적 고지대 인프라만** | | **REPEATER** | ROUTER + 자체 트래픽 완전 차단, 노드 목록 미표시 | 순수 신호 중계 인프라 (무인) | | **ROUTER_LATE** | "정중한" 재전송 — 타 노드가 중계 중이면 양보 | 차량 임시 중계, 조건부 인프라 | ### 역할 배치 전략 ``` 이상적 구성 = 다수의 CLIENT + 소수의 잘 배치된 ROUTER ``` **ROUTER/REPEATER 남용의 결과:** - 우선순위 재전송 특성 → 이웃한 라우터들이 동시 송신 - 패킷 충돌·노이즈 증가·전달률 저하·유효 범위 감소 - 배포 전 지도에서 기존 인프라 확인 필수 - ROUTER 간 **최소 거리 확보** (서로의 직접 수신 범위 밖이 이상적) --- ## 5. 채널 시스템 ### 5.1 채널 구조 - **최대 8개 채널** (인덱스 0~7) 동시 운용 가능 - **PRIMARY (1개):** 기본 채널, 위치·텔레메트리·NodeInfo가 이 채널로 전송 - **SECONDARY (최대 7개):** 추가 그룹/목적별 채널 - 채널 간에 DISABLED 공백 불가 — 연속으로 설정해야 함 ### 5.2 채널 설정 요소 | 설정 | 설명 | |------|------| | **Name** | 12바이트 미만 식별자 (빈 값 = 기본 "LongFast") | | **PSK** | 암호키: 0바이트(암호화 없음), 16바이트(AES-128), 32바이트(AES-256) | | **Uplink Enabled** | 메시→MQTT 전달 허용 | | **Downlink Enabled** | MQTT→메시 전달 허용 | | **Position Precision** | 0(위치 미전송)~32(완전 정밀) 비트 정밀도 | | **Is Muted** | 해당 채널 수신 시 외부 알림 차단 | ### 5.3 주파수 슬롯 결정 > ⚠️ **PRIMARY 채널의 이름 해시가 LoRa 주파수 슬롯을 결정한다.** 서로 다른 PRIMARY 채널 이름을 가진 기기는 **물리적으로 다른 주파수에서 송신**하므로 서로 들을 수 없다. 이를 피하려면 `lora.frequency_slot`을 명시적으로 지정해야 한다. ### 5.4 위치 정밀도 제어 | 비트 수 | 정밀도 | |---------|--------| | 10 | ~23.3km | | 13 | ~2.9km | | 16 | ~364m | | 19 | ~45m | | 32 | 완전 정밀 | --- ## 6. LoRa 무선 설정 (심층) ### 6.1 모뎀 프리셋 (속도 ↔ 거리 트레이드오프) | 프리셋 | 특성 | 용도 | |--------|------|------| | **SHORT_TURBO** | 최고속, BW 500kHz, 최단거리 | 일부 지역 위법 가능 | | **SHORT_FAST** | 고속 | 밀집 지역, 빈번한 메시지 | | **SHORT_SLOW** | 중고속 | | | **MEDIUM_FAST** | 중속 | | | **MEDIUM_SLOW** | 중저속 | | | **LONG_FAST** ⭐(기본) | 속도·거리 최적 균형 | **대부분의 사용자 권장** | | **LONG_MODERATE** | 저속·장거리 | 넓은 커버리지 필요 시 | | **LONG_SLOW** | 초저속·초장거리 | | | **VERY_LONG_SLOW** | 극저속, 최장거리 | 메시 형성 어려움, 비권장 | ### 6.2 수동 LoRa 파라미터 | 파라미터 | 범위 | 설명 | |----------|------|------| | **Bandwidth** | 31.25kHz ~ 1625kHz | 넓을수록 고속·단거리, 좁을수록 저속·장거리 | | **Spread Factor** | 5~12 | 높을수록 장거리·저속 (SX127x는 7~12만 지원) | | **Coding Rate** | 4/5 ~ 4/8 | 높을수록 오류 내성 증가·속도 감소 | ### 6.3 한국(KR) 지역 설정 | 항목 | 값 | |------|-----| | 리전 코드 | `KR` | | 주파수 대역 | **920.0 ~ 923.0 MHz** | | 채널 수 | 100 | | Duty Cycle 제한 | 없음 (다만 전파법 준수 필수) | | 법적 근거 | 전파법 시행령, 비면허 소출력 무선기기 | > 💡 **한국 사용자 필수:** 기기 구매 시 반드시 **920MHz 대역 하드웨어** 확인. 미국용(915MHz) 기기는 주파수 불일치로 한국 메시와 통신 불가. 대부분의 글로벌 벤더가 "KR" 또는 "AS923" 변종을 별도 판매. ### 6.4 주요 LoRa 설정 옵션 | 설정 | 설명 | |------|------| | **Max Hops** | 기본 3, 최대 7. "3이면 대부분 충분" | | **Transmit Power** | 0 = 법적 최대 연속 출력 자동 적용 (dBm) | | **SX126x RX Boosted Gain** | 약간의 추가 전력으로 수신 감도 향상 | | **Ignore MQTT** | true 시 MQTT 경유 패킷 무시 | | **OK to MQTT** | true 시 본인 패킷의 MQTT 업링크 허용 (예의 기반, 강제 아님) | | **Override Frequency** | 비면허 대역 밖 주파수 사용 (HAM 면허자 전용) | --- ## 7. 보안·암호화 (심층) ### 7.1 암호화 계층 구조 | 메시지 유형 | 암호화 방식 | 비고 | |-------------|-------------|------| | **Direct Messages** (v2.5+) | PKC — 수신자 공개키로 암호화 + 발신자 개인키 서명 | 채널 키 알아도 DM 열람 불가 | | **Channel Messages** (브로드캐스트/그룹) | AES-256-CTR (채널별 PSK) | 패킷 헤더는 평문 (릴레이 위해 의도적) | | **Admin Messages** (v2.5+) | 강화된 암호화 + Session ID | 리플레이 공격 방지 | ### 7.2 WPA3/TLS1.3/Signal 대비 한계점 | 보안 속성 | Meshtastic 상태 | 비고 | |-----------|----------------|------| | **기밀성(Confidentiality)** | ✅ AES-256-CTR | 양자 내성 (NIST 기준) | | **무결성(Integrity)** | ⚠️ 채널 메시지 미검증 | DM은 v2.5+ 서명으로 보호. 채널은 AEAD 미구현 ([#4030](https://github.com/meshtastic/firmware/issues/4030)) | | **인증(Authentication)** | ⚠️ 채널 내 스푸핑 가능 | NodeID = MAC 기반. 채널 키 보유자는 발신자 위조 가능 | | **PFS(Forward Secrecy)** | ❌ 미지원 | "Harvest now, Decrypt later" 취약. 키 유출 시 과거 트래픽 복호화 가능 | ### 7.3 v2.5+ PKC (Public Key Cryptography) 변화 - **DM:** 수신자 공개키로 암호화 → 채널 키 알아도 DM 열람 불가 - **서명:** 발신자 개인키로 서명 → 메시지 무결성 + 발신자 인증 - **Admin:** Session ID 도입 → 리플레이 공격 방지 - **제약:** 현재 양자 내성 암호(PQC)가 LoRa 패킷 크기와 IoT 하드웨어에 부적합 ### 7.4 보안 권장사항 1. 기본 PSK(`AQ==`)는 **공개키**와 같다 — 반드시 변경 2. 비밀 채널의 PSK를 **무인 라우터에 설정하지 말 것** (물리 접근으로 키 추출 가능) 3. 주기적 키 변경 권장 4. 민감 정보는 DM(v2.5+ PKC)으로만 전송 5. 공개 MQTT 연결 시 위치 정밀도 제한 설정 --- ## 8. 하드웨어 생태계 (2026년 종합) ### 8.1 MCU 플랫폼 비교 | 플랫폼 | 칩 | 클럭 | Wi-Fi | BLE | 딥슬립 전류 | LoRa RX 전류 | 최적 용도 | |--------|-----|------|-------|-----|-------------|-------------|-----------| | **nRF52840** | Nordic Cortex-M4 | 64MHz | ❌ | 5.0 | ~11µA | ~8mA | 솔라 중계기, 휴대용, 장기 배터리 | | **ESP32-S3** | Xtensa 듀얼코어 | 240MHz | ✅ | 5.0 | ~10µA | 40~80mA | MQTT GW, 디스플레이, 데이터 집약 | | **RP2040** | Dual Cortex-M0+ | 133MHz | ❌(별도) | ❌ | ~0.8mA | 별도 모듈 | 실험적/Pico 기반 | ### 8.2 LoRa 칩셋 세대 | 세대 | 칩셋 | 특징 | 비고 | |------|------|------|------| | **1세대 (구형)** | SX1276/SX1278 | SF 7~12만, 전력 높음 | 신규 구매 비권장 | | **2세대 (권장)** | SX1262 | 저전력, SF 5~12, 감도 우수 | 2026년 메인스트림 | | **3세대 (최신)** | LR1110/LR1121 | GNSS 스캐너 내장, 다중밴드 | T1000-E, muzi BASE Duo | ### 8.3 2026년 커뮤니티 인기 기기 종합 #### 핸드헬드 / 일상 휴대 | 기기 | MCU | LoRa | 특징 | 가격대 | |------|-----|------|------|--------| | **RAK WisMesh Pocket V2** | nRF52840 | SX1262 | GPS, BLE 5.0, 컴팩트 케이스 | $40~50 | | **SenseCAP T1000-E** | nRF52840 | LR1110 | 신용카드 크기, 초장시간 배터리, Plug&Play | $35~45 | | **Heltec Mesh Node T114** | nRF52840 | SX1262 | 소형, 저전력 | $25~35 | | **Heltec MeshPocket** | nRF52840 | SX1262 | QI2 무선충전, 올인원 | $40~50 | | **B&Q Nano G2 Ultra** | nRF52840 | SX1262 | 견고한 케이스, GPS | $60~80 | | **LILYGO T-Echo** | nRF52840 | SX1262 | E-Ink 디스플레이, GPS, 사출 케이스 | $50~70 | | **Elecrow ThinkNode M1** | nRF52840 | SX1262 | GPS, 저전력 | $35~50 | | **muzi R1 Neo** | nRF52840 | SX1262 | GPS, RTC, 부저 내장, 견고 | $50~70 | #### 독립형 (키보드+스크린) | 기기 | MCU | 특징 | 가격대 | |------|-----|------|--------| | **LILYGO T-Deck / T-Deck Plus / Pro** | ESP32-S3 | 키보드+스크린, Wi-Fi, 독립 운용 | $50~100 | | **LILYGO T-Lora Pager** | ESP32-S3 | LR1121, 키보드, 페이저 폼팩터 | $60~80 | #### 인프라 / 게이트웨이 | 기기 | MCU | 특징 | 가격대 | |------|-----|------|--------| | **Heltec WiFi LoRa 32 V3/V4** | ESP32-S3 | OLED, Wi-Fi → MQTT GW, 최저가 | $18~25 | | **RAK WisMesh 1W Booster** | nRF52840 | **1W 출력**, SX1262, 장거리 인프라 | $80~120 | | **RAK WisMesh Repeater/Mini** | nRF52840 | 솔라 최적화, 무인 중계 전용 | $50~70 | | **RAK WisMesh Ethernet MQTT GW** | nRF52840 | 유선 이더넷 MQTT | $70~90 | | **RAK WisMesh WiFi MQTT GW** | ESP32 | Wi-Fi MQTT 전용 | $60~80 | | **B&Q Station G2** | ESP32-S3 | 고출력 HAM 트랜시버 | $100~150 | | **SenseCAP Solar Node** | nRF52840 | 솔라 패널 통합, IP65 방수 | $60~90 | #### 개발/프로토타이핑 | 기기 | MCU | 특징 | |------|-----|------| | **RAK WisBlock (19007+4631)** | nRF52840 | 모듈식, 센서 확장 최적 | | **Seeed Wio Tracker L1** | nRF52840 | GPS, 개발보드, Pro 케이스 옵션 | | **LILYGO T-Beam S3-Core** | ESP32-S3 | GPS, 18650 배터리 홀더 | | **Raspberry Pi Pico** | RP2040 | SX1262 HAT, 실험용 | | **Linux (meshtasticd)** | 다양 | Mac/Linux를 노드로 사용 | ### 8.4 안테나 선택 가이드 | 용도 | 추천 안테나 | 비고 | |------|------------|------| | **핸드헬드** | GIZONT 17cm, LINX ANT-916-CW-HW-SMA, ZIISOR TX915-JKS-20 | 소형, SMA 커넥터 | | **베이스/리피터** | Alfa AOA-915-5ACM, Rokland 32" 5.8dBi | 옴니, 고이득 | | **차량** | Laird MA9-5N, Taoglas TI.16.5F11 | 자석 마운트, 방수 | | **DIY** | 1/4파장 그라운드 플레인, J-Pole | 가성비 최고 | **안테나 핵심 원칙:** - 안테나 품질이 출력보다 **더 큰 영향** — 나쁜 안테나 + 1W < 좋은 안테나 + 100mW - **VSWR 2:1 이하** 목표 (NanoVNA로 측정 권장) - **고도가 왕** — 옥상 3m 높이면 평지 대비 범위 2~3배 - 한국용: **920~923MHz** 대역 안테나 확인 필수 --- ## 9. MQTT 인터넷 브리지 (심층) ### 9.1 아키텍처 > [!info] 데이터 흐름 > **로컬 메시 A** — Node1 ↔ Node2(GW) >      ↓ Wi-Fi/ETH > **인터넷** — MQTT Broker >      ↓ Wi-Fi/ETH > **로컬 메시 B** — Node3(GW) ↔ Node4 ### 9.2 MQTT 토픽 구조 ``` msh/{REGION}/2/e/{CHANNELNAME}/{USERID} ← Protobuf (암호화 가능) msh/{REGION}/2/json/{CHANNELNAME}/{USERID} ← JSON (nRF52 미지원) ``` ### 9.3 공용 서버 제한사항 (`mqtt.meshtastic.org`) | 제한 | 내용 | |------|------| | **Zero-Hop Policy** | 공용 MQTT 경유 메시지는 수신 노드의 직접 연결만, 로컬 메시 내 릴레이 ❌ | | **포트넘 필터** | NodeInfo, TextMessage, Position, Telemetry, MapReport, Routing만 허용 | | **위치 정밀도** | 기본 PSK 사용 시 정밀 위치(17+비트) 필터링됨 | ### 9.4 JSON 메시지 형식 (Home Assistant/Node-RED 연동) ```json { "id": 452664778, "channel": 0, "from": 2130636288, "payload": { "hardware": 10, "id": "!7efeee00", "longname": "base0", "shortname": "BA0" }, "sender": "!7efeee00", "timestamp": 1646832724, "to": -1, "type": "nodeinfo" } ``` ### 9.5 JSON Downlink (외부→메시 메시지 전송) ```json { "from": 2130636288, "to": 4294967295, "channel": 0, "type": "sendtext", "payload": "Hello from MQTT!" } ``` **지원 타입:** `sendtext` (텍스트), `sendposition` (위치: `latitude_i`, `longitude_i`, `altitude`, `time`) ### 9.6 소프트웨어 연동 예시 | 플랫폼 | 연동 방식 | |--------|-----------| | **Home Assistant** | MQTT Integration → Automation/Dashboard | | **Node-RED** | MQTT 노드로 메시지 파싱·라우팅 | | **Mosquitto** | CLI 기반 subscribe/publish | | **Python** | meshtastic-python 라이브러리 or paho-mqtt | | **Adafruit IO** | 센서 데이터 시각화 | ### 9.7 MQTT 베스트 프랙티스 1. 브리지할 채널만 의도적으로 활성화 2. **다운링크는 메시당 노드 1개만** (다중 GW → 중복 주입) 3. 모니터링만 원하면 업링크만 4. 공용 서버는 기본 LongFast 채널 트래픽 과다 → **별도 채널·자체 브로커 권장** 5. 기본 PSK 사용 시 공용 서버 보안 취약 → **프라이빗 채널 + 자체 브로커** 6. nRF52 기기: JSON 미지원, Protobuf만 가능 --- ## 10. 모듈 시스템 (전체) ### 10.1 내장 모듈 카탈로그 | 모듈 | 기능 | 용도 | |------|------|------| | **Telemetry** | I2C 센서 자동 감지, 환경/전력/건강/대기질 메트릭 전송 | IoT/기상 모니터링 | | **Store & Forward** | 오프라인 노드용 메시지 저장, 복귀 시 전달 | 비동기 통신 | | **Range Test** | GPS 포함 주기적 메시지로 거리 테스트, CSV 로깅 | 커버리지 측정 | | **Detection Sensor** | GPIO 핀 모니터링, 상태 변화 시 텍스트 알림 | 문열림/침입 감지 | | **External Notification** | LED, 부저, 진동 모터 제어 | 수신 알림 | | **Canned Messages** | 미리 설정된 메시지를 로터리 인코더로 선택·전송 | 핸즈프리 | | **Serial** | 시리얼 포트 경유 메시지 송수신 | 외부 MCU/PC 연동 | | **Remote Hardware** | 원격 GPIO 읽기/쓰기 | 원격 릴레이 제어 | | **Audio** | Codec2 음성 코덱 (일부 기기) | 저대역 음성 | | **Neighbor Info** | 0-hop 이웃 정보 메시 공유 | 네트워크 토폴로지 시각화 | | **Paxcounter** | BLE/Wi-Fi 기기 카운팅 | 유동인구 측정 | | **Traceroute** | 메시지 경로 추적 | 네트워크 디버깅 | | **Ambient Lighting** | NCP5623 I2C RGB LED 밝기 조절 | 상태 표시 | | **MQTT** | 인터넷 게이트웨이 | 원거리 브리지 | ### 10.2 텔레메트리 센서 지원 (40종+) **환경 센서:** - 온습도: AHT10/20, SHTC3, SHT31, SHT4X - 기압: BMP085/180/280/388/390, BME280, DPS310, LPS22 - 복합(온+습+기압+VOC): **BME680/688** (가장 인기) - 조도: OPT3001, VEML7700, TSL2591 - UV: LTR390UV - 거리: RCWL9620 (초음파) - 대기질: PMSA003I (PM2.5/PM10) - 기상: DFROBOT_LARK (온습+기압+풍향+풍속), DFROBOT_RAIN (강우량) - 방사선: RadSens (방사선량) **전력 센서:** INA219/226/260/3221 (전류·전압) **건강 센서:** MAX30102 (심박·SpO2), MLX90614/90632 (체온) **기타:** NAU7802 (24비트 ADC/로드셀) --- ## 11. 클라이언트 앱 & 인터페이스 | 플랫폼 | 앱 | 연결 | 특징 | |--------|-----|------|------| | **Android** | Meshtastic (공식) | BLE, Wi-Fi, USB Serial | 전체 기능, 지도, 채널 관리, 메시 시각화 | | **iOS/iPadOS/macOS** | Meshtastic (공식) | BLE | 전체 설정, SwiftUI 기반 | | **Web** | Web Client | Wi-Fi (ESP32), Serial | 브라우저 기반, 펌웨어 설정 가능 | | **Python CLI** | meshtastic-python | Serial, TCP, BLE | 스크립팅, 자동화, 고급 설정 | | **Flasher** | flasher.meshtastic.org | USB | 웹 기반 펌웨어 플래싱 | --- ## 12. 통신 범위(Range) 심층 ### 12.1 범위 결정 요소 (중요도 순) 1. **안테나 품질 & 높이** — 가장 큰 영향. 10m 높이 차이 = 범위 2~5배 2. **Line of Sight(가시선)** — 장애물(건물, 산, 숲)이 범위의 80%를 결정 3. **LoRa 모뎀 프리셋** — LONG_SLOW vs SHORT_FAST = 10배 이상 범위 차이 4. **출력 전력(dBm)** — 영향은 있으나 안테나/고도보다 작음 5. **수신 감도** — SX126x + Boosted Gain으로 최대화 ### 12.2 실전 범위 기대치 | 환경 | 기대 범위 | 조건 | |------|-----------|------| | 도심 | 0.5~2km | 건물 차폐, 기본 안테나 | | 교외/주거지 | 2~5km | 일부 장애물, 기본 안테나 | | 개활지/농촌 | 5~15km | LOS 양호, 외장 안테나 | | 산악/고도 | 15~50km | 고지대 설치, 고이득 안테나 | | 극한 LOS | 50~331km | 양측 고지대, 최적 안테나 | ### 12.3 범위 최적화 팁 - **고도 확보:** 옥상, 나무 위, 마스트 설치 → 단일 변수 중 가장 효과적 - **외장 안테나:** 번들 안테나 교체만으로 2~3배 개선 - **Fresnel Zone:** LOS만으로 부족 — 중간 장애물이 Fresnel 영역 60% 이상 침범하면 신호 급감 - **LONG_SLOW 프리셋:** 최대 범위 필요 시 (대신 속도 희생) - **SX126x RX Boosted Gain:** 설정 한 줄로 수신 감도 향상 --- ## 13. 전력 관리 & 솔라 운용 ### 13.1 전력 소모 프로파일 (대략적) | MCU | 모드 | 전류 | |-----|------|------| | nRF52840 | 딥슬립 | ~11µA | | nRF52840 | LoRa RX (수신 대기) | ~8mA | | nRF52840 | LoRa TX (송신) | ~40~120mA (출력에 따라) | | ESP32-S3 | 딥슬립 | ~10µA | | ESP32-S3 | LoRa RX + Wi-Fi 연결 | 80~150mA | | ESP32-S3 | LoRa TX | ~120~300mA | ### 13.2 솔라 중계기 설계 고려사항 | 항목 | 권장 | |------|------| | MCU | **nRF52840** (필수 — ESP32는 전력 초과) | | 역할 | ROUTER 또는 REPEATER | | 배터리 | 18650 Li-ion 3,000~6,000mAh, 또는 LiPo | | 솔라 패널 | 5V/1W 이상 (겨울·흐린 날 고려 시 2~3W) | | 충전 IC | TP4056 또는 보드 내장 충전 회로 | | 예상 소모 | ~15mA 평균 (RX 대기 + 간헐 TX) | | 자율 운영 | 솔라 2W + 3000mAh = 흐린 날 2~3일 무중단 | ### 13.3 배터리 수명 추정 (nRF52840 CLIENT) | 배터리 | 예상 수명 | 조건 | |--------|-----------|------| | 1000mAh LiPo | 3~5일 | GPS ON, 15분 위치 | | 3000mAh 18650 | 7~14일 | GPS OFF, 텔레메트리 30분 | | 6000mAh 2S | 14~30일 | GPS OFF, CLIENT_MUTE | --- ## 14. 네트워크 설계 & 배포 전략 ### 14.1 소규모 그룹 (2~10명, 하이킹) ``` 구성: 전원 CLIENT 역할 프리셋: LONG_FAST (기본) Hop: 3 (기본) 특별 설정 없음 → Plug & Play ``` ### 14.2 마을/도시 커버리지 (20~100+ 노드) > [!example] 마을/도시 배포 구조 > 1. **ROUTER** (산/옥상 고지대) — 솔라 + nRF52840 >   ↕ LOS 확보 > 2. **ROUTER_LATE** (건물 옥상) — 솔라 or AC 전원 >   ↕ > 3. **다수 CLIENT** (사용자) — 핸드헬드/가정 >   ↕ > 4. **ESP32 MQTT GW** (1~2대) — 인터넷 브리지 **핵심 원칙:** - ROUTER는 **5km 이상 간격**, 서로 직접 커버하지 않도록 - 평지 도시: 2~3km 간격으로 옥상 ROUTER 배치 - 다운링크 GW는 메시당 **1대만** - 40+ 노드 예상 시 자동 스케일링 발동 → 추가 설정 불필요 ### 14.3 네트워크 모니터링 - **Traceroute 모듈:** 경로 추적으로 병목 식별 - **Neighbor Info:** 토폴로지 시각화 - **Device Telemetry:** 배터리 잔량, 채널 이용률, Airtime 모니터링 - **MQTT + Grafana:** 장기 트렌드 분석 --- ## 15. MQTT 연동 자동화 예시 ### 15.1 Home Assistant 연동 시나리오 ```yaml # MQTT 센서 예시 (configuration.yaml) mqtt: sensor: - name: "Meshtastic 옥상 온도" state_topic: "msh/KR/2/json/LongFast/!abcd1234" value_template: "{{ value_json.payload.temperature }}" unit_of_measurement: "°C" - name: "Meshtastic 배터리" state_topic: "msh/KR/2/json/LongFast/!abcd1234" value_template: "{{ value_json.payload.battery_level }}" unit_of_measurement: "%" ``` ### 15.2 Node-RED 플로우 구조 > [!info] Node-RED 플로우 > **MQTT In** → **JSON Parse** → **Switch (type 분기)** > - `nodeinfo` → 노드 목록 갱신 → Dashboard > - `position` → 지도 업데이트 → Dashboard > - `telemetry` → 센서 대시보드 → Dashboard > - `text` → 메시지 알림 → Dashboard --- ## 16. 활용 사례 (확장) ### 16.1 재난·비상 통신 - 지진/태풍으로 기지국 마비 시 **즉시 가용한 백업 네트워크** - 사전 배포된 솔라 ROUTER 인프라 → 재난 시 자동 활성화 - Store & Forward 모듈 → 간헐적 연결 환경에서도 메시지 보존 ### 16.2 아웃도어·탐험 - 등산 그룹 간 오프그리드 연락 (CLIENT 노드, 최소 설정) - GPS 위치 공유 → 조난 시 마지막 위치 확인 - Range Test 모듈로 실시간 커버리지 맵핑 ### 16.3 도시/마을 커뮤니티 네트워크 - 주민 자발적 노드 배치 → 마을 전역 통신망 - 커뮤니티 채널 + 개인 채널 분리 운영 - MQTT GW → 커뮤니티 대시보드 ### 16.4 IoT / 스마트 농업 - 원격 센서 노드 (온습도·토양수분·기상) → 메시 경유 → MQTT → HA/Grafana - 장거리 + 솔라 운영 = LoRaWAN 대비 **인프라 비용 $0** - Detection Sensor + Remote Hardware = 원격 관수·밸브 제어 ### 16.5 이벤트·페스티벌 - 대규모 인원 밀집 → 셀룰러 과부하 시 대안 - 일회성 메시 배포 → 이벤트 종료 후 철수 - Canned Messages → 스태프 간 정형 메시지 빠른 전달 ### 16.6 교육·메이커 - LoRa·메시 네트워킹·IoT 교육 플랫폼 - 저비용으로 네트워크 프로토콜 실습 - Python CLI로 프로그래밍 연동 --- ## 17. 한계 & 주의점 | 한계 | 상세 | 완화 방법 | |------|------|-----------| | **극히 제한된 대역폭** | 페이로드 최대 237바이트, 텍스트 ~228자 | 짧은 메시지 설계, 센서 데이터 압축 | | **이미지·음성·파일 불가** | LoRa 물리적 한계 | Codec2 음성 모듈(매우 제한적), 텍스트 위주 | | **네트워크 혼잡** | 40+ 노드, 빈번한 메시지 → 채널 포화 | 자동 스케일링, 빠른 프리셋, CLIENT_MUTE | | **가시선 의존** | 장애물에 급격한 신호 감쇄 | 고도 확보, 다수 중계 노드 | | **지역 주파수 비호환** | 미국 915MHz ↔ 유럽 868MHz ↔ 한국 920MHz | 구매 시 지역 변종 확인 | | **PFS 미지원** | 키 유출 시 과거 트래픽 복호화 가능 | 주기적 키 교체 | | **채널 메시지 무결성 미검증** | 위변조 탐지 불가 (채널) | DM(PKC) 사용, AEAD 향후 지원 예정 | | **단일 페어링** | 1 노드 = 1 휴대폰만 동시 BLE 연결 | Wi-Fi(ESP32)로 다중 접근 가능 | | **MQTT 프라이버시** | 공용 서버 연결 시 위치 노출 가능 | Position Precision 제한, 자체 브로커 | --- ## 18. Meshtastic vs MeshCore 심층 비교 ### 18.1 기본 비교 | 항목 | Meshtastic | MeshCore | |------|-----------|----------| | **출시** | 2020 (성숙) | 2025 (신생) | | **라우팅** | Managed Flooding + Next-Hop(v2.6) | Structured Routing (전용 리피터) | | **최대 홉** | 7 | **64** | | **설정 난이도** | 매우 쉬움 (Plug & Play) | 중간 (리피터 계획 필요) | | **앱** | 무료 오픈소스 (Android/iOS) | 무료 (프리미엄 $7.99 또는 10초 대기) | | **커뮤니티** | 대규모 (40K+ GitHub stars) | 급성장 중 | | **확장성** | 소~중규모 최적 | 대규모 우수 | | **배달 확인** | 기본적 (ACK) | **상세한 확인 피드백** | | **네트워크 트래픽** | Flooding → 채널 사용률 높음 | 최소화 (리피터만 중계) | | **하드웨어** | 동일 하드웨어 공유 | 동일 하드웨어 공유 | | **상호 호환** | ❌ | ❌ (서로 통신 불가) | ### 18.2 라우팅 철학 차이 **Meshtastic (민주적):** - 모든 CLIENT가 자동으로 메시지 릴레이 참여 - 중앙 인프라 불필요 → ad-hoc에 강함 - 단점: 노드 증가 시 채널 포화 **MeshCore (구조적):** - Companion(사용자) ≠ Repeater(인프라) 역할 분리 - Companion은 릴레이 안 함 → 채널 깨끗 - Repeater가 경로를 학습하여 최적 라우팅 - 단점: 리피터 미배치 시 통신 불가 ### 18.3 선택 기준 | 시나리오 | 추천 | |----------|------| | 소규모 그룹, 즉석 사용 | **Meshtastic** | | 초보자, 쉬운 설정 | **Meshtastic** | | 대규모 도시망 (100+ 노드) | **MeshCore** | | 전달 확인 중요 | **MeshCore** | | 커뮤니티·문서·지원 | **Meshtastic** | | 실험·얼리어답터 | **MeshCore** | --- ## 19. 개발자 관점 ### 19.1 개발 생태계 | 구성요소 | 기술 | |----------|------| | 펌웨어 | C++ (PlatformIO) | | Protobuf 정의 | [github.com/meshtastic/protobufs](https://github.com/meshtastic/protobufs) | | Python API | meshtastic-python (pip) | | Android 앱 | Kotlin, Jetpack Compose | | iOS 앱 | SwiftUI | | Web Client | TypeScript | | 시뮬레이터 | [Meshtasticator](https://github.com/GUVWAF/Meshtasticator) (이론적 성능 테스트) | | Linux Daemon | `meshtasticd` (Mac/Linux 노드화) | ### 19.2 확장 개발 진입점 1. **Python CLI 스크립팅:** 가장 쉬운 시작점 — 메시지 송수신, 설정 변경 2. **MQTT 연동:** Protobuf/JSON 파싱으로 외부 시스템 통합 3. **모듈 개발:** C++ 펌웨어 레벨에서 새 기능 추가 4. **Protobuf 기반 앱:** 앱 직접 개발 시 protobuf 정의를 참조 --- ## 20. 한국 사용자를 위한 실전 가이드 ### 20.1 초기 설정 체크리스트 1. ☐ 기기 구매: **920MHz(KR) 대역** 확인 2. ☐ 펌웨어 플래싱: flasher.meshtastic.org → 리전 `KR` 선택 3. ☐ 앱 설치: Android/iOS Meshtastic 앱 4. ☐ BLE 페어링: 기기 ↔ 스마트폰 5. ☐ 리전 설정: `KR` (920~923MHz) 6. ☐ 모뎀 프리셋: `LONG_FAST` (기본, 범용) 7. ☐ 채널 PSK 변경: 기본값(`AQ==`)에서 랜덤 키로 교체 8. ☐ 이름 설정: Long Name + Short Name ### 20.2 한국 관련 고려사항 - **전파법:** 비면허 소출력 무선기기로 사용 가능 (출력 제한 준수) - **주파수:** 920~923MHz (일본 JP 920.8~927.8MHz과 일부 겹침, 상호 운용 가능성 있으나 공식 보장 아님) - **안테나:** 한국 920MHz 대역에 튜닝된 안테나 사용 (915MHz 미국 안테나는 최적이 아님) - **기기 구매처:** AliExpress(직구), 국내 전자부품 쇼핑몰, Seeed/RAK 공식 스토어 - **커뮤니티:** 한국 Meshtastic Discord/카카오톡 그룹 검색 권장 --- ## 21. 향후 전망 & 로드맵 방향 | 방향 | 상세 | |------|------| | **AEAD 채널 모드** | AES-GCM 등으로 채널 메시지 무결성 보장 ([#4030](https://github.com/meshtastic/firmware/issues/4030)) | | **Next-Hop 고도화** | 더 효율적인 유니캐스트 라우팅 | | **nRF 생태계 확대** | 저전력 플랫폼 중심 성장 | | **LR11xx 확산** | GNSS 내장 LoRa → 별도 GPS 불필요 | | **meshtasticd 발전** | Linux/Mac 데스크톱·서버 노드 | | **MeshCore 경쟁** | 대규모 네트워크 시나리오 대응 필요 | --- ## 출처 (Sources) ### 공식 문서 - [Meshtastic — Introduction](https://meshtastic.org/docs/introduction/) - [Meshtastic — Off-Grid Communication For Everyone](https://meshtastic.org/) - [Meshtastic — Mesh Broadcast Algorithm](https://meshtastic.org/docs/overview/mesh-algo/) - [Meshtastic — Encryption](https://meshtastic.org/docs/overview/encryption/) - [Meshtastic — LoRa Configuration](https://meshtastic.org/docs/configuration/radio/lora/) - [Meshtastic — Channel Configuration](https://meshtastic.org/docs/configuration/radio/channels/) - [Meshtastic — Supported Hardware](https://meshtastic.org/docs/hardware/devices/) - [Meshtastic — LoRa Antennas](https://meshtastic.org/docs/hardware/antennas/) - [Meshtastic — MQTT Integration](https://meshtastic.org/docs/software/integrations/mqtt/) - [Meshtastic — Telemetry Module](https://meshtastic.org/docs/configuration/module/telemetry/) - [Meshtastic — Module Configuration](https://meshtastic.org/docs/configuration/module/) - [Meshtastic — Region by Country](https://meshtastic.org/docs/configuration/region-by-country/) - [Meshtastic — Choosing The Right Device Role](https://meshtastic.org/blog/choosing-the-right-device-role/) - [Meshtastic — Demystifying ROUTER_LATE](https://meshtastic.org/blog/demystifying-router-late/) ### 외부 자료 - [Wikipedia — Meshtastic](https://en.wikipedia.org/wiki/Meshtastic) - [NodakMesh — MeshCore vs Meshtastic (2026)](https://nodakmesh.org/protocols) - [byteiota — Meshtastic Developer Guide to Off-Grid LoRa (2026)](https://byteiota.com/meshtastic-mesh-networking-developer-guide-to-off-grid-lora-2026/) - [smartnmagic — Meshtastic Hardware: The Complete Guide for 2026](https://smartnmagic.com/blogs/solutions/meshtastic-hardware-the-complete-guide) - [Seeed Studio — 6 Best Meshtastic Devices in 2026](https://www.seeedstudio.com/blog/2026/05/15/best-meshtastic-devices/) - [Meshtasticator Simulator](https://github.com/GUVWAF/Meshtasticator)