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++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、