CN109598040A - 基于tcp协议的ns3与matlab集成的联合仿真接口方法 - Google Patents
基于tcp协议的ns3与matlab集成的联合仿真接口方法 Download PDFInfo
- Publication number
- CN109598040A CN109598040A CN201811396214.XA CN201811396214A CN109598040A CN 109598040 A CN109598040 A CN 109598040A CN 201811396214 A CN201811396214 A CN 201811396214A CN 109598040 A CN109598040 A CN 109598040A
- Authority
- CN
- China
- Prior art keywords
- function
- class
- externallydrivensim
- server
- matlab
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/20—Design optimisation, verification or simulation
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/16—Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
- H04L69/161—Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields
- H04L69/162—Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields involving adaptations of sockets based mechanisms
-
- 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
- Y02P—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN THE PRODUCTION OR PROCESSING OF GOODS
- Y02P90/00—Enabling technologies with a potential contribution to greenhouse gas [GHG] emissions mitigation
- Y02P90/02—Total factory control, e.g. smart factories, flexible manufacturing systems [FMS] or integrated manufacturing systems [IMS]
Abstract
基于TCP协议的NS3与MATLAB集成的联合仿真接口方法,首先在linux操作系统中搭建两种仿真软件的运行环境,选择Ubuntu操作系统,安装MATLAB和NS3仿真软件,并在Eclipse并对NS3进行配置;然后通过TCP协议建立两个仿真软件之间的交互接口,在MATLAB和NS3编写的程序中都创建了一个新的套接字,由于MATLAB作为客户端,而NS3作为服务器,因此接下来对两者的套接字进行不同步骤的使用。之后对NS3默认仿真器的改进,通过继承创建了一个新仿真器类ExternallyDrivenSim,并增添和修改相应功能。最后对NS3的UDP应用程序类以及其助手类进行改进,通过继承创建新的UDP应用程序类和助手类,使它们能够有效地配合新仿真器仿真相关的场景。
Description
技术领域
本发明涉及对于不同的两款仿真软件NS3与MATLAB,编写特定的联合仿真接口的方法,使两者能够一定程度上进行交互的方法。
背景技术
网络控制系统(NCS)是由要控制的系统和执行器,传感器和控制器组成的控制系统,其操作通过通信网络进行协调,因此NCS包含耦合的控制和通信视角。NCS使用多用途共享网络连接空间分布的元素导致灵活的架构,并且通常降低了安装和维护成本。因此,NCS已经在诸如工业控制系统和无人驾驶飞行器(UAV)等广泛领域中得到应用。
然而,现有的仿真软件集中在控制系统或通信网络上,对于NCS的仿真也是基于对单个仿真软件的再开发。比如最常用的NCS仿真工具就是基于MATLAB开发的truetime软件包。MATLAB其具有精确的物理模型和强大的功能,并支持复杂算法的矩阵运算,但是即使使用了truetime软件包仍然无法对某些通信网络做到较为精确的仿真。通信系统的仿真软件NS3是一种广泛而开源的离散事件模拟器,旨在促进网络堆栈不同层次网络协议的仿真,使用NS3,可以构建不同的网络拓扑,并且可以模拟几种网络技术或者多种网络的混合。如果能够找到一种有效的方式能将两者结合起来,让两款软件做到优势互补,将会大大提高仿真的精确性。
发明内容
本发明要克服现有的仿真软件只能精确仿真某一类系统的缺点,提出一种基于TCP协议的NS3与MATLAB集成的联合仿真接口方法。
本发明为了分析NCS的耦合效应,联合仿真方法被认为是最有希望的解决方案之一。基于NS3和MATLAB在各自仿真领域的优势特性,提出了一种基于TCP协议的NS3与MATLAB集成的联合仿真接口,做到两款仿真软件之间的初步的交互,为设计一种精确仿真NCS的仿真软件打下良好的基础。
本发明解决其技术问题所采用的技术方案是:
一种基于TCP协议的NS3与MATLAB集成的联合仿真接口方法,含有以下步骤:
(1)在linux操作系统中搭建两种仿真软件的运行环境;
步骤11:选择合适的linux操作系统;
由于NS3的运行环境为linux操作系统,选择基于Debian GNU/Linux发行版的计算机操作系统Ubuntu运行NS3,Ubuntu拥有良好的可视化界面和便于软件开发的IDE,选择安装的Ubuntu操作系统版本为16.04LTS;
步骤12:安装MATLAB 2011b UNIX版;
步骤13:安装NS3网络仿真软件;
NS3是一个离散事件网络仿真软件,由仿真核心和模型组成,并以C++程序实现,NS3被构建为一个C++库,可以静态或动态地链接到定义模拟拓扑并启动仿真软件运行C++外部脚本主程序,以此来运行该网络的仿真,选择安装的NS3版本为3.27;
步骤14:安装C++版本的Eclipse并对NS3进行配置;
由于NS3本质为一个C++库,所以为了能够方便的对NS3中的程序进行修改,安装了C++版本的Eclipse,并对NS3进行相关配置,配置步骤如下:1.在Eclipse中新建C++的空项目工程,将ns-3.27文件夹拷贝到这个工程下面,刷新项目并需要先在Eclipse终端中运行NS3配置指令./waf configure;2.右键工程,选择属性(properties),在build中(C++Build)进行修改,选择builder类型为External builder,build命令选择编译NS3程序的waf编译器所在的路径,比如:${workspace_loc:/ns3/ns-3.27/waf},其中:workspace_loc是指工程所在的路径;build的目录就选择NS3对应的目录,比如:${workspace_loc:/ns3/ns-3.27/build};3.外部编译器的配置,也就是NS3使用的waf编译器的配置,在运行--外部工具--外部工具配置(run-external tools-external tools configurations)中,位置(location)是waf的路径,比如:${workspace_loc:/ns3/ns-3.27/waf},工作目录(workingderectory)是NS3所在的目录,比如:${workspace_loc:/ns3/ns-3.27},自变量(arguments),填:--run"${string_prompt}",用户输入执行的C++文件,就是输入的参数;4.调试:NS3可以使用Eclipse调试,也可以使用通过终端调用gdb来进行调试,在Eclipse中调试步骤为:右键工程,选择属性(properties),选择调试的配置(run/debug settings),创建一个新的加载配置,选择你刚刚生成的文件project,选择环境设置栏(environment),新建一个环境变量,变量名(name)为:LD_LIBRARY_PATH,变量值(value)为build的路径:${workspace_loc:/ns3/ns-3.27/build},之后选择Main栏,在C/C++Application中填写build文件夹下需要调试的已经通过编译器waf成功的目标文件,比如:build/scratch/third,另外也可已通过gdb来调试NS3程序,在ns-3.27文件夹中打开终端,输入指令比如:
$./waf--run=hello-simulator--command-template="gdb%s--args<args>",
执行后将会以调试状态运行hello-simulator程序;
(2)通过TCP协议建立两个仿真软件之间的交互接口;
步骤21:在MATLAB和NS3中编写了客户端和服务器程序,其中MATLAB作为主控方,NS3作为被控方,仿真软件的交互是通过使用Berkley的TCP协议完成的,两个仿真软件之间通过TCP协议套接字建立连接,使其为两个仿真软件间通信IPC提供强大和灵活的机制,因此在MATLAB和NS3编写的程序中都创建了一个新的TCP套接字,创建套接字的代码为socket=socket(AF_INET,SOCK_STREAM,0);之后两个仿真软件轮流作为数据处理方,仿真运行的主体在两者之间反复切换,通过这种交替运行的方式驱动仿真;
步骤22:对于MATLAB的客户端的套接字,在数据传输之前,使用connect函数用于客户端套接字对NS3发起会话连接功能,代码为connect(sock,(struct sockaddr*)&addr,sizeof(addr),sock为MATLAB客户端创建的TCP套接字,addr是一个结构体指针,其中包括目标服务器的地址和端口号,其中目标服务器IP为0x7f000001,即本机的IP地址(由于NS3服务器也运行在同一台计算机上),发送目标服务器端口号为3425(NS3服务器占用该端口);
步骤23:使用NS3的服务器套接字,具体包括:S1.首先套接字使用使用bind函数与选定域中的地址绑定,代码为bind(listener,(struct sockaddr*)&addr,sizeof(addr)),listener为服务器创建的TCP套接字,addr包括服务器的侦听的客户端地址和服务器的端口号,其中侦听的客户端地址为htonl(INADDR_ANY),即服务器侦听所有客户端发起的会话请求,端口号为3425,S2.使用listen函数用于服务器套接字开启侦听会话连接功能,代码为listen(listener,1),等待连接队列的最大长度设为1,S3.当服务器侦听到合适的请求,使用accept函数接受客户端发起的会话连接,并创建一个用于与MATLAB客户端进行数据传输的新套接字,如果该函数调用还处于监听模式socket之下,原始套接字可以提供其他连接;
步骤24:在客户端和服务器中都使用send数据发送函数和recv数据接收函数,当会话连接被服务器接收后,即可开始数据包的传输,传输的数据类型为被指定的结构体,该结构体可以根据两个仿真软件之间需要交互的信息而具体更改,初步包括了节点的发送触发信号和接收感知信号在该结构体中,
(3)改进NS3的默认仿真器;
步骤301:为了能够让MATLAB外部驱动NS3仿真,通过继承DefaultSimulatorImpl类创建了一个新仿真器类ExternallyDrivenSim,在NS3中,默认情况下只有两种时间关系:实时(所有仿真事件在现实生活中随着时间的推移而发生的)与默认时间(所有的仿真事件随着时间的推移尽可能快地发生在计算机上),由于NS3是离散时间仿真软件,当选择默认时间仿真方式,仿真在实验的极限下不可能在必要时刻停止,在这个项目的框架中,使用的是默认时间的仿真方式,该方式通过调用NS3核心模块的默认仿真器DefaultSimulatorImpl类来实现,为了保有默认仿真器DefaultSimulatorImpl类的全部功能,通过继承DefaultSimulatorImpl类来创建新的仿真器类ExternallyDrivenSim,之后将会在新类中增添和修改相应的辅助函数,他们将会有助于该新仿真器类的实现;
步骤302:在NS3中的默认仿真器中添加了自定义仿真时间控制模块,该模块允许仿真在每次以前给出过的时间上限时停止,该模块在ExternallyDrivenSim::Run公有函数中实现,通过将现有的仿真事件的时间和在ExternallyDrivenSim类定义的私有属性m_TimeLimit比较,只要仿真事件的时间小于等于m_TimeLimit,那么将会调用私有函数ProcessOneEvent的仿真,当仿真事件的时间大于m_TimeLimit,将会将m_TimeLimit增加一定步长的时间来更新m_TimeLimit的时间上限,之后与MATLAB客户端进行交互发送给MATLAB该段仿真的结果和并从MATLAB接收下一段仿真的节点数据包发送计划,之后再运行新计划仿真事件,通过不断重复该过程,使得仿真时间以及仿真事件受到一定控制的往前推进;
步骤303:创建ExternallyDrivenSim::ExternallyDrivenSim构造函数,它将会在仿真开始前创建ExternallyDrivenSim类对象,在该函数中初始化时间上限m_TimeLimit为0,之后按照NS3的服务器套接字初始化的步骤建立与MATLAB客户端的连接,之后初始化结构体为空;
步骤304:创建ExternallyDrivenSim::Listen私有函数,用于在数据传输阶段通过使用新套接字调用recv函数来接收MATLAB发送过来的数据包通知结构体,并对结构体中的数据进行解析,根据解析的结果使用RunScheduleTransmit函数计划下一次的发送事件;
步骤305:创建ExternallyDrivenSim::GetEventId公有函数,在函数ProcessOneEvent中调用,用于获得正在执行仿真事件的EventId对象的所有信息;
步骤306:创建ExternallyDrivenSim::TransmitNotices公有函数,用于在数据传输阶段让新套接字使用send函数向MATLAB发送数据包通知结构体(NS3的UDP服务器的运行结果);
步骤307:创建ExternallyDrivenSim::Stop公有函数,作为父类对应同名函数的重写(覆盖)函数,当ExternallyDrivenSim::Stop公有函数在NS3仿真脚本中调用时,ExternallyDrivenSim::Stop公有函数将会设定ExternallyDrivenSim类的仿真结束事件的时间属性m_TimeOfEnd,NS3仿真运行时调用的ExternallyDrivenSim对象将会在对应时间计划仿真结束事件来结束整个仿真过程;
步骤308:创建ExternallyDrivenSim::GetNotices公有函数,作为静态函数,使其能够在UDP服务器应用类中调用,ExternallyDrivenSim::GetNotices公有函数收集UDP服务器的运行结果,以此生成将要发送给MATLAB的数据包通知结构体;
步骤309:创建ExternallyDrivenSim::SetEventId公有函数,作为静态函数,使其能够在UDP客户端应用类中调用,ExternallyDrivenSim::SetEventId公有函数将GetEventId函数获得所有事件信息强制类型转换为EventId变量,并返回该EventId变量给EventId类对象m_sendEvent,使得节点服务器知道现在运行的发送事件的EventId,通过该EventId判断正在运行的发送事件是否已经过期;
步骤310:创建ExternallyDrivenSim::GetClient公有函数,利用节点的智能指针返回该节点上UDP客户端应用的普通指针,之后通过该指针调用UdpEchoClientNew::ScheduleTransmit函数计划UDP客户端的发送事件;
步骤311:创建ExternallyDrivenSim::RunScheduleTransmit公有函数,在ExternallyDrivenSim类中调用ExternallyDrivenSim::GetClient函数来获取每个节点上UDP客户端应用的指针,之后通过该指针调用UdpEchoClientNew::ScheduleTransmit函数计划UDP客户端的某次发送事件,计划发送事件的时间与当前NS3仿真运行时间的差值将作为该函数的参数,这里设置为0秒即当前仿真时间执行发送事件;
步骤312:创建ExternallyDrivenSim::ProcessOneEvent私有函数,作为父类对应同名函数,它隐藏了父类同名函数,ExternallyDrivenSim::ProcessOneEvent私有函数用于将事件队列中的事件提取出来并从事件队列中移除,并推进该事件的仿真;
步骤313:创建ExternallyDrivenSim::Run公有函数,作为父类对应函数的重写(覆盖)函数,在ExternallyDrivenSim::Run公有函数中ExternallyDrivenSim类将会调用ProcessOneEvent函数运行所有被计划的事件,并通过使用如步骤302所述的仿真时间控制模块推进仿真;
步骤314:创建ExternallyDrivenSim::SetSimulationStep公有函数,在仿真脚本中被调用,用于设定每次属性m_TimeLimit的时间上限的增加量g_SimulationStep,属性g_SimulationStep作为NS3仿真的周期步长,每当当前仿真时间超过m_TimeLimit时,m_TimeLimit将加上g_SimulationStep作为新的m_TimeLimit;
步骤315:创建ExternallyDrivenSim::DoDispose公有函数,作为父类对应函数的重写(覆盖)函数,ExternallyDrivenSim::DoDispose公有函数会隐式的析构ExternallyDrivenSim类对象,并关闭用于传输数据的新套接字和侦听请求的原始套接字;
(4)改进NS3的UDP应用程序类以及其助手类;
步骤41:设计两个新的类,即UdpEchoClientNew类和UdpEchoServerNew类,来配合ExternallyDrivenSim类运行,默认的UDP应用程序类包括了两个类,分别为UdpEchoClient类和UdpEchoServer类,这两个类适用于在使用默认仿真器DefaultSimulatorImpl类的情况,对于ExternallyDrivenSim类它们缺乏相应的功能因此无法有效的运行,因此通过继承这两个类,设计了两个新的类UdpEchoClientNew类和UdpEchoServerNew类来配合ExternallyDrivenSim类运行;
步骤42:创建UdpEchoClientNew::StartApplication函数,作为父类对应函数的重写(覆盖)函数,对于UdpEchoClientNew::StartApplication函数的修改如下:T1.不需要在应用程序启动时传输第一个数据包,因此不再需要启动函数调用:ScheduleTransmit(Seconds(0.));T2.新的应用程序不需要等待服务器回复,因此不再需要启动函数调用:
m_socket->SetRecvCallback(MakeCallback(&UdpEchoClientNew::HandleRead,this));
步骤43:创建UdpEchoClientNew::send函数,作为父类对应同名函数,它隐藏了父类同名函数,其功能为使UDP客户端执行数据包发送事件,对于UdpEchoClientNew::send函数的修改如下:首先当UdpEchoClientNew::send函数运行时,没有必要计划新的事件,函数调用ScheduleTransmit(m_interval);不再被使用;其次每次调用此函数时,将ExternallyDrivenSim::SetEventId的值分配给变量m_sendEvent,该变量将会用来判断当前发送事件是否已经过期;
步骤44:创建UdpEchoServerNew::HandleRead函数,作为父类对应同名函数,它隐藏了父类同名函数,UdpEchoServerNew::HandleRead函数功能为使UDP服务器端处理发送从客户端发送过来的数据包,启动静态函数调用ExternallyDrivenSim::GetNotices,用于将该使UDP服务器接收到的数据包生成发送给MATLAB的通知,同时.新的应用程序也不需要发送服务器回复数据包;
步骤45:创建这两个新类的构造函数和析构函数,函数体为空;
步骤46:通过继承创建了新的类UdpEchoNewHelper,是NS3的应用程序助手类UdpEchoHelper的子类,通过UdpEchoNewHelper类可以在仿真脚本中安装以上两种新的应用程序类,UdpEchoNewHelper类的修改主要是将相应的助手类的类名进行替换为新类的助手类的类名,以及通过带参构造函数继承的方式创建UdpEchoNewHelper类中的构造函数。
本发明的优点是:提出了一种基于TCP协议的NS3与MATLAB集成的联合仿真接口,做到两款仿真软件之间的初步的交互,为设计一种精确仿真NCS的仿真软件打下良好的基础。
附图说明
图1:本发明方法的模型示意图。
图2:本发明ExternallyDrivenSim类的仿真时间控制模块运行流程图。
图3:本发明实施例1的仿真场景示意图。
具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合附图和实施例对本发明作进一步的详细描述。
实施例1:
为了检验该联合仿真接口的运行的有效性,我们编写了一个NS3的仿真脚本程序,在脚本中使用了新仿真器类ExternallyDrivenSim以及配套的应用程序类,并定义了两个节点的网络拓扑,在两节点上安装有新的UDP客户端和UDP服务器。模拟的场景为这两个节点之间以ExternallyDrivenSim的属性仿真周期步长g_SimulationStep周期性的发送数据包,同时也可以模拟某个节点非周期性的随机发送数据包的场景,并在脚本中设置仿真的总时长为20秒,仿真周期步长g_SimulationStep为200毫秒,发送数据包的大小通过应用程序助手类进行设置。MATLAB客户端发送的通知结构体包含这两个节点的发送数据包的触发信号,该结构体包含一个长度为2的int数组,数组索引0代表的分量为节点索引为0的节点的触发信号,同理索引1代表节点索引为1节点的,这些触发信号将会触发这两个节点的发送数据包事件的计划(非0为数据包发送,0为数据包不发送),并当事件执行时调用客户端的发送函数来发送数据包,如果某个节点的触发信号一直为非0,那么数据包的发送将会随仿真周期步长周期性的发送,如果触发信号为0和非0之间随机切换的信号,那么数据包的发送将会是非周期性的,当两节点的触发信号都为0时,可以确定这段交互时间间隔内将两节点都不会发送数据包,因而两节点在这段时间内将会无所事事。对于NS3发送给MATLAB的通知结构体,包含有这两个节点接收数据包的感知信号,该结构体同样包含长度为2的int数组,数组索引也分别代表的对应节点的感知信号,这些感知信号能让MATLAB知晓NS3在每一段交互的间隔内的各节点的数据包接收情况(非0为接收到了数据包,0为没有接收到数据包)。仿真的运行结果证明了本联合仿真接口的有效性,NS3通过接收MATLAB的通知结构体模拟了对应的仿真场景,两个节点之间能够周期性或非周期性的发送数据包并接收,并让MATLAB获悉NS3的运行情况,同时通过使用ExternallyDrivenSim类中的自定义仿真时间控制模块,NS3的仿真能够在时间受控的情况下不断推进。这只是将网络仿真软件NS3连接到MATLAB环境的第一步。
本说明书实施例所述的内容仅仅是对发明构思的实现形式的列举,本发明的保护范围不应当被视为仅限于实施例所陈述的具体形式,本发明的保护范围也及于本领域技术人员根据本发明构思所能够想到的等同技术手段。
Claims (1)
1.一种基于TCP协议的NS3与MATLAB集成的联合仿真接口方法,含有以下步骤:
(1)在linux操作系统中搭建两种仿真软件的运行环境;
步骤11:选择合适的linux操作系统;
由于NS3的运行环境为linux操作系统,选择基于Debian GNU/Linux发行版的计算机操作系统Ubuntu运行NS3,Ubuntu拥有良好的可视化界面和便于软件开发的IDE,选择安装的Ubuntu操作系统版本为16.04LTS;
步骤12:安装MATLAB 2011b UNIX版;
步骤13:安装NS3网络仿真软件;
NS3是一个离散事件网络仿真软件,由仿真核心和模型组成,并以C++程序实现,NS3被构建为一个C++库,可以静态或动态地链接到定义模拟拓扑并启动仿真软件运行C++外部脚本主程序,以此来运行该网络的仿真,选择安装的NS3版本为3.27;
步骤14:安装C++版本的Eclipse并对NS3进行配置;
由于NS3本质为一个C++库,所以为了能够方便的对NS3中的程序进行修改,安装了C++版本的Eclipse,并对NS3进行相关配置,配置步骤如下:1.在Eclipse中新建C++的空项目工程,将ns-3.27文件夹拷贝到这个工程下面,刷新项目并需要先在Eclipse终端中运行NS3配置指令./waf configure;2.右键工程,选择属性(properties),在build中(C++Build)进行修改,选择builder类型为External builder,build命令选择编译NS3程序的waf编译器所在的路径,比如:${workspace_loc:/ns3/ns-3.27/waf},其中:workspace_loc是指工程所在的路径;build的目录就选择NS3对应的目录,比如:${workspace_loc:/ns3/ns-3.27/build};3.外部编译器的配置,也就是NS3使用的waf编译器的配置,在运行--外部工具--外部工具配置(run-external tools-external tools configurations)中,位置(location)是waf的路径,比如:${workspace_loc:/ns3/ns-3.27/waf},工作目录(workingderectory)是NS3所在的目录,比如:${workspace_loc:/ns3/ns-3.27},自变量(arguments),填:--run"${string_prompt}",用户输入执行的C++文件,就是输入的参数;4.调试:NS3可以使用Eclipse调试,也可以使用通过终端调用gdb来进行调试,在Eclipse中调试步骤为:右键工程,选择属性(properties),选择调试的配置(run/debug settings),创建一个新的加载配置,选择你刚刚生成的文件project,选择环境设置栏(environment),新建一个环境变量,变量名(name)为:LD_LIBRARY_PATH,变量值(value)为build的路径:${workspace_loc:/ns3/ns-3.27/build},之后选择Main栏,在C/C++Application中填写build文件夹下需要调试的已经通过编译器waf成功的目标文件,比如:build/scratch/third,另外也可已通过gdb来调试NS3程序,在ns-3.27文件夹中打开终端,输入指令比如:
$./waf--run=hello-simulator--command-template="gdb%s--args<args>",
执行后将会以调试状态运行hello-simulator程序;
(2)通过TCP协议建立两个仿真软件之间的交互接口;
步骤21:在MATLAB和NS3中编写了客户端和服务器程序,其中MATLAB作为主控方,NS3作为被控方,仿真软件的交互是通过使用Berkley的TCP协议完成的,两个仿真软件之间通过TCP协议套接字建立连接,使其为两个仿真软件间通信IPC提供强大和灵活的机制,因此在MATLAB和NS3编写的程序中都创建了一个新的TCP套接字,创建套接字的代码为socket=socket(AF_INET,SOCK_STREAM,0);之后两个仿真软件轮流作为数据处理方,仿真运行的主体在两者之间反复切换,通过这种交替运行的方式驱动仿真;
步骤22:对于MATLAB的客户端的套接字,在数据传输之前,使用connect函数用于客户端套接字对NS3发起会话连接功能,代码为connect(sock,(struct sockaddr*)&addr,sizeof(addr),sock为MATLAB客户端创建的TCP套接字,addr是一个结构体指针,其中包括目标服务器的地址和端口号,其中目标服务器IP为0x7f000001,即本机的IP地址(由于NS3服务器也运行在同一台计算机上),发送目标服务器端口号为3425(NS3服务器占用该端口);
步骤23:使用NS3的服务器套接字,具体包括:S1.首先套接字使用使用bind函数与选定域中的地址绑定,代码为bind(listener,(struct sockaddr*)&addr,sizeof(addr)),listener为服务器创建的TCP套接字,addr包括服务器的侦听的客户端地址和服务器的端口号,其中侦听的客户端地址为htonl(INADDR_ANY),即服务器侦听所有客户端发起的会话请求,端口号为3425,S2.使用listen函数用于服务器套接字开启侦听会话连接功能,代码为listen(listener,1),等待连接队列的最大长度设为1,S3.当服务器侦听到合适的请求,使用accept函数接受客户端发起的会话连接,并创建一个用于与MATLAB客户端进行数据传输的新套接字,如果该函数调用还处于监听模式socket之下,原始套接字可以提供其他连接;
步骤24:在客户端和服务器中都使用send数据发送函数和recv数据接收函数,当会话连接被服务器接收后,即可开始数据包的传输,传输的数据类型为被指定的结构体,该结构体可以根据两个仿真软件之间需要交互的信息而具体更改,初步包括了节点的发送触发信号和接收感知信号在该结构体中,
(3)改进NS3的默认仿真器;
步骤301:为了能够让MATLAB外部驱动NS3仿真,通过继承DefaultSimulatorImpl类创建了一个新仿真器类ExternallyDrivenSim,在NS3中,默认情况下只有两种时间关系:实时(所有仿真事件在现实生活中随着时间的推移而发生的)与默认时间(所有的仿真事件随着时间的推移尽可能快地发生在计算机上),由于NS3是离散时间仿真软件,当选择默认时间仿真方式,仿真在实验的极限下不可能在必要时刻停止,在这个项目的框架中,使用的是默认时间的仿真方式,该方式通过调用NS3核心模块的默认仿真器DefaultSimulatorImpl类来实现,为了保有默认仿真器DefaultSimulatorImpl类的全部功能,通过继承DefaultSimulatorImpl类来创建新的仿真器类ExternallyDrivenSim,之后将会在新类中增添和修改相应的辅助函数,他们将会有助于该新仿真器类的实现;
步骤302:在NS3中的默认仿真器中添加了自定义仿真时间控制模块,该模块允许仿真在每次以前给出过的时间上限时停止,该模块在ExternallyDrivenSim::Run公有函数中实现,通过将现有的仿真事件的时间和在ExternallyDrivenSim类定义的私有属性m_TimeLimit比较,只要仿真事件的时间小于等于m_TimeLimit,那么将会调用私有函数ProcessOneEvent的仿真,当仿真事件的时间大于m_TimeLimit,将会将m_TimeLimit增加一定步长的时间来更新m_TimeLimit的时间上限,之后与MATLAB客户端进行交互发送给MATLAB该段仿真的结果和并从MATLAB接收下一段仿真的节点数据包发送计划,之后再运行新计划仿真事件,通过不断重复该过程,使得仿真时间以及仿真事件受到一定控制的往前推进;
步骤303:创建ExternallyDrivenSim::ExternallyDrivenSim构造函数,它将会在仿真开始前创建ExternallyDrivenSim类对象,在该函数中初始化时间上限m_TimeLimit为0,之后按照NS3的服务器套接字初始化的步骤建立与MATLAB客户端的连接,之后初始化结构体为空;
步骤304:创建ExternallyDrivenSim::Listen私有函数,用于在数据传输阶段通过使用新套接字调用recv函数来接收MATLAB发送过来的数据包通知结构体,并对结构体中的数据进行解析,根据解析的结果使用RunScheduleTransmit函数计划下一次的发送事件;
步骤305:创建ExternallyDrivenSim::GetEventId公有函数,在函数ProcessOneEvent中调用,用于获得正在执行仿真事件的EventId对象的所有信息;
步骤306:创建ExternallyDrivenSim::TransmitNotices公有函数,用于在数据传输阶段让新套接字使用send函数向MATLAB发送数据包通知结构体(NS3的UDP服务器的运行结果);
步骤307:创建ExternallyDrivenSim::Stop公有函数,作为父类对应同名函数的重写(覆盖)函数,当ExternallyDrivenSim::Stop公有函数在NS3仿真脚本中调用时,ExternallyDrivenSim::Stop公有函数将会设定ExternallyDrivenSim类的仿真结束事件的时间属性m_TimeOfEnd,NS3仿真运行时调用的ExternallyDrivenSim对象将会在对应时间计划仿真结束事件来结束整个仿真过程;
步骤308:创建ExternallyDrivenSim::GetNotices公有函数,作为静态函数,使其能够在UDP服务器应用类中调用,ExternallyDrivenSim::GetNotices公有函数收集UDP服务器的运行结果,以此生成将要发送给MATLAB的数据包通知结构体;
步骤309:创建ExternallyDrivenSim::SetEventId公有函数,作为静态函数,使其能够在UDP客户端应用类中调用,ExternallyDrivenSim::SetEventId公有函数将GetEventId函数获得所有事件信息强制类型转换为EventId变量,并返回该EventId变量给EventId类对象m_sendEvent,使得节点服务器知道现在运行的发送事件的EventId,通过该EventId判断正在运行的发送事件是否已经过期;
步骤310:创建ExternallyDrivenSim::GetClient公有函数,利用节点的智能指针返回该节点上UDP客户端应用的普通指针,之后通过该指针调用UdpEchoClientNew::ScheduleTransmit函数计划UDP客户端的发送事件;
步骤311:创建ExternallyDrivenSim::RunScheduleTransmit公有函数,在ExternallyDrivenSim类中调用ExternallyDrivenSim::GetClient函数来获取每个节点上UDP客户端应用的指针,之后通过该指针调用UdpEchoClientNew::ScheduleTransmit函数计划UDP客户端的某次发送事件,计划发送事件的时间与当前NS3仿真运行时间的差值将作为该函数的参数,这里设置为0秒即当前仿真时间执行发送事件;
步骤312:创建ExternallyDrivenSim::ProcessOneEvent私有函数,作为父类对应同名函数,它隐藏了父类同名函数,ExternallyDrivenSim::ProcessOneEvent私有函数用于将事件队列中的事件提取出来并从事件队列中移除,并推进该事件的仿真;
步骤313:创建ExternallyDrivenSim::Run公有函数,作为父类对应函数的重写(覆盖)函数,在ExternallyDrivenSim::Run公有函数中ExternallyDrivenSim类将会调用ProcessOneEvent函数运行所有被计划的事件,并通过使用如步骤302所述的仿真时间控制模块推进仿真;
步骤314:创建ExternallyDrivenSim::SetSimulationStep公有函数,在仿真脚本中被调用,用于设定每次属性m_TimeLimit的时间上限的增加量g_SimulationStep,属性g_SimulationStep作为NS3仿真的周期步长,每当当前仿真时间超过m_TimeLimit时,m_TimeLimit将加上g_SimulationStep作为新的m_TimeLimit;
步骤315:创建ExternallyDrivenSim::DoDispose公有函数,作为父类对应函数的重写(覆盖)函数,ExternallyDrivenSim::DoDispose公有函数会隐式的析构ExternallyDrivenSim类对象,并关闭用于传输数据的新套接字和侦听请求的原始套接字;
(4)改进NS3的UDP应用程序类以及其助手类;
步骤41:设计两个新的类,即UdpEchoClientNew类和UdpEchoServerNew类,来配合ExternallyDrivenSim类运行,默认的UDP应用程序类包括了两个类,分别为UdpEchoClient类和UdpEchoServer类,这两个类适用于在使用默认仿真器DefaultSimulatorImpl类的情况,对于ExternallyDrivenSim类它们缺乏相应的功能因此无法有效的运行,因此通过继承这两个类,设计了两个新的类UdpEchoClientNew类和UdpEchoServerNew类来配合ExternallyDrivenSim类运行;
步骤42:创建UdpEchoClientNew::StartApplication函数,作为父类对应函数的重写(覆盖)函数,对于UdpEchoClientNew::StartApplication函数的修改如下:T1.不需要在应用程序启动时传输第一个数据包,因此不再需要启动函数调用:ScheduleTransmit(Seconds(0.));T2.新的应用程序不需要等待服务器回复,因此不再需要启动函数调用:
m_socket->SetRecvCallback(MakeCallback(&UdpEchoClientNew::HandleRea d,this));
步骤43:创建UdpEchoClientNew::send函数,作为父类对应同名函数,它隐藏了父类同名函数,其功能为使UDP客户端执行数据包发送事件,对于UdpEchoClientNew::send函数的修改如下:首先当UdpEchoClientNew::send函数运行时,没有必要计划新的事件,函数调用ScheduleTransmit(m_interval);不再被使用;其次每次调用此函数时,将ExternallyDrivenSim::SetEventId的值分配给变量m_sendEvent,该变量将会用来判断当前发送事件是否已经过期;
步骤44:创建UdpEchoServerNew::HandleRead函数,作为父类对应同名函数,它隐藏了父类同名函数,UdpEchoServerNew::HandleRead函数功能为使UDP服务器端处理发送从客户端发送过来的数据包,启动静态函数调用ExternallyDrivenSim::GetNotices,用于将该使UDP服务器接收到的数据包生成发送给MATLAB的通知,同时.新的应用程序也不需要发送服务器回复数据包;
步骤45:创建这两个新类的构造函数和析构函数,函数体为空;
步骤46:通过继承创建了新的类UdpEchoNewHelper,是NS3的应用程序助手类UdpEchoHelper的子类,通过UdpEchoNewHelper类可以在仿真脚本中安装以上两种新的应用程序类,UdpEchoNewHelper类的修改主要是将相应的助手类的类名进行替换为新类的助手类的类名,以及通过带参构造函数继承的方式创建UdpEchoNewHelper类中的构造函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811396214.XA CN109598040B (zh) | 2018-11-22 | 2018-11-22 | 基于tcp协议的ns3与matlab集成的联合仿真接口方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811396214.XA CN109598040B (zh) | 2018-11-22 | 2018-11-22 | 基于tcp协议的ns3与matlab集成的联合仿真接口方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109598040A true CN109598040A (zh) | 2019-04-09 |
CN109598040B CN109598040B (zh) | 2023-04-07 |
Family
ID=65960341
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811396214.XA Active CN109598040B (zh) | 2018-11-22 | 2018-11-22 | 基于tcp协议的ns3与matlab集成的联合仿真接口方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109598040B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110233824A (zh) * | 2019-05-09 | 2019-09-13 | 中国航空工业集团公司西安航空计算技术研究所 | 一种系统仿真方法 |
CN110445642A (zh) * | 2019-07-17 | 2019-11-12 | 陕西千山航空电子有限责任公司 | 一种跨总线维护飞参系统的通讯方法 |
CN110457747A (zh) * | 2019-07-02 | 2019-11-15 | 浙江工业大学 | 一种基于ns3和matlab的网络化控制系统协同仿真方法 |
CN112181445A (zh) * | 2020-08-28 | 2021-01-05 | 深圳市华讯方舟光电技术有限公司 | 一种提升电磁仿真软件运算效率的方法、终端和存储介质 |
CN112230606A (zh) * | 2020-10-29 | 2021-01-15 | 上海工程技术大学 | 一种基于matlab应用程序接口控制nao机器人运动的方法 |
CN112699515A (zh) * | 2021-01-06 | 2021-04-23 | 浙江工业大学 | 一种基于tcp套接字的scilab与ns3协同仿真接口方法 |
CN113139281A (zh) * | 2021-04-12 | 2021-07-20 | 浙江工业大学 | 一种基于xcos和ns3的协同仿真时间同步方法 |
CN117527610A (zh) * | 2024-01-05 | 2024-02-06 | 南京信息工程大学 | 一种基于ns3网络仿真平台的数据链仿真方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102622262A (zh) * | 2012-01-09 | 2012-08-01 | 华中科技大学 | 基于modelica建模语言的分布式实时交互仿真系统 |
CN102970176A (zh) * | 2012-09-19 | 2013-03-13 | 东莞中山大学研究院 | 一种基于ns2的p2p流媒体仿真系统 |
CN108366089A (zh) * | 2018-01-08 | 2018-08-03 | 南京邮电大学 | 一种基于内容流行度和节点重要度的ccn缓存方法 |
-
2018
- 2018-11-22 CN CN201811396214.XA patent/CN109598040B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102622262A (zh) * | 2012-01-09 | 2012-08-01 | 华中科技大学 | 基于modelica建模语言的分布式实时交互仿真系统 |
CN102970176A (zh) * | 2012-09-19 | 2013-03-13 | 东莞中山大学研究院 | 一种基于ns2的p2p流媒体仿真系统 |
CN108366089A (zh) * | 2018-01-08 | 2018-08-03 | 南京邮电大学 | 一种基于内容流行度和节点重要度的ccn缓存方法 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110233824A (zh) * | 2019-05-09 | 2019-09-13 | 中国航空工业集团公司西安航空计算技术研究所 | 一种系统仿真方法 |
CN110457747A (zh) * | 2019-07-02 | 2019-11-15 | 浙江工业大学 | 一种基于ns3和matlab的网络化控制系统协同仿真方法 |
CN110457747B (zh) * | 2019-07-02 | 2023-04-07 | 浙江工业大学 | 一种基于ns3和matlab的网络化控制系统协同仿真方法 |
CN110445642A (zh) * | 2019-07-17 | 2019-11-12 | 陕西千山航空电子有限责任公司 | 一种跨总线维护飞参系统的通讯方法 |
CN112181445A (zh) * | 2020-08-28 | 2021-01-05 | 深圳市华讯方舟光电技术有限公司 | 一种提升电磁仿真软件运算效率的方法、终端和存储介质 |
CN112230606A (zh) * | 2020-10-29 | 2021-01-15 | 上海工程技术大学 | 一种基于matlab应用程序接口控制nao机器人运动的方法 |
CN112699515A (zh) * | 2021-01-06 | 2021-04-23 | 浙江工业大学 | 一种基于tcp套接字的scilab与ns3协同仿真接口方法 |
CN112699515B (zh) * | 2021-01-06 | 2024-05-03 | 浙江工业大学 | 一种基于tcp套接字的scilab与ns3协同仿真接口方法 |
CN113139281A (zh) * | 2021-04-12 | 2021-07-20 | 浙江工业大学 | 一种基于xcos和ns3的协同仿真时间同步方法 |
CN117527610A (zh) * | 2024-01-05 | 2024-02-06 | 南京信息工程大学 | 一种基于ns3网络仿真平台的数据链仿真方法 |
CN117527610B (zh) * | 2024-01-05 | 2024-03-19 | 南京信息工程大学 | 一种基于ns3网络仿真平台的数据链仿真方法 |
Also Published As
Publication number | Publication date |
---|---|
CN109598040B (zh) | 2023-04-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109598040A (zh) | 基于tcp协议的ns3与matlab集成的联合仿真接口方法 | |
CN109802852B (zh) | 应用于网络靶场的网络仿真拓扑的构建方法及系统 | |
Siraj et al. | Network simulation tools survey | |
Ahrenholz | Comparison of CORE network emulation platforms | |
CN108460199B (zh) | Cni建模系统 | |
CN110838954A (zh) | 一种轻量级大规模自主网络协议功能测试方法 | |
Mozumdar et al. | HILAC: A framework for hardware in the loop simulation and multi-platform automatic code generation of WSN applications | |
Kraemer et al. | Aligning UML 2.0 state machines and temporal logic for the efficient execution of services | |
US6321347B1 (en) | Network testing system and method | |
CN103634290B (zh) | 网络仿真系统 | |
Fantom et al. | A NEAT way to test-driven network management | |
RAJA | Study of various network simulators | |
Kraemer et al. | Compositional service engineering with arctis | |
CN112737815B (zh) | 一种动态配置网络模拟器事件队列的方法及系统 | |
Nguyen et al. | A process for continuous validation of self-adapting component based systems | |
Klein | Dianemu: A java based generic simulation environment for distributed protocols | |
Blumenthal et al. | Senets-test and validation environment for applications in large-scale wireless sensor networks | |
Herberg et al. | Development Framework for Supporting Java NS2 Routing Protocols | |
Schappacher et al. | VTENN—A virtualized testbed for embedded networking nodes | |
Kachan | Integration of NS-3 with MATLAB/Simulink | |
Roverso et al. | Myp2pworld: Highly reproducible application-level emulation of p2p systems | |
Lyons | Developing and debugging real-time software with objectime developer | |
Schappacher et al. | Virtualization of Embedded Nodes for Network System Characterization in IoT Applications | |
Saifan et al. | Run-time conformance checking of mobile and distributed systems using executable models | |
Thillen et al. | Isolated testing of software components in distributed software systems |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |