如何向radvision h248协议栈中添加扩展包

H248协议的扩展机制都是通过发布扩展包的标准文档来实现,由于radvision原版代码仅实现了一些基本包,前期开发过程中就会涉及向radvision协议栈中添加扩展包的处理,这里描述一下radvision协议栈中处理包的流程机制,及向协议栈添加扩展包的方法。

一、相关概念
抽象包:同面向对象编程类似,这种包只能用于扩展,而不是实际使用。
基类包:同面向对象编程类似,一个包的定义可以在一个基类包上进行扩展,这样新增加的包除了自身特性之外,也继承了基类包的特性。

二、包数据库关联概要图(并非和radvision协议栈一一对应,这里仅描述了大体的抽象关联)


从这里看到,当前包数据库中有两个包定义,包A包含两个版本的包信息,包B包含仅包含1个版本的包信息,同时包B是在包A的基础上继承出来的,而包A则没有任何继承。


三、radvision协议栈中处理包的流程机制(以信号{包标识/信号标识}处理进行描述)
1、首先根据包标识在包数据库(当前包数据库存储在终端管理对象中)中查找匹配的包。
2、如果未找到,则这一步直接返回错误响应,给远端报告未知的包。
3、如果找到对应的包,则在终端类中查找是否支持该包,并返回支持版本号。(包相关的处理除了在终端管理对象中含有一份包数据库,同时在终端类中含有一个包支持列表,记载着当前终端类支持的包及对应包的版本,从这里可以看出,我们在向协议栈增加扩展包时,需要做两个工作,一个工作是向包数据库中添加扩展包的详细数据,第二个工作就是向终端类中增加对该包的支持及对应的包版本)。
4、如果在终端类中查找不支持该包处理,则返回错误响应,给远端报告不支持该包。(刚才提到包相关处理需要做两部分工作,即使在包数据库中添加了完整的包详细数据,也一定要记得第二部分工作需要在终端类中增加该扩展包的支持及对应版本号)。
5、查找到支持包,则检测该包如果是抽象包,则直接返回错误,抽象包只能继承。
6、在第3步查找终端类是否支持该包时,已经返回了包的版本号,此时就会在该包中查找对应版本号的包信息(可以参看上面的关联图)。
7、如果找到对应的版本号包信息,则根据该版本号包信息中的信号表进行信号匹配处理,如果匹配成功则协议栈触发应用层对应的信号处理回调。如果进行信号匹配处理时没有匹配成功,则直接从版本列表中获取当前版本号的下一个版本号包信息进行匹配处理(注意在初始化时,向包中添加对应的版本号信息时,协议栈已经按版本号从高到低的顺序进行排序,所以当前版本包信息处理失败后直接从下一个较低的版本包信息中进行继续匹配处理)。
8、当在第6步时如果没有找到对应的版本号包信息,或者在第7步中,即使找到了对应版本号包信息,但在进行信号表匹配处理时都没有匹配成功,则查找当前包是否有基类包,如果没有基类包,则返回失败。如果有基类包,则在从基类包中进行处理,处理方式同第7、8步相同。


四、向协议栈添加扩展包

1、第一部分工作向包数据库包添加包详细信息。


a、协议栈中添加ABNF范式扩展包都集中在rvMdmTermMgrRegisterPackages接口函数中,该函数
在初始化时触发流程如下:
rvMdmTermMgrConstruct
rvMdmTermMgrRegisterPackages(所有ABNF范式的包都在这里添加)

b、通常添加包的工作需要具体参考对应的扩展包文档,基本步骤如下:
调用rvMdmTermMgrCreatePackage接口进行包创建(如果文档中定义该包是基于某个包的,则需要调用rvMdmTermMgrCreateDerivedPackage接口进行包创建)
调用rvMdmRegisterSignal接口进行信号信息创建(需要参考扩展包文档,是否有信号的定义,这里需要注意一点,除了包创建之外,其它信号创建、信号属性创建、事件创建、事件属性创建等等都有两个接口函数,一个是rvMdmRegisterSignal,还有一个会在结尾带有Ex,比如信号创建另一个接口rvMdmRegisterSignalEx,带Ex结尾的都会多一个版本号的参数,而不带Ex结尾的默认版本号是1,可以参考上面的包关联图来理解这里的版本号的意义)
调用rvMdmPackageRegisterSignalParameter进行信号参数的创建(需要参考扩展包文档,对应信号是否有参数定义,这时同样会有两个对应函数,另一个带Ex结尾,参见刚才描述)
其它事件信息创建、事件属性创建、本地控制创建、本地控制属性创建都同上面的信号相同,这里就不一一描述了。


2、第二部分工作向指定终端类添加包支持及对应的版本。

如果要向ROOT终端类添加支持包,则在h248AddSupportedPkgForRootTermClass接口中进行处理。

如果要向应用层自己创建的终端类(用于半永久终结点、临时终结点)添加支持包,则在h248AddSupportedPkgForTermClass接口中进行处理。

上面都是统一调用协议栈的接口函数
rvMdmTermClassAddSupportedPkg(RvMdmTermClass *c, const char *name, RvUint version)

需要留意一下这里的版本号,需要结合前面描述协议栈处理包的流程机制来进行理解,如果当前在包数据库中,对特定包同时添加了多个版本信息,则这里版本号通常使用最大值,因为协议栈在包数据库中添加包版本信息时是按版本号从高到低排序的,在处理包流程机制中,通常借助该函数传入的版本做为启动版本信息的依据,之后在处理包匹配处理流程中,如果高版本信息的数据匹配失败会向依据向低于当前版本信息的数据进行匹配,所以这里版本号设置为在包数据库中当前包支持的最高版本,就可以保证当前包的所有版本信息在进行匹配处理时都可以参与处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值