CN101841839B - 一种无线传感器网络仿真系统 - Google Patents
一种无线传感器网络仿真系统 Download PDFInfo
- Publication number
- CN101841839B CN101841839B CN2010101008303A CN201010100830A CN101841839B CN 101841839 B CN101841839 B CN 101841839B CN 2010101008303 A CN2010101008303 A CN 2010101008303A CN 201010100830 A CN201010100830 A CN 201010100830A CN 101841839 B CN101841839 B CN 101841839B
- Authority
- CN
- China
- Prior art keywords
- module
- packet
- unit
- data
- node
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D30/00—Reducing energy consumption in communication networks
- Y02D30/70—Reducing energy consumption in communication networks in wireless communication networks
Landscapes
- Mobile Radio Communication Systems (AREA)
Abstract
本发明公开了一种无线传感器网络仿真系统,仿真系统包括用户界面、底层模块库、节点构件库、仿真环境场景库、运行对象库、参数配置库、节点组成关系库、业务数据库、包信息库、包头信息库、模块注册单元、模块选择单元、模块组装单元、参数设置单元、拓扑数据生成单元、业务调度单元、显示单元和结果统计单元。本发明针对WSN以数据为中心、面向应用的特点,仿真WSN环境下通信协议及各种基于WSN的应用,另外根据需要可以对仿真系统进行模块化扩展。由于具有能量模型,在进行WSN仿真测试时,本发明可同步地统计各个传感器节点的能耗,客观实际地为研究方案提供参考性的技术指标。
Description
技术领域
本发明属于无线传感器网络(WSN,Wireless Sensor Networks)仿真技术领域,具体涉及一种针对WSN环境下的通信协议及各种基于传感器网络的应用进行仿真的仿真系统。
背景技术
目前,存在几种通用的可用于WSN的网络仿真系统,如NS-2(network simulator-2)、OPNET、TOSSIM(TinyOS simulator)等,已成为WSN研究的主流仿真系统,但是这些主流的通用仿真系统在对WSN的仿真时都存在不同程度的缺陷:
(1)NS-2是用于网络研究的离散事件仿真工具,可以对有线、无线、本地连接、卫星连接等复杂网络环境进行仿真。NS-2可以对TCP协议、路由算法、多播协议等多种网络协议进行仿真。NS-2主要致力于OSI模型的仿真,包括物理层的行为的定义。由于NS-2是对数据包级进行非常详细的仿真,接近于运行时的数据包数量,使得其无法进行大规模网络的仿真,并且由于其采用tclcl语言进行开发,造成仿真难度加大,其交互界面也不够人性化。
(2)OPNET是通信网络仿真系统,采用网络、节点和过程三层模型实现对网络行为的仿真。其无线模型是采用流水线的体系结构来确定节点(无线传感器节点、PC节点等可以组成网络的组件)间的连接和传播,用户可指定频率、带宽、功率以及包括天线增益模式和地形模式在内的其他特征。OPNET更注重于网络服务质量的性能评价,而要实现WSN的仿真,还缺少能量模型,无法对能耗进行评价。
(3)TOSSIM是用于对采用TinyOS的Motes(智能微尘)进行bit(位)级仿真的工具。TOSSIM将TinyOS环境下的nesC代码直接编译为可在PC环境下运行的可执行文件,提供了可在真实的Mote节点上对网络程序进行测试的一个系统。TOSSIM的缺点是没有能量模型,无法对能耗进行评价。
总的来说,现有可用于WSN仿真的通用仿真系统主要具有以下几类缺陷:
(1)WSN是以数据为中心,面向应用的一种网络,而通用的网络仿真系统则是以传输为中心,注重数据通信协议和算法,不关心所传输的数据。
(2)WSN具有面向应用的特点,使其协议层的设计与通用网络仿真系统的标准协议有所区别。因此要在通用网络仿真系统上实现WSN的仿真,必然会产生大量的协议添加工作和跨层协议的修改,增加了仿真的难度和工作量。
(3)部分仿真系统没有对无线传感器节点的能耗进行评估,而能耗恰恰是WSN研究中一个非常关键的性能指标。
(4)大部分通用仿真系统只针对底层协议的描述和仿真,无法实现抽象应用层的算法仿真。
发明内容
本发明的目的在于提供一种基于模块化和层次化结构的无线传感器网络仿真系统,该仿真系统以数据为中心,面向应用,具有能量模型,能够对异构网络进行仿真。
本发明提供的一种无线传感器网络仿真系统,其特征在于:该无线传感器网络仿真系统包括用户界面、底层模块库、节点构件库、仿真环境场景库、运行对象库、参数配置库、节点组成关系库、业务数据库、包信息库、包头信息库、模块注册单元、模块选择单元、模块组装单元、参数设置单元、拓扑数据生成单元、业务调度单元、显示单元和结果统计单元;
用户界面是用户操作使用该无线传感器网络仿真系统的一个可视化界面;
底层模块库用于保存用户为了完成仿真所需的功能而注册的模块,其中包括保存模块名、模块对应的类文件即代码、模块对应的数据包包头以及三者之间的对应关系;
节点构件库用于保存由用户从底层模块库中选出的用于组装传感器节点内部结构的所有模块,即节点构件模块,保存内容包括模块名和对应模块的功能描述信息;所述传感器节点内部结构是指由模块和模块之间的数据流向和上下层关系构成的结构,所述节点构件模块包括应用模块、传输模块、路由模块、链路模块、队列模块、媒体访问控制模块、物理模块和信道模块;
仿真环境场景库用于保存由用户从底层模块库中选出的用于仿真过程中对各种仿真场景进行仿真的模块,即仿真环境模块,保存内容包括模块名和对应模块的功能描述信息;所述仿真环境模块包括随机数产生模块、网络拓扑结构生成模块、队列调度模块和结果分析模块;
运行对象库用于保存由拓扑数据生成单元生成在仿真过程中实际运行的各个模块类对应的对象引用;
参数配置库用于保存节点构件库和仿真环境场景库中的所有模块的参数以及无线传感器网络仿真系统的全局参数;
节点组成关系库用于保存传感器节点内部结构,即模块组装单元对节点构件库中所有模块进行组装之后的输出;
业务数据库用于保存在仿真过程中生成的所有业务数据,包括记录仿真过程产生的每个数据包的发送源地址、目的地址、数据包类型,处理该数据包使用的传输协议、传感器节点处理这个数据包的能量损耗;
包信息库用于在包头注册之后保存其包头名和编号;
包头信息库用于在包头注册之后保存其包头地址偏移量域值;
模块注册单元用于完成模块注册功能和对应模块的包头注册功能;模块注册功能是指:模块注册单元通过用户界面接收用户提交的模块名、模块对应代码和模块描述,根据模块名到底层模块库中查找是否存在具有相同名称的模块,如果已存在具有相同名称的模块则返回一个错误提示到用户界面,如果没有则修改仿真系统中的静态类文件,然后仿真系统对模块对应类文件和静态类文件进行动态编译,模块注册单元将模块名、对应类文件名信息保存在底层模块库中;包头注册功能是指模块注册单元在获得来自用户界面的包头名和对应的模块名后,首先根据模块名到底层模块库中查找对应模块代码文件,然后读取其中模块需要保存数据的内存大小,同时在底层模块库中对应模块项中加入从用户界面获得的包头名,然后模块注册单元会为这个包头分配一个唯一的编号,在包信息库中保存该包头名和编号,最后模块注册单元根据上面得到的模块需要的内存大小在包头信息库中保存对应包头地址偏移量域值;如果要注册的包头对应的模块不存在,则模块注册单元通过用户界面返回一个错误提示;
模块选择单元根据用户在用户界面上的选择,在底层模块库中选择属于组成传感器节点内部结构的节点构件模块保存在节点构件库中,选择属于构建仿真场景的仿真环境模块保存在仿真环境场景库中,模块选择单元将选择模块的模块名和该模块的功能描述信息输出到节点构件库和仿真环境场景库;
模块组装单元用于将节点构件库中保存的所有模块输出到用户界面上,用户通过用户界面按照需求对已列出来的模块进行组装,模块组装单元通过用户界面获得用户组装的结果,将组装后的结果保存在节点组成关系库中;
参数设置单元用于完成用户对所有保存在节点构件库和仿真环境场景库中的模块的参数进行添加、删除和修改操作,并根据用户的操作修改参数配置库对应的内容;
拓扑数据生成单元读取参数配置库中的全局数据,并将全局数据传递给显示单元;拓扑数据生成单元从节点组成关系库中读取传感器节点内部结构,根据得到的模块名和自定义的模块对象生成方法,为每一个参与组装的模块都生成一个对应的对象,以数组的形式保存到运行对象库中;拓扑数据生成单元还从节点组成关系库中得到每个模块的类型,再根据节点组成关系库保存的模块的属性完成一个传感器节点中各模块对象的数据指向关系,完成一个传感器节点组装,并对传感器节点的坐标进行初始化;拓扑数据生成单元还要根据仿真环境场景库中保存的模块信息生成仿真环境模块对应的模块对象,再根据参数配置库中保存的模块参数对生成的模块对象进行配置,并将配置完的模块对象的对象引用保存在运行对象库中;
业务调度单元读取运行对象库中的数据,在获得所有传感器节点和传感器节点内模块的引用后,业务调度单元按照各模块的上下层关系通过统一接口依次调用传感器节点内的所有模块对象的函数,各模块对传入自身的数据包进行封装,同时加入自己的数据;业务调度单元在其缓冲区变满时,将缓存数据保存于仿真业务数据库中;
显示单元首先接收用户在用户界面上的选择,如果用户选择查看传感器节点内部结构则显示单元读取节点结构关系库中的数据,按照数据绘制图表显示到用户界面;如果用户选择查看仿真过程,则显示单元根据从拓扑数据生成单元传递过来的全局数据配置用户界面,同时监听业务数据库,将其中的数据以动画方式显示到用户界面;
结果统计单元首先从运行对象库中查找用于统计分析的模块对应的对象引用,从业务数据库中读取业务数据,将读取的业务数据传送给在运行对象库查找到的对象引用,调用相应函数进行处理,并将处理结果以图表的形式显示在用户界面上。
本发明主要针对WSN以数据为中心、面向应用的特点,设计实现一个可以仿真WSN环境下通信协议及各种基于WSN的应用的仿真系统,该仿真系统还可以支持对无线传感器节点内部结构不同设计的仿真。是一个较通用的WSN仿真系统。具体而言,本发明具有以下特点:
(1)针对WSN以数据为中心,面向应用的特殊网络环境开发,可满足WSN下各种仿真应用的需求。
(2)在仿真过程中屏蔽了不同传感器节点硬件性能不同的特性,用户只需要具有WSN基本的理论知识即可完成开发工作。
(3)仿真系统基于离散事件驱动和面向对象技术,采用模块化和层次化的体系结构,核心使用C++设计和实现。
(4)仿真系统可以实现底层的协议仿真,也可以实现上层不同应用的仿真。
(5)仿真系统中的传感器节点采用流水线的体系结构组装,传感器节点协议栈的模块可以任意替换为其他模块或扩展新的模块,也可以修改上下层次关系,同时还可以修改数据包的结构。
(6)用户可以方便地修改传感器节点模块的各个属性,包括设置发射频率、带宽、功率以及天线增益模式等属性。
(7)仿真系统具有能量模型,在进行无线传感器网络仿真测试时,同步地统计各个传感器节点的能耗,客观实际地为研究方案提供参考性的技术指标。
(8)仿真系统采用可视化界面,具有良好的人机交互特性,充分满足不同科研人员的研究需求。
附图说明
图1是无线传感器网络仿真系统的结构示意图。
图2是基类关系图。
图3是无线传感器节点内部结构图。
图4是对象生成方法流程图。
图5是命令解析单元算法流程图。
图6是业务调度单元结构图。
图7是无线传感器节点显示模块坐标设置图。
图8是无线传感器节点显示模块算法流程图。
具体实施方式
为了使本发明的目的、技术方案和优点更清楚,下面将结合附图对本发明的实施方式做进一步地详细叙述。
本发明在设计上采用了模块化的设计思想,将仿真系统所需的功能分别设计实现为不同的类,一个或多个类构成一个特定的模块,然后以模块为单位将代码注册到仿真系统中,再配置组成传感器节点内部结构的各模块之间的数据流向和上下层关系以及构建仿真环境的各模块的属性,这些模块和模块之间的数据流向和上下层关系就构成了传感器节点内部结构,而配置的构建仿真场景的各模块的属性形成了特定应用所需的仿真环境。仿真系统在进行仿真时将各模块实例化为对象,将上述配置的模块关系映射为相应对象的关系,完成相应数据传输,并按照所配置的模块属性设置相应对象的参数构建仿真场景,最终调用对象中的函数,实现对特定应用的仿真。用户在使用本仿真系统进行应用仿真的时候,可以使用本仿真系统默认已实现的模块进行仿真工作,也可以根据自己的需要设计实现具有其它特定功能的模块按照本发明的方法注册进仿真系统,与本仿真系统的其他模块结合进行仿真工作。
仿真系统使用的是面向对象的设计方法,所以用户向仿真系统注册的代码也是以类为单位,用户编写的类必须继承自仿真系统事先定义好的一些基类,并且一一实现基类中的虚函数,这样仿真系统才能够通过基类的虚函数作为统一接口并动态绑定调用派生类的函数(即用户实现的功能)。仿真系统已定义的一些重要的基类有:对象基类(BaseObject)、句柄类(Handler)、传感器对象类(WsnObject)、双向连通器(BaseConnector)、单向连通器(Connector)、实体注册类(Regist_Class)和应用对象类(Application)。
这些类之间的关系如图2所示。
对象基类(BaseObject)是大部分注册到仿真系统中的模块的基类。它包含三个变量,一个是模块名称(name),该变量为string类型,另一个变量是哈希表(objectTable),它是一个静态变量,该静态变量用来保存仿真系统中所有已实例化的模块对象的引用,第三个变量是整型变量ID,用于保存对象的唯一编号。对象基类(BaseObject)还包含一个作为统一接口的虚函数即命令串处理函数(command()),返回值标志命令执行是否正确,类型为整型,两个参数分别是整型和指向命令串的常指针变量,派生类需要实现该函数来处理仿真系统的命令串。对象基类(BaseObject)的另一个重要函数是对象查询函数lookUp(name),该函数的作用是通过对象名称name找到在哈希表objectTable中存储的对象指针,其中参数name为string类型,返回值为指向对象基类(BaseObject)对象的指针。
句柄类(Handler)只有一个虚函数即事件处理函数(handle()),该函数没有返回值,其参数为一个事件类(Event)类型的指针,代表等待处理的事件。仿真系统就是通过句柄类的这个虚函数和动态绑定来调用派生类实现的事件处理函数(handle())从而达到处理各种事件的目的。其中的事件类(Event)是本仿真系统已经实现的一个类,具有以下五个成员变量:指向下一个事件的指针next_(事件类类型指针)、指向前一个事件的指针pre_(事件类类型指针)、处理本事件的函数句柄handler(句柄类类型指针)、记录事件的处理时间time_(浮点数类型)和记录事件的调度编号uid_(整型)。另外事件类(Event)包含一个无参构造函数(Event()),用于初始化成员变量。
传感器对象类(WsnObject)继承自对象基类(BaseObject)和句柄类(Handler)。传感器对象类没有成员变量,包含一个重要的虚函数是接收函数(recv()),接收函数(recv())的没有返回值,参数包含一个数据包引用和一个句柄引用,其中数据包引用代表接收到并且等待处理的数据包,句柄引用代表对数据包进行处理的句柄类(Handler)的一个派生类对象。该虚函数为通用接口,派生类实现这个函数以完成对数据包的接收和处理,从而实现动态绑定,即在调用时确定实际需要调用哪层的对象进行数据包处理。
双向连通器(BaseConnector)、单向连通器(Connector)均继承自传感器对象类(WsnObject)。其中:
双向连通器(BaseConnector)是数据包的传递处理通道,包含三个重要的成员变量:上层模块指针(uptarget_)、下层模块指针(downtarget_)和丢弃模块指针(drop_),三者均为传感器对象类(WsnObject)指针类型。前两个指针分别用于指向本层的上层模块和下层模块对应的对象,而丢弃模块指针(drop_)用于指向处理被本层丢弃的数据包的对象。该类还包含一个实现接收功能的接收函数(recv(),从传感器对象类(WsnObject)中继承过来),在接收函数(recv())内部需要对数据包的方向进行判断,当为向上(UP)时,则调用上层模块指针指向的对象接收本层处理过的数据包,否则调用下层模块指针指向的对象接收数据包,默认情况下数据包向下传递(本仿真系统默认实现的传感器节点内部结构为分层结构,即两模块之间为上下层次关系,从上到下各层依次相连构成传感器节点内部结构)。双向连通器(BaseConnector)的另外三个函数为:uptarget()、downtarget()和drop()。其中函数uptarget()用于返回指向连通器上层对象的指针,没有参数。函数downtarget()用于返回指向连通器下层对象的指针,也没有参数。函数drop()处理需要丢弃的数据包,当丢弃模块指针(drop_)不为空时,调用丢弃模块指针(drop_)指向的对象处理数据包,当丢弃模块指针(drop_)为空时,直接释放数据包。函数drop()没有参数和返回值。
单向连通器(Connector)同样是数据包的传递处理通道,主要是将数据包处理以后向下传递。单向连通器(Connector)包含两个重要的成员变量:模块指针(target_)和丢弃模块指针(drop_),两者均为传感器对象类(WsnObject)指针类型,其中模块指针(target_)指向接收本模块输出数据的目标模块的对象,丢弃模块指针(drop_)指向处理被本层丢弃的数据包的对象。与双向连通器类相似,该类也包含一个实现接收功能的接收函数(recv(),从传感器对象类(WsnObject)中继承过来),但是由于是单向连通器,故在接收函数(recv())内部直接调用模块指针指向的对象接收本层处理过的数据包。单向连通器(Connector)还包含函数target()和函数drop(),其中函数target()返回模块指针(target_),没有参数。而函数drop()处理需要丢弃的数据包,当丢弃模块指针(drop_)不为空时,调用丢弃模块指针(drop_)指向的对象处理数据包,当丢弃模块指针(drop_)为空时,直接释放数据包。函数drop()没有参数和返回值。
实体注册类(Regist_Class)包含两个成员函数:注册函数(Register_Class(className))和创建函数(create())。其中注册函数(Register_Class(className))用于实现对新的模块的注册功能,没有返回值,有一个string类型的参数,该参数即为被注册的模块的类名。创建函数(create(className))是一个虚函数,没有返回值,其string类型的参数className为被注册的模块的类名,该函数的功能是:在模块注册以后完成对应类的对象的生成,该函数由实体注册类(Regist_Class)的派生类实现。
应用对象类(Application)是所有实现应用层功能的模块都需要继承的基类,包含一个重要的属性:端口号port(在1~256之间的整型值,不重复即可),类似于互联网,端口号用来识别每一个应用程序。不同的端口号代表不同的应用数据包,接收数据包的传感器节点根据不同的端口号调用不同的应用程序接收函数进行接收处理。
用户实现的类如果是用来组装一个节点的协议结构就要继承自双向连通器(BaseConnector)或者单向连通器(Connector),如果是用来实现特定应用功能(也参与节点组装)的就要继承自应用对象类(Application),如果是用来搭建仿真场景的就要继承自对象实体类(BaseObject)和句柄类(Handler)。
本发明提供的仿真系统包括以下十八个部分(如图1所示):用户界面、底层模块库101、节点构件库102、仿真环境场景库103、运行对象库104、参数配置库105、节点组成关系库106、业务数据库107、包信息库108、包头信息库109、模块注册单元2、模块选择单元3、模块组装单元4、参数设置单元5、拓扑数据生成单元6、业务调度单元7、显示单元8和结果统计单元9(由于本仿真系统中存在模块库的概念,因此为了避免引起混淆,本发明的系统框架图中最小元素以单元划分)。
用户界面是用户操作使用该仿真系统的一个可视化界面,用户在用户界面可以通过模块注册单元2向仿真系统注册新的模块、通过模块选择单元3指示仿真系统进行模块选择并分类到不同的库中(节点构件库102和仿真环境场景库103中)、通过参数设置单元5对仿真系统的各个参数进行设置和修改操作、通过显示单元8要求仿真系统显示传感器节点内部结构或者仿真结果、通过模块组装单元4要求仿真系统将节点构件模块组装成具体的传感器节点内部结构,也可以通过结果统计单元9让仿真系统将结果统计显示出来以便进行仿真性能的分析。
底层模块库101用于保存用户为了完成仿真所需的功能而注册的模块,其中包括保存模块名、模块对应的类文件(即代码)、模块对应的数据包包头以及三者之间的对应关系。仿真系统在进行仿真的时候根据模块名在底层模块库101中进行查询,就能得到对应的类文件和对应的数据包包头。底层模块库101中存放的模块按功能可分为两类:节点构件模块和仿真环境模块。其中:
(1)节点构件模块用来组成仿真系统的传感器节点内部结构,主要包括应用模块、传输模块、路由模块、链路模块、队列模块、媒体访问控制模块、物理模块和信道模块。
(1.1)应用模块定义传感器节点需要完成的功能,如节点自定位、目标追踪、数据融合等,并定义对应的数据包格式。由用户根据不同仿真的应用需求进行设计实现,注册保存于底层模块库101中。本仿真系统默认的应用模块已经实现节点自定位模块,用户只需要将此模块注册到底层模块库101即可进行无线传感器网络节点自定位仿真。
(1.2)传输模块主要为网络传输协议,一般此类协议包括TCP/IP(传输控制协议)以及UDP(用户数据报协议)等,本仿真系统实现的传输模块为UDP协议模块,该模块实现了UDP传输协议。
(1.3)路由模块确定数据包发送的目的地址,并保存必要的路由信息。一般WSN下的路由算法比较成熟且种类较多,本仿真系统实现的路由模块为AODV协议模块,该模块实现了AODV路由算法。
(1.4)链路模块完成数据包分组的收发,本仿真系统的链路模块实现了通用链路传输功能。
(1.5)队列模块实现排队策略以调度数据包进行有序地发送。队列算法较多,主要有先进先出队列、先进后出队列以及优先级队列等,本仿真系统的队列模块实现了先进先出队列功能。
(1.6)媒体访问控制(MAC)模块用来实现数据包的装帧和发送、实现虚拟载波监听以及数据包发送接收控制等。现在通用的WSN下MAC协议较多,本仿真系统使用了802.11媒体访问控制模块,实现了802.11协议。
(1.7)物理模块作为无线共享介质接口,对现实环境中传感器节点的一些硬件以及实际场景进行仿真,本仿真系统使用无线物理模块,在该模块中采用了天线模型、传播模型、出错模型。
(1.7.1)天线模型:返回天线的接收以及发送增益。其中天线增益是指:在输入功率相等的条件下,实际天线与理想的辐射单元在空间同一点处所产生的信号的功率密度之比,它定量地描述一个天线把输入功率集中辐射的程度。本仿真系统中考虑的是全向天线,故返回增益为1.0。
(1.7.2)传播模型:传播模型主要用来预知每个数据包的接收信号功率,每个传感器节点的物理层都有一个预先设置的阈值,如果一个数据包的接收信号功率低于此接收阈值,则该数据包不能被正常接收,而被丢弃,否则将被MAC接收向上层传递。现有的传播模型有三类:自由空间模型(Free Space)、双径地面反射模型(Two-ray groundreflection)和阴影模型(shadowing)。本仿真系统中采用的是自由空间模型。
其中:Pr(d)为接收信号功率,Pt为发射信号功率,Gt为发送端天线增益,Gr为接收端天线增益,λ为波长,L(L≥1)为系统损耗,d为接发双方的距离。
在自由空间模型中,通信范围为以发射方为圆心的一个圆,接收方在此圆中则可正常接收到数据包,否则丢弃所有接收到的数据包。
(1.7.3)错误模型:以一定的概率在数据包包头中标记接收的数据包为错误包,对现实应用中数据包在发送、接收过程出错的场景进行仿真。
(1.8)信道模块对数据包在发送过程中的信道延迟进行仿真,用来计算数据包的发送延迟,本仿真系统使用了一种通用的无线信道模块。
(2)仿真环境模块用于构建仿真场景,仿真系统已实现的一些通用仿真环境模块包括:随机数产生模块、网络拓扑结构生成模块、队列调度模块和结果分析模块。
(2.1)随机数产生模块产生随机数序列。随机数产生模块在仿真系统中是必须的,虽然这里以模块的方式注册到仿真系统中,但仿真系统其他功能的实现会基于随机数产生模块,后面将此模块作为仿真系统的一部分进行介绍。本仿真系统实现的随机数产生模块为业务调度单元7中的随机数产生单元74,使用的是线性同余算法。
(2.2)网络拓扑结构生成模块根据用户设置的网络拓扑属性的参数布置传感器节点,形成对应的网络拓扑结构,在此种结构下进行仿真。
(2.3)队列调度模块用于仿真系统中的事件调度,由于本仿真系统是基于事件触发的仿真系统,等待处理的事件按照某种原则形成一个队列,由队列调度模块依次处理。本仿真系统中的事件按照先进先出的原则形成队列,队列调度模块实现为业务调度单元7的离散事件调度单元71。
(2.4)结果分析模块用于对仿真结果进行统计分析,以图表(如在二维坐标系显示定位成功率和锚节点比例的关系)的形式反馈给用户。本仿真系统默认实现为结果统计单元9,其中实现了节点自定位统计分析模块,该模块实现对节点自定位仿真的结果数据的分析,在二维坐标系中显示定位成功率和锚节点比例的关系。
上述模块都是在实现仿真系统时为方便用户进行仿真而事先已实现的通用模块,通用模块在使用本仿真系统进行仿真的大多数应用仿真中都会用到。对于无线传感器网络的其他特定应用的仿真,用户可以另行设计传感器节点内部结构,并设计实现对应功能的模块,可以替换全部或部分本仿真系统已实现的模块,然后通过模块注册单元2注册到底层模块库101中,再经模块选择单元3选择并保存于节点构件库102或者仿真环境场景库103中,然后按照本说明的方法组建传感器节点、配置参数进行仿真。这些新模块的实现过程与仿真系统的实现是相互独立的,由用户完成。
模块注册单元2完成模块注册功能和对应模块的包头注册功能。
(1)模块注册功能。用户根据特定应用仿真的需要设计编写相应的模块,通过用户界面向仿真系统提交模块名、模块对应代码和模块描述,仿真系统将模块名、对应类文件名信息保存在底层模块库101中。例如现在注册一个实现UDP协议的报文传输协议模块,模块名为UdpAgent,对应模块的类代码文件为UdpAgent.cpp,对应的类继承自单向连通器Connector(从上面得知单向连通器Connector继承自传感器对象类WsnObject,而传感器对象类WsnObject继承自对象基类BaseObject),模块注册单元2在获得用户提交的上述内容后,会修改仿真系统的静态类文件staticClass.cpp(该静态类文件在本仿真系统中用于存放所有注册到底层模块库101中的模块对应的一段代码,每注册一个模块,仿真系统自动修改静态类文件即向其中增加类似如下的一段代码),即在其中加入如下一段代码:
#include″UdpAgent.h″
static class UdpAgentClass:public Register_Class{
public:
UdpAgentClass():Register_Class(″UdpAgent″){}
BaseObject*create(int argc,const char*const*argv){
return(new UdpAgent);
}
}class_UdpAgent;
然后仿真系统对报文传输协议模块的类文件UdpAgent.cpp和静态类文件staticClass.cpp进行动态编译,同时将报文传输协议模块的模块名UdpAgent、对应类文件名UdpAgent.cpp保存在底层模块库101中。
(2)包头注册功能。对于所有注册到仿真系统中的模块,都要对应地注册一个包头。包头指出了运行时的一段内存,各模块的数据就保存在对应包头标志的这段内存当中。通过用户界面,用户输入一个包头名、对应的模块名,模块注册单元2在获得来自用户界面的输入内容后,首先根据模块名到底层模块库101中查找对应模块代码文件,然后读取该模块需要保存数据的内存大小,同时在底层模块库101中对应模块项中加入从用户界面获得的包头名,然后模块注册单元2会为这个包头分配一个唯一的编号(编号是随着包头的增加以自增的方式变化),然后在包信息库108中保存该包头名和编号,最后模块注册单元2根据上面得到的模块需要的内存大小在包头信息库109中保存对应包头地址偏移量域值。仿真过程中当需要对包头赋值时,不需要生成新的对象,只需要通过地址偏移量的值计算出包头的起始地址,再通过类型转换得到对应的包头对象内存空间,然后对其赋值。如果要注册的包头对应的模块不存在,则模块注册单元2通过用户界面返回一个错误提示。
上述模块注册单元2对包头注册的处理过程中会为所有包头都分配一个唯一的编号,这个编号的作用是:当一个模块进行数据包封装时,只存入仿真系统为它分配的唯一的数据包包头编号(通过查找底层模块库101得到模块对应的包头名,再根据包头名到包信息库108中查找对应编号),以节省数据包传输长度。当对应模块进行拆包时又可以利用编号反向查出数据包包头名称,通过此种方法辨别传输的数据包类别。
包信息库108在包头注册之后保存其包头名和编号。
包头信息库109在包头注册之后保存其包头地址偏移量域值。
模块选择单元3的工作流程是:通过仿真系统的用户界面,底层模块库101中所有模块以列表形式显示,用户从列表中选择哪些模块属于节点构件模块、哪些模块属于仿真环境模块,点击保存按钮,然后模块选择单元3读取界面上保存的结果,将属于组成传感器节点内部结构的节点构件模块保存在节点构件库102中,将属于构建仿真场景的仿真环境模块保存在仿真环境场景库103中,模块选择单元3输出到节点构件库102和仿真环境场景库103的数据都是相应模块名和该模块的功能描述信息。例如在节点自定位仿真中,用户选择节点自定位模块、传输模块、路由模块、链路模块、队列模块、媒体访问控制(MAC)模块、物理模块保存于节点构件库102中,而选择随机数产生器模块、网络拓扑结构生成器模块、队列调度器模块以及节点自定位统计分析模块保存于仿真环境场景库103中。
节点构件库102保存由用户从底层模块库101中选出的用于组装传感器节点内部结构的所有模块,即节点构件模块,保存内容包括模块名和对应模块的功能描述信息。实现节点自定位仿真时需要保存节点自定位模块、传输模块、路由模块、链路模块、队列模块、媒体访问控制(MAC)模块、物理模块这些模块的名字和功能描述信息。
仿真环境场景库103用于保存由用户从底层模块库101中选出的用于仿真过程中对各种仿真场景进行仿真的模块,即仿真环境模块,保存内容包括模块名和对应模块的功能描述信息。在本发明适用的所有仿真中都需要的模块有:随机数产生模块、网络拓扑结构生成模块、队列调度模块和结果分析模块。
模块组装单元4首先将节点构件库102中保存的所有模块输出到用户界面上,用户通过用户界面按照需求对已列出来的模块进行组装,模块组装单元4通过用户界面获得用户组装的结果,将组装后的结果保存在节点组成关系库106中;用户也可以查看当前传感器节点内部结构,这时模块组装单元4从节点组成关系库106中读取传感器节点内部结构数据,并将这些数据输出到用户界面上。本仿真系统内部实现了一种默认的传感器节点内部结构(如图3所示),该结构是通用的,可满足大部分应用仿真的需求,用户只需要在应用模块41中加入自己的特定应用模块(加入的方法是:通过模块注册单元2注册到底层模块库101中,再经模块选择单元3选择并保存于节点构件库102中,最后经模块组装单元4组装),就可以在不改动原有代码的情况下完成仿真。模块组装单元4对节点构件库102中选出的各模块按照用户需求进行组装,该组装功能由双向连通器BaseConnector和单向连通器Connector完成。
由于具有模块注册单元2、模块选择单元3、模块组装单元4,使仿真系统具有极好的可扩展性,用户可以将为完成特定应用的仿真而设计的模块注册到仿真系统底层模块库101中,通过模块选择单元3和节点组装模块4,实现类似于TCP/TP协议的层次结构,完成各种不同需求的WSN仿真。
为了使仿真系统更具有通用性,默认实现了一种传感器节点内部结构,该结构中的模块之间为一种分层关系(如图3所示),应用模块41至信道模块48依次为上下层次的关系,即应用模块41的下层为传输模块42,没有上层,而传输模块42的上层为应用模块41,下层为路由模块43,依此类推。用户可以根据仿真的应用需求不同重组节点构件库102中各个模块关系,生成的传感器节点内部结构保存于节点组成关系库106中。本仿真系统中节点构件模块之间的关系及数据流向详细说明如下:
(1)应用模块41的下层为传输模块42,没有上层。应用模块41需要定义每个新添加的应用的端口,然后将此端口信息添加到对应的数据包中传递给传输模块42。
(2)传输模块42的上层为应用模块41,下层为路由模块43。传输模块42完成对应用模块41传递过来的数据包进行封装,即加上必要的包头控制信息,然后发送给路由模块43。
(3)路由模块43的上层为传输模块42,下层为链路模块44。发送数据包时,路由模块43确定数据包发送的目的地址,以及保存必要的路由信息,然后将数据包传递给链路模块44。在接收数据包时,路由模块43接收到来自链路模块44的数据包以后根据端口号返回给不同的应用模块41。
(4)链路模块44的上层为路由模块43,下层为队列模块45。在发送数据包时,链路模块44完成数据包的分组收发,然后将数据包传递给队列模块45。在接收数据包时,链路模块44将数据包传递给路由模块43。
(5)队列模块45的上层为链路模块44,下层为媒体访问控制模块46。队列模块45将链路模块44传递的来不及发送的数据包以一个优先级队列的形式进行缓存,然后根据先进先出队列的排队策略调度数据包向媒体访问控制模块46传递。
(6)媒体访问控制模块46的上层是队列模块45,下层是物理模块47。媒体访问控制模块46用来实现数据包的装帧和发送、实现虚拟载波监听以及数据包发送接收控制等,然后将处理完的数据包传递给物理模块47。当媒体访问控制模块46从物理模块47接收到数据时,读取本层模块对应的数据后进行处理,并将处理后的数据包传递给链路模块44,因为接收数据包不用进行队列处理。
(7)物理模块47的上层是媒体访问控制模块46,下层是信道模块48。物理模块47作为无线共享介质接口,对现实环境中传感器节点的一些硬件以及实际场景进行仿真,将这些数据添加到数据包之后传递给信道模块48。当物理模块47从下层信道模块48接收到数据包以后,读取本层模块对应的数据后进行处理,并将处理后的数据包传递给上层模媒体访问控制模块46。
(8)信道模块48的上层是物理模块47,没有下层。信道模块48对数据包在发送过程中的信道延迟进行仿真,用来计算数据包的发送延迟,即对接收无线信道中传送过来的数据包,并将数据包传递给上层物理模块47的这一过程进行仿真。
按照这种分层关系组建节点构件模块,即使传感器节点内部结构改变,但是只需要按照用户重新设计的节点构件模块之间的关系连接各个节点构件模块或者替换其中某一模块(如节点自定位模块替换为目标跟踪模块),并实现接收函数接口,则数据包就会按照规定的流程通过传感器节点内部进行处理,这样就使仿真系统具有了很强的可扩展性。
节点组成关系库106保存传感器节点内部结构,即模块组装单元4对节点构件库102中所有模块进行组装之后的输出。本仿真系统设计的传感器节点内部结构为层次结构,组成传感器节点的模块之间以指针链接上下层,节点组成关系库106则以元组(module,superclass,target,uptarget,downtarget)的方式保存模块组装单元4组装的结果,如表1所示。
表1传感器节点内部结构保存方式
module | superclass | target | uptarget | downtarget |
LocationApp | Application | UdpAgent | nil | nil |
UdpAgent | Connector | AODVAgent | nil | nil |
AODVAgent | Connector | LinkLayer | nil | nil |
LinkLayer | BaseConnector | nil | AODVAgent | PriQueue |
PriQueue | Connector | Mac_802_11 | nil | nil |
Mac_802_11 | BaseConnector | nil | LinkLayer | WirelessPhy |
WirelessPhy | BaseConnector | nil | Mac_802_11 | WirelessChannel |
WirelessChannel | BaseConnector | nil | WirelessPhy | null |
其中module表示模块名,也是对应的类名:LocationApp为应用模块的节点自定位模块名,UdpAgent为传输模块的UDP协议模块名,AODVAgent为路由模块的AODV协议模块名,LinkLayer为实现了链路模块功能的通用链路模块名,PriQueue为队列模块先进先出队列模块名,Mac_802_11为媒体访问控制模块的802.11MAC协议模块名,WirelessPhy实现了物理模块功能的通用模块名,WirelessChannel为实现了无线信道模块功能的通用模块名。
superclass表示该模块的基类(应用对象类Application、单向连通器Connector和双向连通器BaseConnector三者之一)。
target、uptarget和downtarget分别是对应类的三个属性,如果模块继承自双向连通器BaseConnector则没有target这个属性,对应的值为nil,uptarget和downtarget的值就是这个模块对应的上层模块和下层模块的模块名,如果没有上层模块或者没有下层模块则对应值为null(如通用无线信道模块WirelessChannel);如果模块继承自单向连通器Connector或者应用对象类Application则没有uptarget和downtarget这两个属性,对应的值为nil,target表示接收该模块输出的数据的目标模块,对应的值为模块名。在仿真过程中,仿真系统会根据节点组成关系库106保存的target、uptarget和downtarget的值为模块类实例化后的对象对应的属性进行赋值(值为指针或者引用)。
参数设置单元5用于对仿真所需的参数进行设置。用户通过用户界面可以从一个列表中看到所有保存在节点构件库102和仿真环境场景库103中的模块,用户可以对其中每一个模块进行参数的添加、删除、修改操作。在完成参数配置后用户的配置信息会通过用户界面传递给参数设置单元5,然后参数设置单元5根据用户的配置修改参数配置库105对应的内容。例如:用户配置节点自定位模块的节点测距误差属性的值为1,则参数设置单元5会根据从用户界面得到的输入生成一个元组(节点自定位,节点测距误差,1),然后根据模块名(节点自定位)到参数配置库105中查找对应传感器节点分布方式的那一项,如果没有,则新增对应项,并把其值设为用户设置的值(1),如果已存在,则直接修改其值为1。对于删除操作同理,参数设置单元5根据用户输入产生元组,然后在参数配置库105找到对应模块和对应属性的项,进行删除。另外,用户也需要通过用户界面对仿真系统的一些全局参数(用以配置仿真环境,如仿真场景大小、场景背景颜色,锚节点节点分布方式等)进行设置,设置的结果也会传送到参数配置单元5,参数配置单元5同样根据从用户界面得到的输入生成对应元组来进行保存,不过这里元组中的模块名为system,表示为仿真系统的参数,以区别模块的参数。参数设置单元5灵活改变仿真系统中所有模块的所有属性参数,通过它可以进行不同应用的仿真的相关设置。
参数配置库105用于保存节点构件库102和仿真环境场景库103中的所有模块的参数以及仿真系统的全局参数(用以配置仿真环境)。仿真系统的全局参数包括仿真场景大小(以垂直坐标系表示)、仿真场景的单位长度、界面上显示每个传感器节点的半径大小、场景背景颜色、传感器节点颜色、传感器节点个数、仿真时长、锚节点(位置固定且坐标已知的传感器节点)比例、锚节点分布方式(随机、网格、三角形)以及锚节点布置误差。而对于对应每个模块的属性参数,参数配置库105以元组(模块名,参数名,参数值)来保存其值。
拓扑数据生成单元6完成仿真的初始化工作,包括生成仿真场景、生成传感器节点所需要的模块对象以及将生成的模块对象进行实质性的组装。具体过程如下:
(1)拓扑数据生成单元6读取参数配置库105中的全局数据:仿真场景的大小、仿真场景的单位长度、界面上显示每个节点的半径大小、场景背景色、传感器节点颜色、传感器节点个数、仿真时长、锚节点比例、锚节点分布方式(随机、网格、三角形)以及锚节点布置误差,根据其中的传感器节点个数来定义一个对应长度的数组(用来保存要生成的传感器节点引用),并将这些全局数据传递给显示单元8。
(2)拓扑数据生成单元6从节点组成关系库106中读取传感器节点内部结构,根据得到的模块名和自定义的模块对象生成方法(后面介绍),为每一个参与组装的模块都生成一个对应的对象,以数组的形式保存到运行对象库104中。例如全局参数传感器节点个数为100个,那么定义一个长度为100的数组,数组保存的类型为自定义的传感器节点类(WsnNode),仿真系统拓扑数据生成单元6实例化100个对象(WsnNode对象)保存在这个数组中,每个对象名为“WsnNode_编号”(编号范围为1到100),而传感器节点类WsnNode中有个成员变量数组,长度为构造传感器节点模块的个数(这个长度通过读取节点组成关系库106中包含多少个模块获得),假设有8个模块,那么拓扑数据生成单元6会为这100个节点对象都分别生成8个模块对象,同理对于每个节点对象中的模块对象它的命名规则为“Module_编号”(编号范围1到8)。
(3)拓扑数据生成单元6在生成模块对象后完成模块对象的实质性的组装,从节点组成关系库106中可得到每个模块的类型(应用对象类Application、双向连通器Baseconnector或单向连通器Connector),再根据节点组成关系库106保存的模块的三个属性:target、uptarget和downtarget完成一个传感器节点中各模块对象的数据指向关系(通过设定模块对象中的指针变量来实现),这样就完成了一个传感器节点的实质性的组装。
(4)拓扑数据生成单元6在完成传感器节点对象的生成和模块对象的实质性的组装工作后对传感器节点的坐标进行初始化(可以选择随机设定坐标,也可以从文本文件中读取用户预定的坐标)。
(5)拓扑数据生成单元6还要根据仿真环境场景库103中保存的模块信息生成对应的模块对象,不过这里生成的模块对象不需要进行组装操作。
(6)拓扑数据生成单元6再根据参数配置库105中保存的模块参数对生成的模块对象进行配置,并将配置完的模块对象的对象引用保存在运行对象库104中。
上述提到的模块对象生成方法的流程为(如图4所示):当需要调用模块类生成对象时,拓扑数据生成单元6根据需要生成对象的模块名称生成一个系统模块名称(模块名加上模块编号合成),该系统模块名称为整个仿真系统中的唯一标识符名用于区分仿真系统中的其他对象。根据得到的系统模块名称和要执行的动作(生成一个模块对象)封装成一个命令语句,然后仿真系统对命令语句进行解析和执行,获取执行结果,判断结果是否有效,如果有效则调用对应模块的静态类的成员构造函数生成对应的模块对象引用并返回对象引用,结束,否则提示错误信息,结束。
命令解析工作流程为(如图5所示):拓扑数据生成单元6对合成的命令语句进行解析。首先判断命令是否可以解析,如果命令语句可以解析,则判断是否为启动运行命令“run”,若是,则启动仿真系统,否则判断是否为仿真系统退出命令“quit”,若是,则停止仿真退出仿真系统,如果既不是启动运行命令“nm”也不是仿真系统退出命令“quit”,则仿真系统调用对象命令接口函数。如果第一步判断命令语句不能被对应对象解析,则执行未知命令接口函数解析,遍历对象表容器内的所有对象指针,尝试解析,如果尝试解析成功则调用对应对象指针的命令接口函数执行对应操作,否则表示命令语句出错,调用错误命令函数进行处理。
运行对象库104保存由拓扑数据生成单元6生成在仿真过程中实际运行的各个模块类对应的对象引用(与对象基类(BaseObject)的成员变量哈希表(objectTable)保存的内容一致)。由于各个模块对应的类在该库中已经实例化为各种不同的对象,所以该库称为运行对象库104。
业务调度单元7包括离散事件调度单元71、能耗处理单元72、数据包记录单元73、随机数产生单元74、数据包管理单元75以及事件库76(如图6所示)。
(1)数据包管理单元75用于管理仿真过程中产生的所有数据包,包括传感器节点内数据包在各模块之间的传递,和数据包在各传感器节点间的传递。仿真开始时,数据包管理单元75首先会读取运行对象库104中的数据,在获得所有传感器节点和传感器节点内模块的引用后,数据包管理单元75则会通过统一接口来动态调用每一个传感器节点内的所有模块对象的函数。前面已介绍过所有用来组装传感器节点的模块都继承自同一个基类,并且都实现了相同的虚函数,该虚函数就是此处的统一接口。每个模块都在该函数中实现自身的功能,对传入自身的数据包进行封装,同时加入自己的数据(这个过和TCP/IP协议栈数据封装的过程相同)。数据包管理单元75会按照各模块的上下层关系依次运行个模块的功能函数,然后将模块运行产生的数据填入到对应的内存中。例如在进行节点自定位仿真中,包括节点自定位应用模块、UDP传输协议模块、AODV路由协议模块、链路层模块、队列模块、802.11媒体访问控制协议模块、无线物理模块和无线信道模块,这些模块构成了一个传感器节点,并且在节点组成关系库106中定义了他们的关系,在拓扑数据生成单元6中也根据节点组成关系库106完成了每个模块的指针值设置。数据包管理单元75首先为每个传感器节点分配一段内存(内存大小就是各模块对应包头长度的总和),然后从上层应用节点自定位应用模块开始运行,节点自定位应用模块完成运行后会输出数据,数据包管理单元75将节点自定位应用模块输出的数据保存到对应该模块的内存中,这样就完成了一个模块的运行。然后根据节点自定位应用模块中指向下层模块的指针去运行下一个模块的功能(如UDP传输协议模块),依此类推,直至完成一个传感器节点所有模块的运行和数据的填入(各个模块在内存中填入相应数据的过程就是数据包封装)。在对每个模块对应的数据进行处理的同时数据包管理单元75将模块对应的对象引用、数据包长度、数据包内容、处理方式(单点、广播)、数据包类型(发送、接收、丢失)传递给能耗处理单元72进行能耗计算,然后接收能耗处理单元72返回计算结果即该模块处理该数据包的能量损耗,并对所有模块处理其对应数据的能耗进行累加求和即为一个传感器节点处理一个数据包的能耗。数据包管理单元75在通过运行各模块完成一个传感器节点的数据包封装后,数据包管理单元75向随机数产生单元74申请一个随机数,将从随机数产生单元74得到的随机数作为这个数据包的标志,最后把这个数据包所包含的发送源地址、目的地址、处理该数据包使用的传输协议(例如UDP)、处理方式、数据包类型、数据长度、数据内容、处理该数据包所需的能耗以及数据包的标志加入事件库76中,等待离散事件调度单元71对这个数据包进行处理。在仿真系统中,传感器节点的地址都是以其在数组中的编号表示。
数据包管理单元75接收到来自离散事件调度71的通知要对一个数据包进行接收处理,其中对数据包的拆包过程就是数据包封装过程的逆序执行,每个模块到自己对应的内存中读取数据然后处理,并将数据沿着上层指针传递直至应用层。在完成接收处理后数据包管理单元75会在事件库76中加入一个接收数据包的事件,如果该传感器节点无法对此数据包进行接收处理,则数据包管理单元75会在事件库76中加入一个数据包丢弃的事件。
由于仿真系统不是真正的产生数据包传递,而是向计算机系统的内存申请内存空间,然后将数据存储在申请到的内存空间,通过数据交换传递来对数据包的传递过程进行仿真。在设计过程中,考虑到仿真过程会产生大量数据包的引用,为了避免频繁的进行内存空间的申请和释放,因此考虑设置一个内存空间管理链表,当申请的内存空间释放时,只需要清空数据内容,然后将其链接到链表中,而不是直接释放内存空间。当需要使用内存空间时,先从链表中查找是否有合适大小的地址块(不同大小的地址块连接起来构成整个内存空间),有则从链表中取出该地址块分配给申请对象,如果没有,则重新申请一块新的内存空间。所有申请的内存空间直到仿真结束才统一释放。这样设计的优点是避免了频繁申请和释放内存空间,减少了零碎地址块的生成,同时节省申请和释放内存空间的时间,提高了仿真速度。
(2)事件库76保存由数据包管理单元75生成的数据包,记录了发送源地址、目的地址、处理该数据包使用的传输协议、处理方式、数据包类型、数据长度、数据内容、处理该数据包所需的能耗以及数据包标志等主要信息。每一个数据包对应了一个需要处理的事件。加入到事件库76中的事件是按时间先后排序的,就是一个抽象的队列数据结构,队列中的事件将会被离散事件调度单元71顺序处理。数据包管理单元75和离散事件调度单元71是并行的(使用多线程技术)。
(3)离散事件调度单元71是实现业务调度单元7功能的核心单元,负责仿真系统运行时的事件处理。仿真系统是基于事件触发的结构:首先,仿真系统是使用VC++6.0开发实现的,在开发环境一级就是使用的事件触发结构。其次,整个仿真系统以数据包为单元,接收、发送和丢弃数据包都分别作为一个事件进行处理(分别对应一系列动作),在仿真系统设计一级也是使用的事件触发结构。加入到事件库76中的事件的时间不是线性连续的,而是一个个的离散点,而处理事件的离散事件调度单元71处理的时间也不是线性连续的,故称该调度为离散事件调度。事件库76中的每个事件代表了一个传感器节点向另一个传感器节点发送数据或者向周边节点进行广播,也代表了一个传感器节点接收另一传感器节点发送数据给自身,离散事件调度单元71要对每个事件进行这两种处理。离散事件调度单元71的事件处理过程为:
①离散事件调度单元71监听事件库76直至仿真结束,监听过程中,当事件库76中存在待处理事件时,从事件库76取出该事件;
②首先判断该事件类型是传感器节点发送数据包、传感器节点接收数据包、丢弃数据包中的哪种,如果是传感器节点丢弃数据包则转到步骤③,如果是传感器节点发送数据包转到步骤④,如果是传感器节点接收数据包则转到步骤⑦;
③离散事件调度单元71将该事件包含的发送源地址、目的地址、处理类型、数据长度、数据内容、能耗信息传递给数据包记录单元73,再转入步骤①;
④离散事件调度单元71将该事件包含的发送源地址、目的地址、处理类型、数据长度、数据内容、能耗信息传递给数据包记录单元73,然后离散事件调度单元71判断该数据包是单点传输还是广播,如果是单点传输则转到⑤,如果是广播则转到⑥;
⑤离散事件调度单元71将事件中源地址、目的地址、数据和标志传递给数据包管理单元75进行接收处理,数据包管理单元75会根据目的节点到运行对象库104中找到对应传感器节点的编号然后运行传感器节点的各模块完成对数据的拆包和处理,完成一个数据包的单点传输,再转入步骤①;
⑥离散事件调度单元71将事件中源地址、目的地址、数据和标志传递给数据包管理单元75进行接收处理,数据包管理单元75会到运行对象库104中根据各传感器节点的信息计算出哪些传感器节点需要对此包进行接收处理,然后运行这些传感器节点的各模块来分别完成对这个数据包的拆包和处理,完成一个数据包的广播,再转入步骤①;
⑦离散事件调度单元71直接将该事件包含的源地址、目的地址、处理类型、数据长度、数据内容、能耗传递给数据包记录单元73,完成一个数据包的接收,再转入步骤①。
(4)能耗处理单元72对实际中无线传感器节点数据包的发送、接收以及其自身的休眠和载波监听等实际场景的能量消耗进行仿真。在仿真过程中,能耗处理单元72接收来自数据包管理单元75传递过来的模块对应的对象引用、数据包长度、数据包内容、处理方式(单点、广播)、数据包类型(发送、接收、丢失),然后调用接收到的模块对象引用中的能耗计算函数计算出该模块处理该数据包需要的能量损耗,然后将计算得到的结果传递给数据包管理单元75。能耗计算的具体实现由用户在设计一个要注册到仿真系统中的功能模块时完成。
(5)数据记录单元73用于记录在整个仿真过程产生的数据包传输,包括记录一个数据包的发送源地址、目的地址、处理该数据包使用的传输协议、处理方式、数据包类型、数据长度、数据内容、处理该数据包所需的能耗以及数据包的标志,上述数据内容由离散事件调度单元71传递给数据记录单元73。当数据记录单元73在缓存上述数据到容量满时,就将这些数据保存于仿真业务数据库107中。
(6)随机数产生单元74收到来自数据包管理单元75的申请后,使用线性同余算法产生随机数,并将产生的随机数传递给数据包管理单元75。随机数产生单元74产生随机数的具体过程是:把2129的整数空间,划分成多个流,每个流大小为2127。然后每个流又划分成251个子流,每个子流大小为276。每个流就是一个随机数产生器,通过流内,流间,子流间的任意跳转(子流用矩阵表示,跳转通过矩阵的基本运算实现),以达到产生不同随机数据的功能。由于其在一个相当大的数据空间上进行线性同余,就极大地避免了伪随机算法容易出现固定数据的弊端,从而使仿真系统更接近真实场景。其中,随机数产生器包括了一个六维的种子向量(X1n,X1n+1,X1n+2,X2n,X2n+1,X2n+2),分成两个部分:
S1n=(X1n,X1n+1,X1n+2) 公式2
S2n=(X2n,X2n+1,X2n+2) 公式3
其中n表示第n次产生随机数,S1n和S2n通过以下递推公式产生:
X1n=(1403580×X1n-2-810728×X1n-3)modm1 公式4
X2n=(527612×X2n-1-1370589×X2n-3)modm2 公式5
其中m1=232-209=4294967087,m2=232-22853=4294944443,由上述公式递推,即可产生新的随机数,输出Zn=(X1n-X2n)mod4294967087以及Un,
Un=Zn/4294967088(Zn>0) 公式6
Un=4294967087/4294967088(Zn=0) 公式7
则,Un即为产生的随机数。
业务数据库107用于保存在仿真过程中生成的所有业务数据,包括记录仿真过程产生的每个数据包的发送源地址、目的地址点、处理该数据包使用的传输协议、处理方式、数据包类型、数据长度、数据内容、处理该数据包所需的能耗以及数据包标志。
显示单元8由节点模块结构显示单元81和仿真过程动画显示单元82组成。
节点模块结构显示单元81主要用来显示组成传感器节点内部结构的模块组成关系图,通过用户界面节点模块结构显示单元81以绘图的方式向用户显示当前用于仿真的传感器节点内部结构,在绘图中以一个矩形来表示一个模块,以带箭头的直线或曲线来代表模块的上下层关系,其各个矩形(模块)显示样式和坐标设置方式为(如图7所示):
节点模块结构显示单元81首先根据要进行绘制的模块的模块名通过公式L=strlen(name)*char_len来计算出要显示的模块名所需要的长度,其中name是模块名,char_len是要显示一个字符需要的长度,strlen为仿真系统已知的函数,然后再根据得到的结果L来计算绘图时显示的矩形的长度Length和宽度Width:
Length=L+margin*2
Width=char_len+margin*2
margin为矩形中要显示的模块名的第一个字符或最后一个字符距离矩形边框的长度。节点模块结构显示单元81会为每一个要绘制对应矩形的模块在用户界面上分配一个初始坐标(org_x,org_y),其中org_x是横坐标,org_y是纵坐标,那么根据这个初始坐标(org_x,org_y)和上面计算得到的矩形的长度Length和宽度Width就可以在用户界面上准确的绘制出一个矩形,然后在矩形中绘制该矩形对应的模块的模块名。另外一些主要的显示参数解释如下:
a为上层模块指向本层模块的指针链接点(如果上层模块的父类是双向连通器BaseConnector)。
b为本层模块指向上层对象的指针链接点(如果当前模块的父类是双向连通器BaseConnector)。
c为本层模块指向下层模块的指针链接点(如果当前模块的父类是双向连通器BaseConnector)。
d为下层模块指向本层模块的指针链接点(如果下层模块的父类是双向连通器BaseConnector)。
e为上层模块指向本层模块的指针链接点(如果当前模块的父类是单向连通器Connector)。
f为本层模块指向下层模块的指针链接点(如果当前模块的父类是单向连通器Connector)。
x为图中指示上下层关系的箭头线距离矩形长边中点的长度。
图7中的虚线为标注,实线才是最后要进行绘图显示的。
节点模块结构显示单元81算法流程为(如图8所示):
(1)节点模块结构显示单元81从节点组成关系库106中读取传感器节点内部结构数据即元组(module,superclass,target,uptarget,downtarget),module、superclass、target、uptarget、downtarget依次对应本模块的模块名、基类、目标模块、上层模块、下层模块。然后根据每一组这样的数据定义一个模块对象,模块对象除了包含元组中的数据外还包括模块编号以及上述通过计算得到的对应每个模块的矩形长、宽、各链接点坐标等所有信息,最后节点模块结构显示单元81将定义的所有模块对象保存在传感器节点显示模块类数组(命名为ModuleArray)中,转到(2)。
(2)节点模块结构显示单元81初始化传感器节点显示模块类数组,即:如果模块对象的基类superclass为双向连通器BaseConnector或者单向连通器Connector,将对应模块对象的模块编号初始化为1,否则如果模块对象的基类superclass为应用对象类Application,将对应模块对象的模块编号初始化为0。传感器节点显示模块类数组初始化完成后计算传感器节点显示模块类数组中的模块对象个数(即传感器节点显示模块类数组的有效长度,以appStart表示),转到(3)。
(3)遍历传感器节点显示模块类数组ModuleArray找到模块编号为0的模块对象(即继承应用对象类Application的类的模块对象),该模块对象就是所有其他模块对象的顶层模块对象,在绘图时也就是从此模块对象开始,读取该模块对象的目标模块的模块名target数据,保存在变量next_module中,转到(4)。
(4)定义一个编号变量index_来对模块编号为1的模块对象进行编号,初始化编号变量index_的值为1,转到(5)。
(5)判断编号变量index_是否小于传感器节点显示模块类数组的长度appStart,如果是转到(6),否则转到(12)。
(6)定义下标变量i,并初始化为0,遍历传感器节点显示模块类数组,转到(7)。
(7)判断下标变量i是否小于传感器节点显示模块类数组的长度appStart,如果是则转(8),否则转到(12)。
(8)判断下标变量i指示的传感器节点显示模块类数组中的模块对象的模块编号是否为1,如果是则转到(9),否则转到(14)。
(9)判断当前下标变量i标志的传感器节点显示模块类数组ModuleArray中模块对象的模块名module属性值是否等于变量next_module的值,如果是则转到(10),否则转到(14)。
(10)将当前编号变量index_的值赋值到当前模块对象的模块编号中,并且将编号变量index_的值增加1,转到(11)。
(11)如果当前模块对象的基类superclass是双向连通器BaseConnector则读取当前模块对象的下层模块的模块名Downtarget的值,否则如果当前模块对象的基类superclass是单向连通器Connector则读取当前模块对象的目标模块的模块名target的值,然后将读取的值赋值到next_module中,然后转到(5)。
(12)按传感器节点显示模块类数组ModuleArray中每个模块对象的编号值(从小到大)对所有元素进行排序,这样所有模块对象就会正确对应他们的上下层关系,然后转到(13)。
(13)遍历传感器节点显示模块类数组ModuleArray,根据每个模块对象的属性在用户界面上绘制对应图形以及图形之间的上下层关系,结束。
(14)将下标变量i的值增加1,转到(7)。
仿真过程动画显示单元82使用多线程技术及双缓存技术。在仿真环境场景初始化中,仿真过程动画显示单元82首先根据拓扑数据生成单元6传送过来的参数(场景背景色、传感器节点颜色、传感器节点个数、仿真时长、锚节点比例、锚节点分布方式以及锚节点布置误差等)对用户界面进行设置。在仿真过程中,仿真过程动画显示单元82使用多线程一直从仿真业务数据库107中实时地读取数据,并以动画的方式动态地显示数据包在各个传感器节点间的传输情况(如在两个互相通信的传感器节点间显示一根虚线,延迟一段时间后擦除),同时在用户界面的监视窗口以列表的形式同步地输出从仿真业务数据库107中获得的数据。在实现动画显示传感器节点通信时使用了双缓存技术,避免用户界面的频繁刷新,即仿真过程动画显示单元82开辟一段内存用来保存要显示到界面的数据,当从仿真业务数据库107获得数据时,更新该段内存中的相应数据,每隔一段时间才将该段内存中保存的数据显示到用户界面上。
结果统计单元9首先从运行对象库104中查找用于统计分析的模块对应的对象引用(该模块是用户按照对应特定需求实现并通过模块注册单元4注册到仿真系统中的),注册到仿真系统中并用以进行数据统计分析的模块实现类都必须继承自本仿真系统提供的统计分析类(该类为一个抽象类ResultAnalysis,包含一个对仿真结果进行统计分析的虚函数analysis()),并实现基类的虚函数。例如在节点自定位应用仿真中,根据需求设计实现了自定位模块和定位统计分析模块,并注册到仿真系统中,自定位模块在完成仿真后会生成一个文件保存定位的数据,然后结果统计单元9利用从运行对象库104中查找到得对象引用,调用相应analysis()函数,在该函数内部,定位统计分析模块读取上述保存定位的数据的文件,然后将文件中的数据以图表显示(如在二维坐标系显示定位成功率和锚节点比例的关系)到用户界面上,供用户进行仿真性能分析。具体自定位模块如何仿真、如何保存数据和定位统计分析模块如何读取数据、如何显示都由仿真系统的用户来实现,只要用户实现了仿真系统的虚函数接口,结果统计单元9就能通过该接口来调用用户实现的功能。
本仿真系统的工作流程为:
(1)用户首先将自己设计实现的模块通过模块注册单元2注册到底层模块库101中。在包头注册之后保存其包头名和编号到包信息库108中,并在包头信息库109完成对应包头地址偏移量域值的设定。
(2)模块选择单元3从底层模块库101中选择应用仿真需要用到的模块并分别存放到节点构件库102和仿真环境场景库103中。
(3)模块组装单元4将节点构件库102中的节点构件模块根据用户设计的传感器节点结构进行组装,将传感器节点内部结构保存于节点组成关系库106中。
(4)参数设置单元5将用户对节点构件库102和仿真环境场景库103中的各个模块属性以及仿真系统参数的设置保存在参数配置库105中。
(5)拓扑数据生成单元6根据节点关系库106和仿真环境场景库103中保存所有模块信息生成对应的模块对象,然后根据参数配置库105中保存的模块属性对已生成的模块对象进行参数配置,并根据节点关系库106中保存的传感器节点内部结构配置各节点构件模块之间的关系,最后将生成的所有模块对象都存放于运行对象库104中。
(6)业务调度单元7根据用户设计的仿真业务从运行对象库104中选择生成的模块对象完成相应的业务操作,同时将产生的各种业务数据保存于业务数据库107中。
(7)在仿真运行开始后显示单元8根据拓扑数据生成单元6传递过来的数据(场景背景色、传感器节点颜色、传感器节点个数、仿真时长、锚节点比例、锚节点分布方式以及锚节点布置误差等)对用户界面的仿真场景进行设置,并不断监听业务数据库107中是否有数据更新,然后实时动态地将仿真过程用动画表现给用户。如果用户需要查看传感器节点内部结构时,显示单元8则会读取节点关系库106中的数据并传入到显示单元8的节点模块结构显示单元81的传感器节点显示模块类数组中,节点模块结构显示单元81根据前面所述的方法将传感器节点内部结构绘图显示给用户。
(8)结果统计单元9根据存放于仿真业务数据库107中的数据进行相应的数学统计,并将统计结果显示于界面上,以供用户进行仿真性能分析。
Claims (3)
1.一种无线传感器网络仿真系统,其特征在于:该无线传感器网络仿真系统包括用户界面、底层模块库(101)、节点构件库(102)、仿真环境场景库(103)、运行对象库(104)、参数配置库(105)、节点组成关系库(106)、业务数据库(107)、包信息库(108)、包头信息库(109)、模块注册单元(2)、模块选择单元(3)、模块组装单元(4)、参数设置单元(5)、拓扑数据生成单元(6)、业务调度单元(7)、显示单元(8)和结果统计单元(9);
用户界面是用户操作使用该无线传感器网络仿真系统的一个可视化界面;
底层模块库(101)用于保存用户为了完成仿真所需的功能而注册的模块,其中包括保存模块名、模块对应的类文件即代码、模块对应的数据包包头以及三者之间的对应关系;
节点构件库(102)用于保存由用户从底层模块库(101)中选出的用于组装传感器节点内部结构的所有模块,即节点构件模块,保存内容包括模块名和对应模块的功能描述信息;所述传感器节点内部结构是指由模块和模块之间的数据流向和上下层关系构成的结构,所述节点构件模块包括应用模块、传输模块、路由模块、链路模块、队列模块、媒体访问控制模块、物理模块和信道模块;
仿真环境场景库(103)用于保存由用户从底层模块库(101)中选出的用于仿真过程中对各种仿真场景进行仿真的模块,即仿真环境模块,保存内容包括模块名和对应模块的功能描述信息;所述仿真环境模块包括随机数产生模块、网络拓扑结构生成模块、队列调度模块和结果分析模块;
运行对象库(104)用于保存由拓扑数据生成单元(6)生成在仿真过程中实际运行的各个模块类对应的对象引用;
参数配置库(105)用于保存节点构件库(102)和仿真环境场景库(103)中的所有模块的参数以及无线传感器网络仿真系统的全局参数;
节点组成关系库(106)用于保存传感器节点内部结构,即模块组装单元(4)对节点构件库(102)中所有模块进行组装之后的输出;
业务数据库(107)用于保存在仿真过程中生成的所有业务数据,包括记录仿真过程产生的每个数据包的发送源地址、目的地址、数据包类型,处理该数据包使用的传输协议、传感器节点处理这个数据包的能量损耗;
包信息库(108)用于在包头注册之后保存其包头名和编号;
包头信息库(109)用于在包头注册之后保存其包头地址偏移量域值;
模块注册单元(2)用于完成模块注册功能和对应模块的包头注册功能;模块注册功能是指:模块注册单元(2)通过用户界面接收用户提交的模块名、模块对应代码和模块描述,根据模块名到底层模块库(101)中查找是否存在具有相同名称的模块,如果已存在具有相同名称的模块则返回一个错误提示到用户界面,如果没有则修改仿真系统中的静态类文件,然后仿真系统对模块对应类文件和静态类文件进行动态编译,模块注册单元(2)将模块名、对应类文件名信息保存在底层模块库(101)中;包头注册功能是指模块注册单元(2)在获得来自用户界面的包头名和对应的模块名后,首先根据模块名到底层模块库(101)中查找对应模块代码文件,然后读取其中模块需要保存数据的内存大小,同时在底层模块库(101)中对应模块项中加入从用户界面获得的包头名,然后模块注册单元(2)会为这个包头分配一个唯一的编号,在包信息库(108)中保存该包头名和编号,最后模块注册单元(2)根据上面得到的模块需要的内存大小在包头信息库(109)中保存对应包头地址偏移量域值;如果要注册的包头对应的模块不存在,则模块注册单元(2)通过用户界面返回一个错误提示;
模块选择单元(3)根据用户在用户界面上的选择,在底层模块库(101)中选择属于组成传感器节点内部结构的节点构件模块保存在节点构件库(102)中,选择属于构建仿真场景的仿真环境模块保存在仿真环境场景库(103)中,模块选择单元(3)将选择模块的模块名和该模块的功能描述信息输出到节点构件库(102)和仿真环境场景库(103);
模块组装单元(4)用于将节点构件库(102)中保存的所有模块输出到用户界面上,用户通过用户界面按照需求对已列出来的模块进行组装,模块组装单元(4)通过用户界面获得用户组装的结果,将组装后的结果保存在节点组成关系库(106)中;
参数设置单元(5)用于完成用户对所有保存在节点构件库(102)和仿真环境场景库(103)中的模块的参数进行添加、删除和修改操作,并根据用户的操作修改参数配置库(105)对应的内容;
拓扑数据生成单元(6)读取参数配置库(105)中的全局数据,并将全局数据传递给显示单元(8);拓扑数据生成单元(6)从节点组成关系库(106)中读取传感器节点内部结构,根据得到的模块名和自定义的模块对象生成方法,为每一个参与组装的模块都生成一个对应的对象,以数组的形式保存到运行对象库(104)中;拓扑数据生成单元(6)还从节点组成关系库(106)中得到每个模块的类型,再根据节点组成关系库(106)保存的模块的属性完成一个传感器节点中各模块对象的数据指向关系,完成一个传感器节点组装,并对传感器节点的坐标进行初始化;拓扑数据生成单元(6)还要根据仿真环境场景库(103)中保存的模块信息生成仿真环境模块对应的模块对象,再根据参数配置库(105)中保存的模块参数对生成的模块对象进行配置,并将配置完的模块对象的对象引用保存在运行对象库(104)中;
业务调度单元(7)读取运行对象库(104)中的数据,在获得所有传感器节点和传感器节点内模块的引用后,业务调度单元(7)按照各模块的上下层关系通过统一接口依次调用传感器节点内的所有模块对象的函数,各模块对传入自身的数据包进行封装,同时加入自己的数据;业务调度单元(7)在其缓冲区变满时,将缓存数据保存于业务数据库(107)中;
显示单元(8)首先接收用户在用户界面上的选择,如果用户选择查看传感器节点内部结构则显示单元(8)读取节点组成关系库(106)中的数据,按照数据绘制图表显示到用户界面;如果用户选择查看仿真过程,则显示单元(8)根据从拓扑数据生成单元(6)传递过来的全局数据配置用户界面,同时监听业务数据库(107),将其中的数据以动画方式显示到用户界面;
结果统计单元(9)首先从运行对象库(104)中查找用于统计分析的模块对应的对象引用,从业务数据库(107)中读取业务数据,将读取的业务数据传送给在运行对象库(104)查找到的对象引用,调用相应函数进行处理,并将处理结果以图表的形式显示在用户界面上。
2.根据权利要求1所述的无线传感器网络仿真系统,其特征在于:业务调度单元(7)包括离散事件调度单元(71)、能耗处理单元(72)、数据包记录单元(73)、随机数产生单元(74)、数据包管理单元(75)以及事件库(76);
数据包管理单元(75)用于管理仿真过程中产生的所有数据包,包括传感器节点内数据包在各模块之间的传递,和数据包在各传感器节点间的传递;仿真开始时,数据包管理单元(75)读取运行对象库(104)中的数据,在获得所有传感器节点和传感器节点内模块的引用后,数据包管理单元(75)按照各模块的上下层关系通过统一接口依次调用传感器节点内的所有模块对象的函数,各模块对传入自身的数据包进行封装,同时加入自己的数据;数据包管理单元(75)在完成传感器节点的数据包封装后,向随机数产生单元(74)申请一个随机数,将从随机数产生单元(74)得到的随机数作为该数据包的标志;数据包管理单元(75)将已获得随机数标志的数据包所包含的发送源地址、目的地址、处理该数据包使用的传输协议、处理方式、数据包类型、数据长度、数据内容、处理该数据包所需的能耗以及数据包的标志保存在事件库(76)中,等待离散事件调度单元(71)对该数据包进行处理;数据包管理单元(75)将模块对应的对象引用、数据包长度、数据包内容、处理方式、数据包类型传递给能耗处理单元(72)进行能耗计算,然后接收能耗处理单元(72)返回计算结果即该模块处理该数据包的能量损耗,并对所有模块处理其对应数据的能耗进行累加求和即为一个传感器节点处理一个数据包的能耗;
事件库(76)用于保存由数据包管理单元(75)生成的数据包,每一个数据包对应一个事件,数据包的内容包括发送源地址、目的地址、处理该数据包使用的传输协议、处理方式、数据包类型、数据长度、数据内容、处理该数据包所需的能耗以及数据包的标志;
离散事件调度单元(71)负责仿真系统运行时的事件处理,其处理过程为:
①离散事件调度单元(71)监听事件库(76)直至仿真结束,监听过程中,当事件库(76)中存在待处理事件时,从事件库(76)取出该事件;
②首先判断该事件类型是传感器节点发送数据包、传感器节点接收数据包、丢弃数据包中的哪种,如果是传感器节点丢弃数据包则转到步骤③,如果是传感器节点发送数据包转到步骤④,如果是传感器节点接收数据包则转到步骤⑦;
③离散事件调度单元(71)将该事件包含的发送源地址、目的地址、处理类型、数据长度、数据内容、能耗信息传递给数据包记录单元(73),再转入步骤①;
④离散事件调度单元(71)将该事件包含的发送源地址、目的地址、处理类型、数据长度、数据内容、能耗信息传递给数据包记录单元(73),然后离散事件调度单元(71)判断该数据包是单点传输还是广播,如果是单点传输则转到⑤,如果是广播则转到⑥;
⑤离散事件调度单元(71)将事件中源地址、目的地址、数据和标志传递给数据包管理单元(75)进行接收处理,数据包管理单元(75)会根据目的节点到运行对象库(104)中找到对应传感器节点的编号然后运行传感器节点的各模块完成对数据的拆包和处理,完成一个数据包的单点传输,再转入步骤①;
⑥离散事件调度单元(71)将事件中源地址、目的地址、数据和标志传递给数据包管理单元(75)进行接收处理,数据包管理单元(75)会到运行对象库(104)中根据各传感器节点的信息计算出哪些传感器节点需要对此包进行接收处理,然后运行这些传感器节点的各模块来分别完成对这个数据包的拆包和处理,完成一个数据包的广播,再转入步骤①;
⑦离散事件调度单元(71)直接将该事件包含的源地址、目的地址、处理类型、数据长度、数据内容、能耗传递给数据包记录单元(73),完成一个数据包的接收,再转入步骤①;
能耗处理单元(72)接收来自数据包管理单元(75)传递过来的模块对应的对象引用、数据包长度、数据包内容、处理方式、数据包类型,调用接收到的模块对象引用中的能耗计算函数计算出该模块处理该数据包需要的能量损耗,将计算得到的结果传递给数据包管理单元(75);
数据记录单元(73)用于记录在整个仿真过程产生的数据包传输过程,数据包由离散事件调度(71)传递到数据记录单元(73);数据记录单元(73)在缓存上述数据包到容量满时,将数据包保存于业务数据库(107)中;
随机数产生单元(74)主要使用线性同余算法产生随机数,提供给数据包管理单元(75)使用。
3.根据权利要求1或2所述的无线传感器网络仿真系统,其特征在于:显示单元(8)由节点模块结构显示单元(81)和仿真过程动画显示单元(82)组成;
节点模块结构显示单元(81)主要用于显示组成传感器节点内部结构的模块组成关系图,通过用户界面节点模块结构显示单元(81)以绘图的方式向用户显示当前用于仿真的传感器节点内部结构;
仿真过程动画显示单元(82)在仿真环境场景初始化中,仿真过程动画显示单元(82)首先根据拓扑数据生成单元(6)传送过来的参数对用户界面进行设置;在仿真过程中,仿真过程动画显示单元(82)使用多线程一直从业务数据库(107)中实时地读取数据,并以动画的方式动态地显示数据包在各个传感器节点间的传输情况,同时在用户界面的监视窗口以列表的形式同步地输出从业务数据库(107)中获得的数据;仿真过程动画显示单元(82)采用双缓存技每隔一段时间将内存中保存的数据显示到用户界面上。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010101008303A CN101841839B (zh) | 2010-01-22 | 2010-01-22 | 一种无线传感器网络仿真系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010101008303A CN101841839B (zh) | 2010-01-22 | 2010-01-22 | 一种无线传感器网络仿真系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101841839A CN101841839A (zh) | 2010-09-22 |
CN101841839B true CN101841839B (zh) | 2012-06-13 |
Family
ID=42744870
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010101008303A Expired - Fee Related CN101841839B (zh) | 2010-01-22 | 2010-01-22 | 一种无线传感器网络仿真系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101841839B (zh) |
Families Citing this family (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102026189B (zh) * | 2010-12-20 | 2012-11-07 | 西安西电捷通无线网络通信股份有限公司 | 内耗测试模块、内耗测试方法、仿真测试系统及仿真测试方法 |
WO2012122694A1 (en) * | 2011-03-11 | 2012-09-20 | Nokia Corporation | Method and apparatus for resource saving in heterogeneous networks |
CN102307369B (zh) * | 2011-09-13 | 2013-11-27 | 北京科技大学 | 支持无线传感网并行仿真和实物模拟的装置及方法 |
CN102595434A (zh) * | 2012-02-08 | 2012-07-18 | 中国科学院上海微系统与信息技术研究所 | 一种无线传感器网络拟实仿真系统 |
CN102724064B (zh) * | 2012-05-17 | 2014-12-24 | 清华大学 | 一种网络应用仿真系统构建方法 |
CN103428834B (zh) * | 2013-08-02 | 2016-02-03 | 苏州两江科技有限公司 | 一种降低wsn系统功耗的方法 |
CN103442249B (zh) * | 2013-09-09 | 2015-09-23 | 国家电网公司 | 视频会议系统仿真方法和平台 |
CN103810018A (zh) * | 2014-01-28 | 2014-05-21 | 北京仿真中心 | 一种组件化、参数化仿真模型的设计方法 |
CN106815388A (zh) * | 2015-12-02 | 2017-06-09 | 北京华大九天软件有限公司 | 一种通过界面显示仿真测量数据的方法 |
CN107623555B (zh) * | 2016-07-14 | 2021-05-14 | 工业和信息化部电信研究院 | 一种通用型通信仿真平台的实现方法及装置 |
US10425792B2 (en) | 2017-06-21 | 2019-09-24 | Honeywell International Inc. | Virtual wireless devices for industrial wireless sensor networks |
US11050682B2 (en) * | 2017-09-28 | 2021-06-29 | Intel Corporation | Reordering of data for parallel processing |
CN107995524A (zh) * | 2017-12-07 | 2018-05-04 | 郑州云海信息技术有限公司 | 一种连接网络视频服务器的客户端系统及其设计、数据处理方法 |
CN108052020B (zh) * | 2017-12-19 | 2020-06-09 | 浙江大学 | 一种面向智能制造的化工过程仿真器 |
CN108418703B (zh) * | 2018-01-10 | 2021-06-25 | 北京思特奇信息技术股份有限公司 | 一种基于实时事件侦测的预警方法及系统 |
US11096012B2 (en) * | 2019-05-29 | 2021-08-17 | Texas Instruments Incorporated | Integrated Wi-Fi location |
CN110515812A (zh) * | 2019-08-13 | 2019-11-29 | 昆山达骐亚网络科技有限公司 | 基于Unity+3D技术的虚拟仿真系统构建方法 |
CN110874717B (zh) * | 2019-10-12 | 2022-11-18 | 中国直升机设计研究所 | 一种数据管理方法 |
CN114845312B (zh) * | 2022-04-02 | 2023-05-16 | 四川安迪科技实业有限公司 | 一种基于tdma卫星网管自动搭建组网环境的方法 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101447897A (zh) * | 2007-11-27 | 2009-06-03 | 中国科学院计算技术研究所 | 一种无线传感器网络模拟器及其建立方法 |
-
2010
- 2010-01-22 CN CN2010101008303A patent/CN101841839B/zh not_active Expired - Fee Related
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101447897A (zh) * | 2007-11-27 | 2009-06-03 | 中国科学院计算技术研究所 | 一种无线传感器网络模拟器及其建立方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101841839A (zh) | 2010-09-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101841839B (zh) | 一种无线传感器网络仿真系统 | |
Chen et al. | Vehicle routing problem of contactless joint distribution service during COVID-19 pandemic | |
Fujimoto | Parallel and distributed simulation systems | |
Shu et al. | NetTopo: A framework of simulation and visualization for wireless sensor networks | |
Iyengar et al. | Fundamentals of sensor network programming: Applications and technology | |
CN105915304B (zh) | 一种面向卫星移动通信的系统级仿真演示验证方法 | |
Zhu et al. | Multitask allocation to heterogeneous participants in mobile crowd sensing | |
CN101013986A (zh) | 基于移动代理中间件的传感器网络数据查询系统实现方法 | |
CN105871487B (zh) | 一种面向卫星移动通信的系统级仿真演示验证系统 | |
CN101394345A (zh) | 一种面向普适计算感知数据流的协同进化聚类方法 | |
CN107911300B (zh) | 基于鲸鱼算法的组播路由优化方法及其在Spark平台上的应用 | |
CN113256163B (zh) | 智慧城市政务云平台网外运算方法及系统 | |
WO2021208326A1 (zh) | 基于雾计算和区块链平台的分布式气象站系统及工作方法 | |
CN104902565A (zh) | 一种分布式的无线传感器网络三维mds定位方法 | |
CN111625218B (zh) | 一种自定义库开发的大数据处理方法及系统 | |
CN106571947A (zh) | 一种支持复杂多元网络构造的网络元模型实现方法 | |
CN103281211A (zh) | 大规模网络节点分组管理系统及管理方法 | |
Smith et al. | Target assignment for robotic networks: Asymptotic performance under limited communication | |
CN101404664A (zh) | 一种基于节点聚类的网络定位优化算法 | |
CN103229153A (zh) | 用于提供持久计算的方法和装置 | |
Warnke et al. | SIMORA: SIMulating Open Routing protocols for Application interoperability on edge devices | |
Liu et al. | Adaptive access selection algorithm for large-scale satellite networks based on dynamic domain | |
Zhai et al. | Research on the Message-Oriented Middleware for Wireless Sensor Networks. | |
Kazemeyni et al. | Grouping nodes in wireless sensor networks using coalitional game theory | |
Gitzenis et al. | Flow optimization in delay tolerant networks using dual decomposition |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120613 Termination date: 20130122 |