C++中Secheduler和Events用法(12.27)

2024-04-16 19:32

本文主要是介绍C++中Secheduler和Events用法(12.27),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

继续学习下Secheduler和Events:
事件不能部分执行或者提前执行,event由firing time和handler function组成,从Event衍生的两种类型的对象,分别是:Packets和at events
(1)Scheduler::instance().schedule(&CallBack_handler, &callback_event, CALLBACK_DELAY)
CallBack_handler的原型是:UWALOHA_CallBackHandler,其handle方法:
void UWALOHA_CallBackHandler::handle(Event* e)
{
    mac_->CallbackProcess(e);
}
调用Uwalohamac的CallBackProcess函数,

void UWALOHA::CallbackProcess(Event* e)
{
    callback_->handle(e);
}

Handler* callback_;  // for the upper layer protocol,上层协议

(2)s.schedule(&status_handler,&status_event,txtime+0.01);
status_handler:UWALOHA_StatusHandler,主要包含is_ack布尔型参数,当超时时就会调用handler的handle函数,相当于一个定时的任务。

void UWALOHA_StatusHandler::handle(Event *e){
    mac_->StatusProcess(is_ack_);//UWALOHA_StatusHandler存储了is_ack的信息
}

uwaloha.cc的statusProcess函数如下:

void UWALOHA::StatusProcess(bool is_ack){
    UnderwaterSensorNode* n=(UnderwaterSensorNode*) node_;
    n->SetTransmissionStatus(IDLE);    //设置节点为空闲状态
    
    if( blocked ) {
        blocked = false;
        processPassive();
        return;
    }
    
    if( !ACKOn ) {
        /*Must be DATA*/
        UWALOHA_Status = PASSIVE;
        processPassive();
    }
    else if (ACKOn && !is_ack ) {
        UWALOHA_Status = WAIT_ACK;
    }
}

该函数貌似是为了更新状态所用的,但是会有一定的延迟。在sendPkt中,
if 节点 idle:
    if 包 数据包:
        mac对象进入Wait_ACK
        或 直接进入Passive状态
        status_handler.is_ack() = false;
    else ACK包
        发送ACK
        status_handler.is_ack() = true;
    难道说是记录上次发送包的类型?
    发送数据包后将mac对象状态修改为
    blocked = true;
    s.schedule(&status_handler,&status_event,txtime+0.01),传输时间后更新状态,调用StatusProcess函数

状态转移还不是很清楚,所以需要调试看看在statusProcess之前是什么状态,之后又是什么状态

今天把昨天没看的东西看完了,说白了一天真正工作地没多长时间,所以这个习惯要改阿。

接下来做什么呢?
(1)RSSI全称是“Received Signal Strength Indication”,是接收的信号强度指示,无线发送层的可选部分,用于判定链接质量,可以用于定位,以及是否增大广播发送强度,通常是通过硬件来测试的。
(2)窦志斌的论文用的是累计ACK机制,ACK携带接收段的RSSI值,从而预测下一个时隙的信道强度,如果要借鉴他的思想就要看在仿真层的RSSI模型是在怎么做的
(3)返回的ACK信息,携带信息包括:上一个时隙接收数据包的RSSI,节点剩余能量,


想想要实现的目标是什么:
(1)节省能量:如果信道不号,多次重传消耗能量
(2)为了获得更高的成功率,解决包冲突,因此采用ACK确认机制,为了保证成功率则需要进行重传,而重传是比较消耗能量的。重传的原因是因为节点移动或者干扰(节点移动比较麻烦,还是先考虑静态,干扰可以在底层做文章,但是直接的方法是“符合某种模型的丢包”,这种模型)。

张钢老师的思路,考虑下一跳节点的信道状态,这种方法的好处是同样还是保持着分布式算法的特性,张蕾老师的思路和张钢老师是一样的,在选路是不是依赖位置信息,而是依赖从我到下一跳节点的信息。(这就是下象棋的思路,既然有思路那就得按照这个思路往下走走看)
(1)建立一个合理的丢包模型(泊松模型),也可以是故意延迟回发包。
(2)记录等待到ACK包的时间,backoff的次数,下一条节点的能量信息。
如果是分布式的还有个问题,就是广播出去,在路由层的判断是:<1>我已经转发过这个包;<2>已经有人转发过这个包了;

既然要统计,肯定有个比较,比较的结果是会不会所有的人都不发了?
我隐约懂了,broadcast其实就是flooding,这就是造成了当两个节点对称时,无法接收到包的情况。那么就要规避这种情况,得设计一个能很好的区分的拓扑,其实就是个“移动节点的路由问题”,难道这个就要建立个树?

节点移动相当于丢包
如图所示:
1正常选择4(因为离目标节点更近),把包发给4,4发给5,而5迟迟未反馈给4 ACK,而因此当4再接收到1来的包时,返回给1的ACK将携带信息告知下一跳并不好,让其选择别的节点(这就意味着是有路由表的),或者自己不转发了,让别的节点转发(这个和自身发给5但是没有成功是一样的),那么节点2会转发节点(本来也会转发)

这个思路简单并且容易实现:
2、这么看来一旦迟迟接收不到任何节点的ACK的话,就增大传输功率,能使更多的节点接收到数据包。



这篇关于C++中Secheduler和Events用法(12.27)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/909694

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

2024/9/8 c++ smart

1.通过自己编写的class来实现unique_ptr指针的功能 #include <iostream> using namespace std; template<class T> class unique_ptr { public:         //无参构造函数         unique_ptr();         //有参构造函数         unique_ptr(