RT!!

解决方案 »

  1.   

    3、方案分析
        在H.245协议中,每个规程被分为协议用户(Protocol User)和协议实体(Protocol Entity)两部分,协议用户是对规程的流转控制,协议实体是规程的具体功能实现。要实现H.245也就是要实现各规程的协议用户和协议实体。在H.245中,每个具体的规程被叫做信令实体(Signalling Entity),如主从决定的全称为Master Slave Determination Signlling Entity,所以建议中给出了它们的简称,如主从决定的简称为MSDSE,能力交换为CESE … …,维护环回为MLSE。下面的内容中涉及到具体规程时我们都使用其简称。
    分析H.245协议后认为,要实现H.245协议重点应考虑以下问题:
    ● H.245框架的设计
    ● H.245与系统用户的通信
    ● H.245与多路复用层的通信
    ● H.245协议用户的设计
    ● H.245协议实体的设计。
        在H.245中协议用户和协议实体间交换的信息称为原语(Primitives),协议实体和远端协议实体间交换的信息(端对端信令交换)称为消息(Messages)。
        在H.245中,协议用户负责从系统用户处接收命令,启动相应的规程;同时,接收来自协议实体的原语,并进行后续处理。所以协议用户应实现的功能有:规程的启动、原语处理、原语发送以及与系统用户的通信。也就是说H.245与系统用户的通信在协议用户模块来实现。
        协议实体是对各规程的具体功能实现,它接收来自协议用户的原语并按照该规程进行处理;接收来自复用层的对端发送的消息,也作相应的处理;在处理消息的过程中,启动定时器,对没有按指定时间返回的消息进行超时处理。所以协议实体应实现的功能有原语处理、消息处理、原语发送、消息发送、定时器超时处理以及各规程内部的其它功能。H.245与多路复用层的通信也就是这里所说的消息处理和消息发送。由于消息处理、原语处理、定时器超时处理是并行的,所以协议实体模块应采用多线程来实现。
        在消息和原语处理中,为了防止丢包,并能保证所有处理异步进行,采用队列来缓存消息和原语,当前处理的消息或原语可从队列中逐条提取。
        总上所述,实现H.245也就是开发协议用户模块和协议实体模块。其中协议用户模块负责与系统用户通信,来接收系统命令;协议实体模块负责与多路复用层通信,完成端对端的信令交换。
      

  2.   

    4、协议的实现
        在方案分析中,我们把H.245的实现归纳为开发协议用户模块和协议实体模块。因此,我们把设计的重点也放在这里,整个设计中未考虑H.245与多路复用层间通信的简单重发协议(SRP),而是用TCP/IP来模拟代替。下面我们分别叙述采用C++语言来设计协议用户模块和协议实体模块。
    4.1 协议用户的实现:
        协议用户模块从功能上可分为两大部分:启动规程和处理原语。启动规程指H.245接收到系统用户的命令开始启动某个规程;处理原语指协议用户处理从协议实体传来的原语。因为每个规程的功能是相对独立的,在设计时为每个规程创建一个用户模块类,H.245整体上有一个用户模块的调度类,该类采用多继承方式继承各规程的用户模块类。调度类中启动两个线程,分别用来接收系统用户的命令和来自协议实体的原语,并调用所涉及的规程类的相应函数进行处理。实现如下:
    //以主从决定规程为例,说明用户模块中各规程类的设计
    class H245MSDSE_User
    { … …
    public:
    void P_MSD_Process(p_info * buffer,LPVOID lParam);//原语处理
    void H245_MSD_Start();//主从决定规程的启动
    … …
    }//用户模块调度类的设计
    class H245Process_User : virtual public H245MSDSE_User,
    public H245RMESE_User,
    … …
    public H245MLSE_User,

    private:
    //命令收发队列
    H245_Queue Q_Command_Recv; //命令接收队列,存储系统用户发送来的命令
    H245_Queue Q_Command_Send; //命令发送队列,存储向系统用户发送的命令
    //原语收发队列在协议实体中实现
    private:
    void Command_Process();//处理系统用户发送的命令
    void Primitive_Process();//处理协议实体发送的消息//为系统用户预留的接口,用于系统向H245收发命令
    public:
    bool H245_Command_Retrieve();//查询H245中有无需处理的命令
    unsigned short H245_Get_Command(char * buf);//获取一条命令
    bool H245_Send_Command(unsigned short current_command,char *buf);//向
    H245发送命令,带参数
    … … 
    }以上工作完成后可将协议用户封装成动态链接库(DLL),并留有下面的接口供
    系统用户层使用:
    bool H245_Command_Retrieve();//查询H245中有无需处理的命令
    unsigned short H245_Get_Command(char * buf);//获取一条命令
    bool H245_Send_Command(unsigned short current_command,char *buf);注:H245_Queue、p_info的实现在后面介绍。
      

  3.   

    要更详细的资料写下你的EMAI 我发给你(呵呵,以前做过一点点)
      

  4.   

    http://search.csdn.net/Expert/topic/824/824048.xml?temp=2.444094E-02
      

  5.   

    VOIP专题角教程:
    http://www.cci.he.cninfo.net/hbtxw/hbtx/itjishu/xxtd/VOIP.htmVOIP专题
    http://www.star86.com/other.htmlhttp://www.chinaitlab.com/www/special/voip.asp
      

  6.   

    gdy119(中国制造), 我的 MAIL 是:  [email protected]
    谢谢!!!
      

  7.   

    TO:
    ALong_Yue() 
      我只有更详细的开发文档,具体的代码真的不方便给你,开发文档要吗?
      

  8.   

    开发文档也好,真是太感谢了。
    主要是现在公司要做一些技术准备,我只是找一些参考资料;因为原来没有做过VOIP开发,所以觉得无从下手。 谢谢:)
      

  9.   

    TO:
    ALong_Yue() 
      发了一些很浅显的东东,具体的开发很复杂,不过希望对你有帮助
      

  10.   

    gdy119(中国制造) 
    收到你的邮件,谢谢:)