libMSRP for Windows

MSRP (Message Session Relay Protocol) 是一个基于 SIP,用于文本、消息交换的协议,主要用来在一个 session 里进行文本交换、消息传递、文件传输等,是开发基于 SIP/SIMPLE 方面应用的重要协议。我们知道用 SIP/SIMPLE 协议写的文字聊天工具只能支持无 session 的会话,也就是说 A 发一条消息,B 收到一条消息,A 和 B 之间没有 session(会话)。如果语音聊天就是有 session 的,A 打语音给 B,A 和 B 之间保持会话,保持一个连接状态的 session. 有 session 的文字聊天会带来什么好处呢?一个好处就是在保持连接的同时能互相传递文件,还有就是可以共享桌面、白板什么的。

2007年 VPSee 在一个 VoIP 开发项目中需要用到文件传输,我们的 VoIP 项目基于 SIP 协议而且要求支持 Mac 和 Windows 跨平台,所以要做文件传输自然而然就想到 MSRP,不幸的是当时只有一个 Linux C 版本的 Open Source MSRP 实现 libMSRP,Mac 天生就是 BSD 系统,libMSRP 可以直接在 Mac 上编译,我们还需要一个 Windows 版本的 libMSRP 库,就这样 VPSee 花了点时间把 libMSRP 移植到了 Windows 平台,特别是大家比较熟悉的 Visual Studio 开发环境下,当然我也针对 Window 上的 Unix 开发环境(MinGW)写了 Makefile,你也可以在 Window 平台上通过 make/gcc 编译通过。补充一句,现在又多了一个选择,一个 Python 版本的 MSRP 实现和库(http://msrprelay.org/)。

在移植过程中遇到很多小问题和 libMSRP 本身的 bug,不过总的说来 libMSRP 的代码量很小,移植还是比较顺利的,最麻烦的几个问题是:

  1. gcc 有一个很方便的扩展就是 typeof 宏,可以方便的得到数据的类型,但是 vc 不支持;
  2. Windows 里面没有 pthread 相关系统调用,需要用类似的 API 替换相关函数,为了不大量改动原 libMSRP 的代码保持源代码的清晰,我用了大量宏定义来做替换 ,比如:
    #define pthread_mutex_lock(pobject) WaitForSingleObject(*pobject,INFINITE)
    #define pthread_mutex_unlock(pobject) ReleaseMutex(*pobject)
    ⋯⋯
  3. Windows API 里没有 socketpair,需要自己写个函数模拟 Linux 下的 socketpair 函数的功能。

libMSRP 遵循 GNU General Public License (GPL) 协议,libMSRP for Windows 也遵循同样的开放版权协议。详细的编译方法和源代码下载在这里:http://www.vpsee.com/projects,projects 使用英文页面,希望对更多的人会有帮助。

用 Nokia 手机连接 Asterisk 打 SIP 电话

这是一篇很老的笔记了,好像是06年的,今天有时间整理出来。当时正在做一个 VoIP 项目,开发一个支持视频、语音的 SIP softphone,并且还要支持文字聊天、presence 等功能。开发完后测了几个其他的 SIP phone,语音都没有问题。那时候手机 WiFi 很火,VPSee 很想看看自己的 SIP phone 能不能连得上手机。

每个 SIP 厂商对 SIP 标准的支持都不一样,大部分时候任意两个 SIP 电话都可以通话,但有时候某个 SIP phone 因为 SIP 兼容性问题不能连到另一个 SIP phone,或者有时候信号很差。Microsoft 的 MSN 其实是基于 SIP 协议的,不过 Microsoft 在 SIP 上加了很多自己的东西,改进过多又封闭代码,导致 MSN 基本和 SIP 没有什么关系了。Nokia 手机上的内置 SIP 看上去很简单,只提供最基本的功能使用,而且是系统一部分,封闭。Symbian 的 SDK 不包括 SIP/RTP 库,如果要在 Symbian 上开发自己的 SIP 电话的话还需要开发自己的 SIP/RTP 库,很麻烦,目前有个叫 pjsip 的 open source SIP 库已经被移植到了 Symbian 上。

Nokia 手机没有网络插口,不能用网线上网,只能通过 WiFi 连网。打造一个测试环境需要几个部件:同时支持 WiFi 和 SIP 的手机、WiFi 网络和 VoIP 服务器。支持 WiFi 和 SIP 的 Nokia 手机主要型号集中在 E 系列和 N 系列,VPSee 用 Nokia E70、E61、N66、E71 测试过都没有问题。首先用手机登录 WiFi,设置 SIP 配置文件(服务器地址、用户名、密码)后注册到局域网的一台 Asterisk VoIP 服务器上。然后用我们开发的 SIP softphone 或者注册到 VoIP 服务器后拨号给手机。连接如下:
手机 —- WiFi —- VoIP 服务器 —- SIP softphone

安装 Asterisk

wget --passive-ftp ftp.digium.com/pub/asterisk/asterisk-1.4.4.tar.gz

tar zxvf asterisk-1.4.4.tar.gz
mv asterisk-1.4.4 /usr/src

cd /usr/src/asterisk-1.4.4
make clean
./configure
make
make install
make samples


继续阅读 »

安装和配置 OpenIMS Core

openimscore

最开始听说 OpenIMSCore 是在毛里求斯的一次会议上,这个项目是德国的 Fraunhofer FOKUS 赞助的,主管是一个德国教授,他也是那次会议的一个 key speaker,他在会上不停的谈到这个东东,我对电信那一层不熟悉,不怎么懂,从软件层面来看我总觉得是类似于 Asterisk,SIP Express Router(SER)一样的平台,感觉 OpenIMSCore 实际上就是在 SER 上面加了一层多媒体而已,而且文档/代码还处在学术阶段,不可靠,所以一直没有怎么关注。后来去了几次 University of Cape Town,得知他们有个小组专做 OpenIMSCore,也是 Fraunhofer FOKUS 赞助的,在这个项目上面发了很多 paper,OpenIMSCore 的 client:UCT IMS Client 就是他们开发的,后来还知道那个主管 OpenIMSCore 的德国教授是 UCT 的一个 visiting professor,扒远了~~

最近 VPSee 的 sponsor 对 IMS 产生兴趣,希望我能跟一下,看看能不能把本人的一个有点关联的项目和 OpenIMSCore 集成一下,我的项目里用到了 SIP/SIMPLE 和后台的 Asterisk/OpenSER。OpenIMSCore 也兼容 SIP,而且也是在 SER 基础上扩展的,应该和我的项目集成起来不会有什么困难,在 VPSee 的眼里 OpenIMSCore 就是一个加强了的 SER。

下面是安装在 Ubuntu 9.04 Desktop 版本上的过程,Ubuntu 的其他版本也应该可以。为了减少痛苦,建议在 Ubuntu 上安装 OpenIMSCore,配置文件/文档什么的都是为 Ubuntu 写的。八卦一下,UCT 是 Ubuntu 的铁杆粉丝,Ubuntu 的创始人就毕业于 UCT.

下载和安装

官方网站下载 source code,我本来懒得安装配置,想下载一个 vmware image 版本直接运行,结果 image 太大,下载老出错。刚好我们组在 UCT 有个 workshop,所以路过就找 UCT 的人要了个 hard copy,不过是 source code 的,他们自己都不用那个 image 版本,软件开发行业有句话叫做:“eat your own dog food”,既然他们都不 eat,那我也不 eat 他们的了:)

mkdir /opt/OpenIMSCore
cd /opt/OpenIMSCore

mkdir ser_ims
svn checkout http://svn.berlios.de/svnroot/repos/openimscore/
ser_ims/trunk ser_ims

mkdir FHoSS
svn checkout http://svn.berlios.de/svnroot/repos/openimscore/
FHoSS/trunk FHoSS

安装必要的软件包

sudo apt-get install bison flex libxml2 libxml2-dev bind9
sudo apt-get install mysql-server libmysqlclient15-dev 
sudo apt-get install sun-java5-jdk ant

编译

cd /opt/OpenIMSCore

cd FHoSS 
ant compile deploy 
cd ..

cd ser_ims 
make install-libs all 
cd ..

配置 DNS

拷贝 DNS 配置文件,编辑 named.conf.local:

sudo cp /opt/OpenIMSCore/ser_ims/cfg/open-ims.dnszone /etc/bind/

vi /etc/bind/named.conf.local
zone “open-ims.test” {
    type master;
    file “/etc/bind/open-ims.dnszone”;
};

重启 DNS 服务,然后用 ping 测试:

sudo /etc/init.d/bind9 restart

ping open-ims.test
PING open-ims.test (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.027 ms
...

配置 OpenIMSCore

cd /opt/OpenIMSCore

mysql -u root -p < FHoSS/scripts/hss_db.sql 
mysql -u root -p < FHoSS/scripts/userdata.sql

mysql -u root -p < ser_ims/cfg/icscf.sql 

cp ser_ims/cfg/*.cfg . 
cp ser_ims/cfg/*.xml . 
cp ser_ims/cfg/*.sh .

运行 OpenIMS Core

/opt/OpenIMSCore/pcscf.sh
/opt/OpenIMSCore/icscf.sh
/opt/OpenIMSCore/scscf.sh

/opt/OpenIMSCore/FHoSS/deploy/startup.sh

如果在启动 startup.sh 时遇到:startup.sh: line 15: /bin/java: No such file or directory 说明 JAVA_HOME 没有设置好,首先定位 java 装在哪里,然后修改 .bashrc 设置环境变量,把 java 的路径加到 JAVA_HOME。

locate /rt.jar

cd
vi .bashrc
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
source .bashrc

重新启动 startup.sh,打开浏览器输入 http://localhost:8080, 用户名/密码是:hss/hss。 登录后会报错,原因是要用 root 启动 Tomcat,FHoSS 运行在 Tomcat 上:

sudo ./startup.sh

如果这个时候提示找不到 /bin/java,需要做个连接:

sudo ln -s /usr/bin/java /bin/java

再次启动 startup.sh,用浏览器登录 http://localhost:8080 后就可以看到欢迎界面了。

用 uctimsclient 测试

到 http://uctimsclient.berlios.de/ 下载 OpenIMS Core 的客户端 uctimsclient,先安装必要软件包,然后安装 uctimsclient:

sudo apt-get install libavcodec52 libosip2-dev libexosip2-dev
sudo apt-get install libgtk2.0-dev libxml2-dev libcurl4-dev libvlc-dev vlc
sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
sudo apt-get install libavcodec-unstripped-52 

sudo dpkg -i uctimsclient1.0.13.deb

dpkg -i uctimsclient1.0.13.deb 时会报错,这里有几个 dependency 问题需要解决:需要 libavcodec51 而不是上面最新的 libavcodec52,所以要把 libavcodec52 删除,手动下载和安装 libavcodec51;需要 libavcodec-unstripped-51 而不是 libavcodec-unstripped-52,手动下载 libavcodec-unstripped-51,安装 libavcodec-unstripped-51 前需要先安装 libx264-59。

运行 uctimsclient,如果这个时候报错,则需要安装 libcurl 后再次运行:

uctimsclient: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory

apt-get install libcurl3

uctimsclient