You need to enable JavaScript to run this app. OMNeT++ INET下接收节点获取自定义PlantPacket的sensorValue及报错解决
优惠活动
大模型
产品
解决方案
定价
更多

OMNeT++ INET下接收节点获取自定义PlantPacket的sensorValue及报错解决

OMNeT++/INET 自定义UDP包接收字段提取异常解决方案

错误根因定位

两个核心实现错误触发了运行时崩溃和次生报错:

  • 接收端类型转换逻辑完全错误:发送端构造的结构是Packet作为最外层的包容器,PlantPacket是插入到Packet内部的共享Chunk负载,二者是容器与内容的层级关系,不存在可以直接强转的继承关系。当前代码里写的check_and_cast<PlantPacket*>(pk)是把外层Packet的指针直接强转成PlantPacket类型,内存结构完全不匹配,是所有报错的源头。
  • 你看到的Cannot convert between integer units是次生报错:错误的强转读取了乱掉的内存值,INET在做包长度、单位换算校验时,读到了无效的整数值,才会触发跨单位转换的异常提示,不是你实际参数的单位配置有问题。

正确实现步骤

发送端逻辑不需要调整,只需要修改接收端的负载提取逻辑,不要直接强转整个Packet,用INET提供的Packet标准API提取内嵌的PlantPacket负载即可。
错误的旧代码写法:

// 完全错误:不能把外层Packet指针直接强转成Chunk类型
PlantPacket* payload = check_and_cast<PlantPacket*>(pk);

替换为以下正确的接收处理逻辑:

void MyUdp::processPacket(Packet *pk)
{
    EV_INFO << "Received packet: " << UdpSocket::getReceivedPacketInfo(pk) << endl;
    // 从Packet尾部提取PlantPacket类型的负载,peek系列API不会修改包内容,适合只读场景
    const auto& payload = pk->peekAtBack<PlantPacket>(B(par("messageLength")));
    // 直接通过智能指针调用getter即可拿到传感器采集值
    EV_INFO << "Received sensor value: " << payload->getSensorValue() << endl;
    
    // 正常释放外层Packet即可,智能指针会自动管理Chunk内存
    delete pk;
}

注意事项

  • 自定义PlantPacket作为继承FieldsChunk的负载对象,所有读写操作必须通过Packet的标准API完成,不能直接操作Packet裸指针强转成Chunk类型。
  • peekAtBack返回的是带引用计数的Ptr<PlantPacket>智能指针,不需要手动调用delete释放,作用域结束会自动回收内存,手动delete会触发重复释放的运行时错误。
  • 如果后续需要修改收到的负载内容,不能使用peek系列API(返回的是const修饰的只读指针),需要替换为popAtBack取出可修改的负载对象,修改完成后再通过insertAtBack塞回Packet再做后续转发。
  • 发送端现有的makeShared<PlantPacket>()构造、设置Chunk长度、插入自定义Tag的逻辑完全符合INET的开发规范,不需要做任何调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 22:06:03