You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UNETSTACK环境下节点间帧未接收问题排查求助

我来帮你排查这个丢帧的问题,先梳理下你的情况和可能的原因:

问题梳理
  • 节点40发送广播帧(to: Address.BROADCAST),收到TxFrameNtf确认发送成功
  • 节点10的trace.nam显示丢弃了该帧,实际未收到数据
可能的原因及排查步骤

1. 节点10未订阅物理层消息或未处理接收通知

从你贴的节点10代码来看,startup()方法只写了一半,大概率是没完成物理层订阅和接收消息处理的逻辑。节点40里做了subscribe topic(phy)来监听物理层的消息,但节点10如果没做这一步,根本收不到物理层的RxFrameNtf(接收帧通知),自然不会处理收到的帧,在trace.nam里就会显示为“丢弃”。

修复建议:补全节点10的startup()和processMessage()逻辑:

void startup() {
  phy = agentForService(Services.PHYSICAL)
  // 必须订阅物理层主题,才能接收帧通知
  subscribe topic(phy)
  node = agentForService(Services.NODE_INFO)
  addr = node.Address
}

void processMessage(Message msg) {
  // 处理物理层的接收帧通知
  if (msg instanceof RxFrameNtf) {
    // 先检查协议号是否匹配你定义的cluster_protocol
    if (msg.protocol == cluster_protocol) {
      println "Node ${addr} 收到来自 ${msg.from} 的帧"
      // 要解析数据的话,必须和节点40用完全一致的PDU格式
      def format = PDU.withFormat {
        uint8('source')
        uint16('data')
      }
      def parsedData = format.decode(msg.data)
      println "解析到数据:source=${parsedData.source}, data=${parsedData.data}"
    }
  }
}

2. 协议号不匹配

节点40和节点10都定义了cluster_protocol = Protocol.USER,但要确保两者的常量值完全一致(比如不要一个用Protocol.USER,一个手动写数值)。如果协议号不匹配,即使节点10收到了帧,也会因为协议不匹配而忽略,看起来就像丢帧。

3. 物理层配置不一致

节点40设置了phy[1].powerLevel = 0.dB,但节点10的物理层可能存在配置问题:

  • 比如节点10的物理层信道1是否处于接收状态?
  • 灵敏度设置是否过低,导致无法接收节点40的信号?

可以在节点10的startup()里打印物理层状态排查:

println "Node ${addr} 物理层信道1状态:${phy[1].state}"
println "Node ${addr} 物理层信道1灵敏度:${phy[1].sensitivity}"

4. trace.nam的“丢弃”可能是视觉误解

有时候trace.nam里的“丢弃”标记,只是因为节点没有处理该帧(比如没订阅、协议不匹配),而非物理层真的没收到。最准确的方式是在节点10的processMessage()里打印日志,确认是否收到了RxFrameNtf。

完整节点10代码示例
import org.arl.fjage.Message
import org.arl.unet.*
import org.arl.fjage.*
import org.arl.unet.PDU
import java.util.*
import org.arl.unet.phy.*
import static org.arl.unet.utils.MathUtils.*

class VBF_hop extends UnetAgent {
  private AgentID phy
  final static int cluster_protocol = Protocol.USER
  private AgentID node
  public int addr
  // 和节点40完全一致的PDU格式定义
  private final static PDU format = PDU.withFormat {
    uint8('source')
    uint16('data')
  }

  void startup() {
    phy = agentForService(Services.PHYSICAL)
    // 订阅物理层主题,接收帧通知
    subscribe topic(phy)
    node = agentForService(Services.NODE_INFO)
    addr = node.Address
    // 打印物理层配置,排查问题
    println "Node ${addr} 初始化完成,物理层信道1功率:${phy[1].powerLevel},灵敏度:${phy[1].sensitivity}"
  }

  void processMessage(Message msg) {
    if (msg instanceof RxFrameNtf) {
      println "Node ${addr} 收到帧通知:来自节点${msg.from},协议号${msg.protocol}"
      // 匹配协议号后处理数据
      if (msg.protocol == cluster_protocol) {
        def receivedData = format.decode(msg.data)
        println "成功解析数据:源节点${receivedData.source},数据值${receivedData.data}"
      } else {
        println "帧协议号${msg.protocol}与集群协议${cluster_protocol}不匹配,忽略该帧"
      }
    }
  }
}

内容的提问来源于stack exchange,提问作者Akriti Anand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:44:28