java - 其他节点未收到帧 [UNETSTACK]

标签 java networking groovy packet unetstack

我有两个节点。地址 40 正在向地址 10 传输一个帧。当我使用 TxFrameNtf 时,我得到传输成功。但是节点 10 正在丢弃它似乎来自 trace.nam 的框架。我不明白为什么。 以下是我为每个节点使用的代理: 节点 40:

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_Agent extends UnetAgent {

  private AgentID phy
  final static int cluster_protocol = Protocol.USER
  private AgentID node
  public int addr

  private final static PDU format = PDU.withFormat
    {
        uint8('source')
        uint16('data')
    }


  void startup() {
      phy = agentForService Services.PHYSICAL    //to communicate between two nodes
      subscribe topic(phy)
      def node = agentForService(Services.NODE_INFO)
      addr = node.Address
      phy[1].powerLevel = 0.dB;

      def datapacket = format.encode(source: addr, data: 51)

    if(addr==40)
      { 
        println "Sending data from source"
        phy << new TxFrameReq(to: Address.BROADCAST, protocol: cluster_protocol, data: datapacket)
      }
  }

  void processMessage(Message msg) {
}

节点 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

  void startup() {  
      phy = agentForService Services.PHYSICAL    //to communicate between two nodes
      subscribe topic(phy)
      def node = agentForService(Services.NODE_INFO)
      addr = node.Address
      phy[1].powerLevel = 0.dB
  }

  void processMessage(Message msg) {
    if (msg instanceof RxFrameNtf && msg.protocol == cluster_protocol )      //notfication recieved
      { 
        println "${msg.data} at node ${addr}"
      } 
 } 
}

我没有看到屏幕上显示已收到数据的消息,trace.nam 显示未检测到数据包。如您所见,我已将传输功率设置为无穷大。

我使用 DatagramReq 而不是 TxFrameReq,然后节点 10 接收数据。问题是因为语法使用不当吗?我对 UnetStack 和 groovy 很陌生,所以我可能错过了这些问题。提前谢谢你。

最佳答案

由于您没有发布模拟 DSL 脚本,我看不到模拟设置(节点 10 和 40 的位置、 channel 参数等)是什么。但是您的代理代码似乎没问题(除了节点 40 上的 processMessage() 不完整)。请注意,与您的描述相反,您是从节点 40 广播帧而不是将其发送到节点 10。此外,您的传输功率不是无穷大,而是调制解调器支持的最大值(最大值为 0 dB) .但我同意节点 10 应该像您期望的那样接收广播。

丢帧的原因有几个:

  • 节点 10 和 40 之间的范围大于为 channel 定义的检测/通信范围。
  • channel 的检测概率可能太低,或者错误概率太高。
  • 如果多个节点的传输在接收端发生重叠,则会发生冲突。

我建议尝试使用 ProtocolChannelModel,在模拟脚本中使用如下内容: ``` 导入 org.arl.unet.sim.channels.*

channel.model = ProtocolChannelModel
channel.communicationRange = 2000.m
channel.detectionRange = 2500.m
channel.interferenceRange = 3000.m
channel.pDetection = 1
channel.pDecoding = 1

``` 确保节点 10 和 40 之间的距离小于 communicationRange。请注意,detectionRangeinterferenceRange 应该大于 communicationRange

DatagramReq 映射到物理层的TxFrameReq,但会自动选择帧类型(DATACONTROL,取决于您使用的 UnetStack 版本)。通过设置 phy[1].powerLevel,您只是为 CONTROL channel 设置功率级别,因此您的 TxFrameReq 最好发送输入 CONTROL

如果您仍然无法使其正常工作,请张贴您的模拟脚本和 trace.nam 的摘录以帮助调试。

关于java - 其他节点未收到帧 [UNETSTACK],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49442806/

相关文章:

Java apache fop 2.2 某些西里尔字符的错误呈现

java - Eclipse:无法打开编辑器:没有 id org.eclipse.jdt.ui.CompilationUnitEditor 的编辑器描述符

java - 在字符串中查找字符的第二个索引?

HTTP header 怪异字段解释

c - 为什么特定的 UDP 消息总是被丢弃到低于特定的缓冲区大小?

java - 使用 GGTS 创建 Grails 项目时出错

java - 我需要安装 opencv 并在 Maven+IntelliJ(在 Windows 和 macOS/OSX 上)中通过 java 使用它。

c++ - Winsock ~ 创建一个 UDP 监听器(多个与 1 个套接字)

Grails 脚手架,为外键关联提供友好标签(而不是 ID 键)

java - 如何为 grails 编写 XLSX 自定义渲染器