sipxtapi使用

本文介绍了开源项目sipXtapi的编译过程及遇到的问题解决方案,特别是解决了因默认连接选择不当导致的注册失败问题,并分享了调试经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

使用了网络上开源的sip sdk 使用开源的东西的感觉就是编译麻烦 这个也是这样 不过还好他们的官方网站上有说明如何去编译
 
要求几个开源库支持
PCRE        Perl Compatible Regular Expression Library
wxWidgets   Open-source, platform independent GUI library (does not required for building libraries only)
speex
cppunit 
感觉speex比较麻烦 我下载的是speex-1.2beta1.tar 的版本如果按照文件包里边原来的工程编译的话产生的lib文件会在接下来sipXtapi编译时报几个个link的错误 原因是找不到一些已经在头文件中定义了的函数 解决方法就是将speex包文件夹中的libspeex文件下所有的.c文件都包含入工程中再编译 试了下 ok
整个sipXetApi编译的时候还会遇到比如缺少文件 或者链接的时候有冲突 这个都只需要配置下工程就可以了 debug版本编译都通过了 realse版本没有成功 太多库冲突了
编译完了 先测试下sipXezPhone 服务器使用的是Asterisk sipXezPhone的配置比较麻烦 唯一标示 需要是<sip:username@sipproxy> 还有 r_port需要选中 如果你在防火墙或者内网中 不选中便注册不上 ok 注册成功了 拨打电话需要输入 sip:被拨打号码@服务器 也就是被拨打号码的唯一 拨打 响铃 接通 成功 ok 语音质量在局域网中非常清晰 去噪音等方面也特别好。整个测试环境是在一个NAT局域网中。在接下来的开发中 发现一个奇怪的问题 如果电脑不是通过路由器代理上网 而是主动拨号的话sipXezPhone便会注册不上 抓包看 发现原来是sipXezPhone把本地的ip传送给了服务器 导致服务器无法返回消息包。查看了sipxtapi的代码 发现在SipUserAgent.cpp 文件中有这么一句
pContact = mContactDb.find(1) 注解为// get the first CONTACT entry in the Db
获取第一个有效链接当成默认的连接 很不巧的是 一般拨号上网的电脑 第一个有效连接是本地的局域网ip而不是广域网ip 并且在这个连接DB中这两个ip的类型都为Local(不敢说是sipxtapi本身程序问题 也可能是有什么其他设置我没有弄对 呵呵) 做了一些简单的修改:
int nSum;
        SIPX_CONTACT_ADDRESS* addresses[32];
         mContactDb.getAll(addresses,nSum);
         SIPX_CONTACT_ADDRESS* pContact;
        
         /*if(nSum>0)
           pContact=addresses[nSum-1];
         else
          pContact = NULL;*/
        short i=0;
        char sTemp[5];
         short j=0;
        
         for(i=nSum-1;i>=0;i--)
         {
          j=0;
          memset(sTemp,0x00,5*sizeof(char));
          pContact=addresses[i];
          while(j<5&&pContact)
          {
               sTemp[j]=*(pContact->cIpAddress+j);
               j=j+1;
          }
          sTemp[4]='/0';
          OsSysLog::add(FAC_SIPXTAPI, PRI_INFO,
               "[MYDEBUG]num:[%d],sTemp[%s]",i,sTemp);
 
          if(strcmp(sTemp,"192.")!=0&&strcmp(sTemp,"10.0")!=0)
              break;
         }
         if(i<0)
         {
          pContact = mContactDb.find(1);
         }
        //SIPX_CONTACT_ADDRESS* pContact = mContactDb.find();
         for(int i=0;i<nSum;i++)
         {
          OsSysLog::add(FAC_SIPXTAPI, PRI_INFO,
               "[MYDEBUG]pContact:[%s] eContactType:[%d] num:[%d]",
               addresses[i]->cIpAddress,addresses[i]->eContactType,i);
         }
        
         OsSysLog::add(FAC_SIPXTAPI, PRI_INFO,
              "[MYDEBUG]pContact:[%s] nSum:[%d]",pContact->cIpAddress,nSum);
 
        assert(pContact) ;
        // Bind to the contact's Ip
        if (pContact)
        {
            defaultSipAddress = pContact->cIpAddress;
        }
 

编译 测试 ok~ 整个问题困扰了我2天 不过也让我清楚 下次遇到这类问题需要解决的步骤。 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值