为了处理多个连接,每个连接承载不同类型的信息,GigE Vision引入了“通道”的概念。通道是用于在GigE视觉实体之间传输信息的虚拟链接。GigE Vision支持三种类型的频道:
1、控制通道(主应用程序始终有一条控制通道);
2、流通道(0-512个流通道);
3、消息通道(0或者一个消息通道)。
不同的通道可以使用相同的网络接口。下面两个图第一个是简单用例,第二个是高级用例:
控制通道用来应用程序和设备进行交互,GVCP有两种类型的控制通道:
主控制通道:是由主应用程序创建,主应用程序是允许写入设备寄存器的应用程序,只允许一个应用程序作为设备的主应用程序。
辅助控制通道:辅助控制通道可由任何辅助应用程序创建。辅助应用程序只能读设备寄存器,不能写,这可用来监控和调试,一个设备可支持多个辅助应用程序,也支持没有辅助控制通道。
即使只支持一个主应用程序,也可以使用UDP广播或多播向/从多个接收方发送/接收图像或数据流。但是所有流都是在主应用程序的控制之下(PACKTRESEND请求除外)。
设备必须回应设备发现请求,即使这个请求不是从主应用程序发出。
在创建流或消息通道之前,必须实例化控制通道。
控制通道上的数据包流序列为:
1、应用程序发送命令包;
2、设备接收命令包;
3、设备执行命令;
4、设备发生回应包(如果有回应包);
5、应用程序接收回应包(如果有回应请求)。
独占访问:具有独占访问的应用程序是设备的主程序。他可以读写设备。任何其他应用程序都不能对该设备进行读写。当应用程序具有独占访问权限时,设备不能允许辅助应用程序创建辅助控制通道。当设备已授予独占访问后,它必须在确认消息中向发送命令消息的任何其他程序返回一个错误(GEV_STATUS_ACCESS_DENIED),但ACTION_CMD、DISCOVERY_CMD、PACKETRESEND_CMD和FORCEIP_CMD命令除外。
控制访问:具有控制访问权限的应用程序是设备的主应用程序,它可以读写设备,且其它应用程序可以从该设备读数据,注意,不需要设备来支持控制访问。
1、当设备支持控制访问并且有已经有应用程序具有控制访问时,设备应该允许辅助应用程序创建支持READREG和READMEM消息的控制通道。
2、当设备支持控制访问,且没有使用独占访问或控制访问注册应用程序,则可以授予控制访问。如果应用程序具有启用切换控制权限,那么如果另一个应用程序具有正确的凭据,则设备可以授予对该应用的访问权限。当应用请求访问时,如果将CCP寄存器的control_switchover_key字段设置为Control Switchover键引导寄存器所持有的值,则应用程序具有正确的凭据。否则,它必须返回一个错误(GEV_STATUS_ACCESS_DENIED)。
具有切换功能的控制访问:与控制访问模式不同的地方在这种模式允许具有正确凭据的应用程序控制设备。当应用程序启用切换的控制访问时,设备应该允许辅助应用程序创建支持READREG和READMEM消息的控制通道。
监视访问:具有监视访问权限的应用程序对设备没有特权,它是一个辅助应用程序,只有当没有具有独占访问权限的应用程序连接到设备时,才能从设备读取。例如,它可以用来转储设备的寄存器。只有在没有具有独占访问权限的应用程序时,设备才允许监视器访问。如果这个特权可用,辅助应用程序可以直接向设备发送READREG_CMD或READMEM_CMD消息。应用程序不写入CCP寄存器以获得监视访问。注意,不需要设备来支持monitor访问。不需要设备来跟踪辅助应用程序的req_id:辅助应用程序中的每个命令,即使是重试命令,都会被执行。
控制通道提供了以下寄存器:
1、Control Channel Privilege register (CCP)
2、Control Switchover Key register
3、Heartbeat Timeout register
4、Pending Timeout register
参照Bootstrap Registers章节。
要打开通道,应用程序将请求的特权写入CCP寄存器,并检查设备的确认消息返回的状态。如果成功,应用程序现在拥有特权,设备返回GEV_STATUS_SUCCESS。否则,设备返回状态GEV_STATUS_ACCESS_DENIED。应用程序从状态代码中知道它是否被授予了请求的特权。
当设备收到向CCP寄存器写入的命令时,如果应用程序要求独占或控制访问(不启用或启用切换),它将尝试创建通道上下文。任何辅助应用程序都不需要写入CCP寄存器:它可以直接从设备读取。设备验证是否可以授予所需的特权,并在必要时更新上下文。
允许主应用程序在不关闭控制通道的情况下请求相同的特权。在这种情况下,设备必须接受请求并返回GEV_STATUS_SUCCESS。
设备必须允许应用程序在独占、控制和启用切换特权的控制之间直接切换,而不必首先断开控制通道。
主程序通过向CCP寄存器写0来关闭打开的控制通道。除非主应用程序在启用切换的情况下被授予控制访问权,否则其他应用程序不能写入CCP寄存器。在这种情况下,如果其他应用程序具有正确的凭据,则可以授予CCP请求。否则,它将从设备获取一个GEV_STATUS_ACCESS_DENIED。
应用程序应该提供参数配置心跳频率;设备必须提供一个寄存器控制心跳超时时间;从应用程序接收到的任何一个GVCP命令都必须重置心跳计数器。
如果没有收到控制消息超过寄存器(默认3秒)设置时间和心跳功能没有被禁用(GVCP配置的寄存器)在设备上,那么它必须关闭控制通道。
一旦应用程序使用设备打开主控制通道,它就可以发送GVCP支持的任何命令。
主程序可以在打开通道后,发送任何受GVCP支持的命令,二级程序可发送READREG和READMEM命令读取设备速率。DISCOVERY、ACTION和PACKETRESEND命令可以在任何时间由任一程序发送,且设备总是在收到后返回一个ACK消息。
下表总结了GVCP命令的特性,仅供参考,有些命令必须参考实际需求:
若设备执行命令时间比程序预期的要长,则下述机制有助于相互间通信:
① 执行一个请求所需的最大执行时间;
② 当请求执行时间将超过①中的值,使用使用PENDING_ACK消息通知程序使其可以等待额外必需的时间来完成该请求。
如果应用程序启用了PENDING_ACK,那么设备就可以通知应用程序某个命令可能需要更行时间才能执行,该设备返回一个PENDING_ACK来重置应用程序ACK超时。PENDING_ACK的ack_id必须与初始请求保持相同,这清楚的表明了pending_ack属于这个请求。
如果设备支持pending_ack,那么它必须在发出pending_ack和发送命令ACK之间回答DISCOVERY_CMD消息。值得提出的是,不能使用pending_ack来回复DISCOVERY_CMD。