2

我有两个节点。地址 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 很陌生,所以我可能错过了这些问题。先感谢您。

4

1 回答 1

1

由于您尚未发布模拟 DSL 脚本,因此我看不到模拟设置(节点 10 和 40 的位置、通道参数等)是什么。但是您的代理代码似乎还可以(除了processMessage()节点 40 上的不完整)。请注意,与您的描述相反,您正在从节点 40 广播一个帧,而不是将其发送到节点 10。此外,您的传输功率不是无穷大,而是调制解调器支持的最大值(最大值为 0 dB) . 但我同意节点 10 应该接收广播,如您所料。

丢帧的原因有几个:

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

我建议尝试ProtocolChannelModel在模拟脚本中使用类似的东西:``` import 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. 请注意detectionRangeandinterferenceRange应该大于communicationRange.

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

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

于 2018-05-26T06:46:17.160 回答