1.一种基于TCP套接字的SCILAB与NS3协同仿真接口方法,含有以下步骤:
(1)安装和配置SCILAB和NS3软件;
步骤11:安装Linux操作系统;
选择安装Ubuntu版本为Ubuntu20.04 LTS;
步骤12:安装科学工程计算软件SCILAB;
安装SCILAB 6.1.0Linux 64bits版;
步骤13:安装网络仿真软件NS3;
安装NS3的版本为ns‑3.31;
步骤14:编译仿真软件NS3;
由于NS3没有图形用户界面,要使用NS3进行网络模拟,需要经过以下步骤:下载源代码、编译源代码、编写模拟脚本和运行模拟脚本;
源代码的下载需要登录NS3的官方网站,之后需要对Ubuntu系统进行配置,使用Ubuntu系统终端命令apt‑get install安装NS3运行必备的包,这些安装包包括gcc g++Python、mercurial、bzr NS3运行需要的环境,之后运行配置命令“./waf configure‑‑build‑profile=debug‑‑enable‑examples‑‑enable‑tests”打开debug并开启例子及帮助,之后运行命令./waf build进行构建,输入命令“./test.py‑c core”进行测试NS3是否安装完整,输入命令“./waf–run hello‑simulator”运行模拟脚本例子来测试NS3是否编译完成;
(2)编写SCILAB接口程序;
步骤21:SCILAB与NS3协同仿真中需要交换数据,通过编写基于TCP的套接字接口程序实现SCILAB与NS3的通信;SCILAB本身不具备套接字功能,需要通过SCILAB 6版本内部提供的访问api_scilab来将C或C++扩展程序写入SCILAB,它允许定义本机函数gateway,获取此类函数的输入参数,设置返回参数,访问局部变量,使用通用的辅助函数访问环境信息,其中环境信息包括错误信息和警告信息,通过扩展的C或C++程序,可以实现SCILAB内部变量与其他应用程序的数据交换;
步骤22:编写SCILAB内包含套接字的C++扩展程序;
扩展程序需要实现从SCILAB读取变量信息且能够发送给其他的程序的功能,需要创建C++结构体以承载交互信息,命令mexGetVariable能够获取SCILAB的变量信息,而将外部的数据输入到SCILAB则需要通过C++扩展程序的文件读取功能,具体包括NS3发送的信息通过TCP套接字扩展程序接收并将数据写入到txt文件中,SCILAB通过读取这些文件,将其中的数据赋给具体的变量供图形仿真模块XCOS使用,XCOS读取SCILAB工作空间的变量值来运行仿真,仿真完成后输出的值传递到SCILAB工作空间,SCILAB将接收来自XCOS值通过C++扩展程序发送给NS3,NS3使用这些数据信息进行仿真,仿真完成后将仿真结果通过NS3内的TCP套接字发送给SCILAB扩展程序,通过不断循环以上过程来完成SCILAB和NS3的协同仿真;
(3)NS3内接口程序的编写;
步骤31:NS3接口程序包含双向通信功能;
通过对NS3内核的修改,可实现从SCILAB接收数据后自动运行仿真,仿真完成后自动将数据发送给SCILAB的过程;
步骤32:NS3模拟脚本的编写;
脚本程序包含NS3的头文件,core模块、network模块、internet模块、applications模块以及内核驱动模块,包含网络拓扑的建立、安装网络协议、安装应用程序、启动与结束的Run和Stop;
步骤33:内核驱动模块的修改:
模拟脚本通过Run来驱使内核驱动模块工作,内核驱动模块内编写了通信模块,通信模块是一个与外部信息交换的接口,基于TCP协议的套接字编写,NS3通过此接口进行SCILAB通信,将通信接口嵌入到NS3仿真过程中,仿真过程中需要与SCILAB通信时调用此接口,NS3仿真过程包括:通过通信接口获取需要执行的事件、准备事件列表、从事件列表取下一个事件的指针、判断下一个事件是否超过仿真设定的时间、从事件列表不断取下一个事件、运行ProcessOneEvent推进仿真、仿真完成调用通信接口将结果发送给SCILAB;
(4)SCILAB内接口编程;
步骤41:设计初始化并启动NS3的程序;
通过在SCILAB内系统接口调用Linux命令启动并初始化NS3,初始化NS3节点个数nodenumber=4,NS3的模拟脚本命名为ExternallyTest,由于需要给已经编译过的NS3重新赋节点数,所以每次启动协同仿真前需要使用命令unix('gnome‑terminal‑‑./waf‑‑run”scratch/ExternallyTest”')启动并重新编译NS3;
步骤42:在SCILAB编译C++扩展程序:
先给出需要扩展程序传送的数据包的具体内容,设定变量packetdata和packedatae用于传递数据包的内容,C++扩展程序命名为CLIENT,使用命令ilib_mex_build('libmex',['main','CLIENT','cmex'],[],[],”,”,”,”)编译CLIENT名字的C++文件,编译完成后通过名为main的命令进行调用扩展程序,实现SCILAB内变量信息传递给NS3的,从NS3接收仿真数据并存入指定的文件中;
步骤43:编写XCOS模型驱动程序:
在SCILAB中使用命令loadmatfile从指定的文件中读取数据并存入变量in1和in2,这两个变量属于XCOS需要的输入数据,XCOS模型通过FROMWORKSPACE和TOWORKSPACE模块实现与SCILAB工作空间的数据交换,命令xcos(“xcos模型路径”)打开搭建好的模型,命令[result]=importXcosDiagram(模型路径)和xcos_simulate(scs_m,4)启动并运行XCOS模型;
步骤44:搭建XCOS模型包含两个FROMWORKSPACE和两个TOWORKSPACE功能模块,XCOS模型可看为两大部分,控制模块和包含被控对象、执行器和传感器的模块,这两个模块在NS3内被模拟为两个节点;FROMWORKSPACE和TOWORKSPACE分别嵌入到控制器模块和执行器被控对象和传感器的模块中;将控制器模块包含一个FROMWORKSPACE命名为in1和一个TOWPRKSPACE命名为out1,执行器及传感器功能模块包含一个FROMWORKSPACE命名为in2和一个TOWORKSPACE命名为out2,负责XCOS模型与SCILAB工作空间的数据传递;
(5)编写SCILAB联合仿真循环程序:
交互一次会驱动SCILAB和NS3仿真一轮,即SCILAB和NS3把接收到的一轮数据进行模拟,并得到一轮结果输出;要驱动协同仿真运行需要的轮数,就需要NS3与SCILAB工作区间以及XCOS仿真模块持续交换数据,进行多轮仿真;
步骤501:设置临时变量temp1和temp2,用于临时存放NS3接收的延迟数据信息;
步骤502:设置临时变量variable,用于临时存放NS3接收的数据包node2receive的内容信息;
步骤503:设置步数变量t,初始值为0,是循环运行仿真的次数;
步骤504:设置while主循环函数,给定t设定值;
步骤505;XCOS输出数据变量out1和out2赋给packetdata和packetdatae;
步骤506:运行一次在SCILAB编译过的扩展程序,运行命令main,启动扩展程序,将packetdata和packetdatae发送给NS3,同时接收NS3上次仿真的结果,存放到node1receive.txt和node2receive.txt文件中;
步骤507:命令loadmatfile从node1receive.txt和node2receive.txt文件中读取的数据,存入in1和in2中,作为XCOS的输入数据值;
步骤508:命令[result]=importXcosDiagram和xcos_simulate(scs_m,4)启动XCOS;
XCOS开始运行后,从SCILAB工作空间读取in1和in2的值并开始仿真;
步骤509:命令loadmatfile从node1receive_delay.txt和node2receive_delay.txt读取延迟信息赋给中间变量midnumber1和midnumber2;
步骤510:运行命令temp1=[temp1,midnumber1]和temp2=[temp2,midnumber2]将每次运行得到的延迟信息保留下来;
步骤511:命令fprintfMat将temp1和temp2分别放入名字为delay1.txt和delay2.txt的文件中;
步骤512:命令variable=[variable,in2],将每次运行的node2receive信息保存下来;
步骤513:命令fprintfMat将variable放入名字为state.txt的文件中;
步骤514:用end结束循环;
步骤515:设置x作为横坐标,运行命令loadmatfile(delay1)和loadmatfile(delay2),获得的延迟值分别赋给y1和y2,命令plot(t,y1)和plot(t,y2)分别画出两个节点的延迟分布图,运行命令loadmatfile(state)获取状态量赋值给y3,plot(t,y3)画出系统响应图。