gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:18:08 24 4
gpt4 key购买 nike

我有两个节点。地址 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com