当需要QualNet与外部程序通信时,可以使用外部接口。QualNet自带的GUI接口用于可视化仿真,SOCKET接口用于传输数据,还提供了interfacetutorial接口演示接口的设计与实现。以下介绍外部接口的注册与使用,并提供自定义接口步骤供参考。
1 接口注册
1.1 注册函数
~/main/external.cpp中定义函数EXTERNAL_UserFunctionRegistration,由内核在仿真开始时调用。此函数用于注册外部接口(通过调用EXTERNAL_RegisterExternalInterface函数)和由接口实现的回调函数(通过调用EXTERNAL_RegisterFunction函数)。
(1)EXTERNAL_RegisterExternalInterface:此函数向QualNet注册一个新的外部接口,并创建必要的数据结构。此函数必须在需要外部接口作为参数的任何其他函数之前调用。
EXTERNAL_Interface* EXTERNAL_RegisterExternalInterface(
EXTERNAL_InterfaceList *list,
char *name,
EXTERNAL_PerformanceParameters params,
ExternalInterfaceType type);
参数:
list:外部接口列表,一般用&node->partitionData->interfaceList。
name:外部接口名称,随意起。
params:性能参数。当前不支持任何性能参数,因此传递EXTERNAL_NONE。
type:外部接口类型,在external.h中由enum ExternalInterfaceType列出。
返回值:指向新注册外部接口的指针。
(2)EXTERNAL_RegisterFunction:该函数为外部接口注册回调函数。
void EXTERNAL_RegisterFunction(
EXTERNAL_Interface *iface,
EXTERNAL_FunctionType type,
EXTERNAL_Function function);
参数:
type:函数类型,在external.h中由enum EXTERNAL_FunctionType列出。
function:调用函数的指针,注册时该参数前用(EXTERNAL_Function)强制类型转换。
一旦注册了接口及其回调函数,QualNet就开始使用该接口。QualNet根据需要调用已注册的回调函数。
1.2 回调函数
接口开发者通过提供执行某些任务的回调函数来确定外部接口的行为。接口开发者可以有八个回调函数(在external.h中由enum ExternalInterfaceType列出)可选。外部接口可能不需要所有八个回调函数,在这种情况下,接口只需要实现和注册它需要的函数。QualNet按需要调用注册的回调函数。
回调函数有:
(1)Initialize:这是在创建节点和协议之前调用的初始化函数。此函数用于设置数据结构,并初始化仿真所需的服务。
void InterfaceInitializeFunction(
EXTERNAL_Interface *iface,
NodeInput *nodeInput)
参数:
iface:接口结构。
nodeInput:节点输入数据结构,包含配置信息。
(2)InitializeNodes:这是在创建节点和协议之后调用的初始化函数。此函数将在仿真开始之前立即调用。这个函数用于建立独立的单个节点或协议,以便与外部接口交互操作。此外,接口可能初始化用于时间管理的数据(如在外部时间和仿真时间之间建立关联)。
void InterfaceInitializeNodesFunction(
EXTERNAL_Interface *iface,
NodeInput *nodeInput)
(3)Time:调用此函数来查询外部接口的时间。
clocktype InterfaceTimeFunction(EXTERNAL_Interface *iface)
返回值:外部实体的当前时间(以纳秒为单位)。0对应于仿真的开始。
(4)SimulationHorizon:这个函数由内核调用,以查询外部接口的仿真视界。仿真视界的值控制着仿真时钟的前进。接口增加视界,表示仿真时钟可以向前移动。内核执行小于并朝向视界的事件。一旦仿真到达视界,执行一个循环,在该循环中它调用此函数和接收函数(下面解释),直到视界再次被推进以允许执行更多的事件。
void InterfaceSimul