Files
trail-mate/docs/MESHCORE_PROTOCOL.md
T
2026-01-20 01:11:51 +08:00

6.7 KiB

MeshCore 通信协议介绍

📋 概述

MeshCore是一个轻量级的C++ LoRa Mesh网络协议库,专注于多跳包路由。与Meshtastic相比,MeshCore更注重简洁性可扩展性,适合嵌入式项目的定制开发。

🔧 协议架构

核心特性

  • 多跳路由: 支持Flood和Direct两种路由模式
  • 自定义二进制格式: 不使用Google Protocol Buffers
  • Ed25519加密: 完整的端到端安全支持
  • 轻量级设计: 适合资源受限的嵌入式设备

架构优势

  • 紧凑包结构: 最小化空中传输时间
  • 灵活路由策略: 支持多种路由算法
  • 强加密保证: 完整的节点身份验证
  • 易于扩展: 支持自定义负载类型

📦 数据包结构

包头格式 (1字节)

Bits:  7 6 5 4 3 2 1 0
       [版本:2][类型:4][路由:2]

字段说明:

  • 路由类型 (Bits 0-1): 决定包的路由方式
  • 负载类型 (Bits 2-5): 指定负载的数据类型
  • 版本号 (Bits 6-7): 协议版本控制

完整包结构

字段 大小 描述
header 1字节 路由类型 + 负载类型 + 版本
transport_codes 4字节* 传输层路由优化代码
path_len 1字节 路径字段长度
path 最多64字节 路由路径数据
payload 最多184字节 实际传输数据
  • 仅在特定路由类型时存在

🛣️ 路由类型

1. Flood路由 (ROUTE_TYPE_FLOOD = 0x01)

  • 动态路径构建: 在传输过程中建立路由路径
  • 网络发现: 自动探索网络拓扑
  • 适用场景: 网络初始化、广播消息

2. Direct路由 (ROUTE_TYPE_DIRECT = 0x02)

  • 预设路径: 使用指定的路由路径
  • 高效传输: 减少路由开销
  • 适用场景: 点对点通信、已知路径

3. Transport路由 (扩展模式)

  • Flood+Transport: 带传输编码的Flood路由
  • Direct+Transport: 带传输编码的Direct路由
  • 优化传输: 通过编码提高可靠性

📄 负载类型 (16种)

基础通信类型

名称 描述
0x00 PAYLOAD_TYPE_REQ 请求消息 (带哈希和MAC)
0x01 PAYLOAD_TYPE_RESPONSE 响应消息
0x02 PAYLOAD_TYPE_TXT_MSG 纯文本消息
0x03 PAYLOAD_TYPE_ACK 确认消息

高级功能类型

名称 描述
0x04 PAYLOAD_TYPE_ADVERT 节点广告
0x05 PAYLOAD_TYPE_GRP_TXT 组文本消息 (未验证)
0x06 PAYLOAD_TYPE_GRP_DATA 组数据报 (未验证)
0x08 PAYLOAD_TYPE_PATH 返回路径
0x09 PAYLOAD_TYPE_TRACE 路由跟踪

扩展类型

名称 描述
0x0A PAYLOAD_TYPE_MULTIPART 多段包
0x0B PAYLOAD_TYPE_CONTROL 控制包
0x0F PAYLOAD_TYPE_RAW_CUSTOM 自定义包

🔐 安全机制

加密架构

  • Ed25519公钥: 32字节公钥用于节点身份
  • 消息认证: 2字节MAC保证数据完整性
  • 端到端加密: 支持敏感数据加密传输
  • 节点指纹: 1字节公钥哈希用于路由决策

密钥管理

  • 节点公钥: 首次通信时交换
  • 会话密钥: 基于节点公钥派生
  • 密钥缓存: 本地存储已知节点的公钥

💬 通信流程

1. 节点发现 (Advertising)

// 节点广告包结构
struct NodeAdvert {
    uint8_t public_key[32];    // Ed25519公钥
    uint32_t timestamp;        // 发送时间戳
    uint8_t signature[64];     // 数字签名
    uint8_t appdata[];         // 可选应用数据
};

2. 文本消息通信

// 文本消息负载结构
struct TextMessage {
    uint32_t timestamp;        // 发送时间戳
    uint8_t flags;            // 消息标志
    uint8_t text[];           // UTF-8编码的文本
};

3. 路由跟踪 (Trace)

  • 收集SNR: 每个跳收集信号质量数据
  • 路径记录: 记录完整的路由路径
  • 诊断信息: 提供网络状态分析

🆚 与Meshtastic对比

特性 MeshCore Meshtastic
数据格式 自定义二进制 Google Protocol Buffers
包大小 更紧凑 相对较大
扩展性 高 (自定义) 中等 (proto定义)
解析速度 中等
跨平台性 C++专用 多语言支持

🛠️ 协议实现要点

包编解码

// 包序列化
uint8_t Packet::writeTo(uint8_t dest[]) const {
    uint8_t i = 0;
    dest[i++] = header;
    if (hasTransportCodes()) {
        memcpy(&dest[i], &transport_codes[0], 2); i += 2;
        memcpy(&dest[i], &transport_codes[1], 2); i += 2;
    }
    dest[i++] = path_len;
    memcpy(&dest[i], path, path_len); i += path_len;
    memcpy(&dest[i], payload, payload_len); i += payload_len;
    return i;
}

// 包反序列化
bool Packet::readFrom(const uint8_t src[], uint8_t len) {
    // 实现包解析逻辑
}

路由决策

  • Flood模式: 广播到所有邻居节点
  • Direct模式: 根据路径字段直接转发
  • Transport模式: 使用编码优化传输

去重机制

  • 包哈希: SHA256哈希用于包唯一标识
  • 时间窗口: 基于时间戳的去重检查
  • 节点过滤: 避免向源节点回传

🎯 使用场景

1. 离线通信网络

  • 应急通信: 灾难情况下保持连接
  • 户外活动: 徒步、露营团队通信
  • 战术应用: 军事和安全场景

2. 传感器网络

  • 环境监测: 远程传感器数据收集
  • 工业物联网: 设备状态监控
  • 农业应用: 田间设备通信

3. 自定义Mesh应用

  • 专用协议: 特定应用场景优化
  • 轻量级实现: 资源受限设备
  • 灵活扩展: 支持自定义负载类型

📊 性能特点

网络指标

  • 最大跳数: 可配置,通常3-5跳
  • 包大小: 最小20字节,最大256字节
  • 传输延迟: 取决于跳数和传播时间

可靠性特性

  • 自动重试: 失败包自动重传
  • 路径优化: 动态选择最佳路由
  • 拥塞控制: 避免网络过载

🔄 协议扩展

自定义负载类型

MeshCore支持扩展到16种以上的负载类型,开发者可以:

  1. 定义新的负载格式
  2. 实现对应的编解码逻辑
  3. 添加处理函数

路由算法扩展

  • 自定义路由策略: 实现新的路由算法
  • QoS支持: 服务质量保证
  • 多路径路由: 并行传输优化

📚 参考资源

  • 协议规范: docs/packet_structure.md
  • 负载格式: docs/payloads.md
  • 示例代码: examples/ 目录
  • API文档: include/MeshCore.h

这个协议设计非常适合需要定制LoRa Mesh网络的嵌入式项目,既保持了简洁性又提供了强大的功能扩展能力。