使用了网络上开源的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天 不过也让我清楚 下次遇到这类问题需要解决的步骤。