Mesh Potato Workshop

上周五开了一整天的 workshop,Mesh Potato 的几个主要开发人员都过来了,上午主要是几个 talk,一些 Mesh Potato 的背景、历史和未来计划,下午是一些技术演示和讨论。这个开发团队非常分散,技术大牛是一个来自德国的 woman,黄白的头发,一看就很 geek,Mesh Potato 硬件、OpenWrt kernel 和 mesh 协议都是由她开发的,很强悍。A2Billing 的主要作者是个西班牙的小帅哥,28岁左右,英语很流利但是口音很重,听得很费力,A2Billing 也是目前 Asterisk 上最好的 billing 工具,他给我们展示了新版本的 A2Billing,目前还没有发布,就从界面上来看比老版本的 A2Billing 简洁了很多。还有一位来自瑞典 Asterisk/VoIP 安全方面的高手给我们展示了一些基于 VoIP 方面的入侵、检测,他们实验室做了一个蜜罐用来收集来自全球的 VoIP 入侵资料,并像 Google 地球那样能闪烁提醒入侵来自哪里,结果是入侵扫描大多数来自中国:(,还有1个来自瑞典的 MM 介绍了基于 web 的 Mesh Potato 管理工具,主要是用户可用性方面的东西。项目老大是加拿大人,给我们演示了他们使用 Mesh Potato 的场景,他们利用 Google Map 开发了一个实时监测 Mesh Potato 的可视化工具,如果某个 Mesh Potato 到某个 Mesh Potato 之间的信号不好就会在地图上显示一条红线,如果信号好就是一条绿线,很酷的工具。最后是来自印度洋某岛国(没听懂那个国名)的两个技术人员给我们分享了他们应用100个 Mesh Potato 的经验,他们说他们国家电话费是1分钟1美元,上网费是1小时10美元,所以 Mesh Potato 能大大帮助他们减轻通信费用。

因为前几天提前拿到了样品,试玩了一下 Mesh Potato,所以整个 workshop 听起来比较轻松。下午他们架了几个 Mesh Potato 结点,并且演示了各种不同场景,比如带 wifi 的笔记本装上软件后也能加入这个 mesh 网络并充当 Mesh Potato 的功能,以后还会有 Android 版本推出,这样每个 Android 手机都是一个 Mesh Potato 结点,将会极大扩展 mesh 网络的应用空间。Mesh Potato 采用 B.A.T.M.A.N. (better approach to mobile ad-hoc networking) 协议。他们还开发了监测系统,能完整看到整个 mesh 网络、各个结点之间的路由、结点加入离开等各种状况,非常酷。发现高手们都有一个特点,能把复杂的东西用简单的语言解释清楚,我问到了一个 Mesh Potato 之间的路由问题,他们就解释的非常明白,一听就是那种有实战经验的人的讲解,非常易懂。这个 workshop 真是学到了不少好东西。

mesh potato workshop

试玩 Mesh Potato

快到年底了,超级忙,刚刚开完这会那会,周五还有一整天的 workshop. 这个周五 Village Telco 有几个核心开发人员要到我们这里来做 workshop,关于 Mesh Network, VoIP, Mesh Potato, WiFi 方面的,主要是介绍他们的一个 open source hardware/software 产品 Mesh Potato. Mesh Potato 从硬件到软件都是 Open Source 的,从硬件组成上实际上是一个 Wireless Access Point (AP) 加上 Analog Telephony Adapter ( ATA);从软件上上看上面运行的是一个 fork 出来的 OpenWrt 版本,并且支持 mesh network 协议。

这东西有什么用呢?主要是用来搭建由众多这样的无线 AP 组成的一个 mesh 网络,并且通过 ATA 接口提供语音电话功能。比如说在一个偏远山区,电信公司不愿意为村庄部署电话网(也可能因为村民无法承担高昂的建设费和不菲的电话费),可是村庄里每户人需要彼此能沟通,当然二十一世纪还用 “吼” 的方式有点 out 了,我们可以用这个 Mesh Potato 为这个村庄搭建免费局域电话网,为每户安装 Mesh Potato 并分配电话号码,每户和每户之间构成一个 mesh network,这样只需要用普通电话机连上 Mesh Potato 就可以打电话了,非常简单。当然这样的应用也适合城市小区等等,应用范围非常广泛。

VPSee 昨天收到了 Mesh Potato 的样品,试用了一下,配置非常容易,因为都是 Open Source 的,所以很适合做研究和折腾。

mesh potato

配置 Mesh Potato 的过程很简单:

  1. 先用一个网线把 Mesh Potato 和电脑连起来,Mesh Potato 默认 IP 是 192.168.1.20,然后给电脑设个固定 IP,比如 192.168.1.21;
  2. 在电脑上打开浏览器访问 http://192.168.1.20 就会出来 Mesh Potato 的登录管理页面,默认用户名是 root,密码是空,登录以后就会进入管理界面;
  3. 唯一要修改的就是 Mesh Potato 的 Network -> IP address,每个 Mesh Potato 的 IP 都应该不同(默认是 10.130.1.20),这个 IP 的末尾数字将作为 Mesh Potato 的电话号码。比如,一个 Mesh Potato 的 IP 是 10.130.1.100,另一个是 10.130.1.101,前一个电话号码就是 100,后一个就是 101,如果他们都连上电源的话就可以通过 WiFi 和电话机互相拨打电话。VPSee 在这里把 IP 改成 10.130.1.123(见图)。

mesh potato web gui management

除了上面方式修改 Mesh Potato IP 以外,还可以通过拨打电话方式的修改,拿起电话,直接拨打 2633 进入语音提示,然后输入 10*130*1*123 就会更改本 Mesh Potato 的 IP,很有趣。

Mesh Network 是目前无线网络方面比较热门的一个方向,Mesh Potato 就是其中的一个应用,可应用的场景也很广泛。比如每个大学寝室放一个 Mesh Potato,寝室之间打电话免费,然后打出去按0可以实现类似外线电话那样。最重要的是 Mesh Potato 成本非常低,而且使用和配置都非常简单,比 Cisco 那种大厂商提供的校园 IP 电话和解决方案要便宜的多。

在 Fedora 上安装 ns-2

最近一直在玩网络模拟与仿真,我们需要模拟几百个节点的 mesh network 做 VoIP 通信,然后修改一些 VoIP 协议和算法,并在模拟器上对修改后的协议进行测试和比较,看看性能有没有提升或者下降。模拟完成后,我们将会用 Linksys WRT54GL 架设真实 mesh network,并通过修改 OpenWrt 固件把新的协议应用到真实 mesh network 中,看看有什么变化和区别。前段时间我们试用了 NCTUns,一个台湾交通大学开发的网络模拟软件。这几天我们主要在关注 ns-2,一个由加州伯克利大学开发的网络仿真平台,也是目前的主流开源网络模拟平台。

安装必备软件包

# yum install autoconf automake gcc-c++ libX11-devel xorg-x11-proto-devel \
libXt-devel libXmu-devel

下载和安装 ns-2

要下载和安装的模块很多,最简单的方式就是下载 all in one 版本,所有模块都包括:

$ wget http://www.isi.edu/nsnam/dist/ns-allinone-2.34.tar.gz
$ tar zxvf ns-allinone-2.34.tar.gz
$ cd ns-allinone-2.34
$ ./install

安装过程很顺利,不需要有什么 trouble shooting,安装完后修改环境变量:

$ vi /home/vpsee/.bashrc

# LD_LIBRARY_PATH
OTCL_LIB=/home/vpsee/ns-allinone-2.34/otcl-1.13
NS2_LIB=/home/vpsee/ns-allinone-2.34/lib
X11_LIB=/usr/X11R6/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$OTCL_LIB:$NS2_LIB:$X11_LIB

# TCL_LIBRARY
TCL_LIB=/home/vpsee/ns-allinone-2.34/tcl8.4.18/library
export TCL_LIBRARY=$TCL_LIB

# PATH
PATH=$PATH:/home/vpsee/ns-allinone-2.34/bin: \
/home/vpsee/ns-allinone-2.34/tcl8.4.18/unix: \
/home/vpsee/ns-allinone-2.34/tk8.4.18/unix

运行 ns-2

到 http://nile.wpi.edu/NS/ 下载一个简单的例子 ns-simple.tcl,然后在命令行下用 ns2 运行这个脚本:

$ ns2 ns-simple.tcl

成功运行后界面如下:

ns2

在 Fedora 上安装 NCTUns

NCTUns 是由台湾交通大学开发的一种网络模拟与仿真软件,类似的网络模拟器还有 NS2 等。使用 NS2 需要会一些 tcl 脚本,NCTUns 则简单多了,图形界面、用鼠标拖拖就可以做简单的模拟。最近要做 mesh network 方面的模拟,需要用到这个工具。目前 NCTUns 官方只支持 Fedora 版本的 Linux,虽然也有人在 Ubuntu 上成功安装过,不过为了减少麻烦,VPSee 还是从 Fedora 12 开始。

安装必备软件包

更新系统、安装必要软件包:

# yum update
# yum install gcc gcc-c++ make mkinitrd

编译和安装 NCTUns

下载 NCTUns-allinone-linux-2.6.31.6-f12.20100113.tar.gz,解开并运行安装程序:

# tar zxvf NCTUns-allinone-linux-2.6.31.6-f12.20100113.tar.gz
# cd NCTUns-6.0/
# sh install.sh

编译正在进行,如果中途遇到下面问题,则需要安装 readline-devel 和 ncurses-devel:

/home/vpsee/NCTUns-6.0/tools/misc/nctuns-tcsh/ed.screen.c:673: undefined reference to `tgetstr’
tc.func.o: In function `dotermname':
/home/vpsee/NCTUns-6.0/tools/misc/nctuns-tcsh/tc.func.c:2308: undefined reference to `tgetent’
collect2: ld returned 1 exit status
make: *** [tcsh] Error 1

ERROR: configure or make failed…

# yum install readline-devel ncurses-devel

重新运行安装程序:

# sh install.sh

必须重新启动系统选择 NCTUns (2.6.31-nctuns20091227) 内核启动:

# reboot

运行

重启后运行 NCTUns 会出现下面问题:

$ /usr/local/nctuns/bin/nctunsclient
/usr/local/nctuns/bin/nctunsclient.bin: error while loading shared libraries: 
libqt-mt.so.3: cannot open shared object file: No such file or directory

需要修改 .bashrc 配置文件:

$ vi .bashrc
export NCTUNSHOME=/usr/local/nctuns
export NCTUNS_BIN=/usr/local/nctuns/bin
export NCTUNS_TOOLS=/usr/local/nctuns/tools
export LD_LIBRARY_PATH=/usr/local/nctuns/lib

再次运行 nctunsclient:

$ /usr/local/nctuns/bin/nctunsclient

启动成功后就会看到如下界面:

nctuns

在 CentOS 5.4 上安装和配置 Asterisk 和 Digium 卡

asterisk

现在大家基本都在用智能手机,加上我们的工作区已经被 Wifi 覆盖,如果能让每个手机连上 Wifi,通过一个 Asterisk 服务器(网关)给内线打电话的话就会很方便,比如我在周围散步、或者和朋友聊天的话还可以收到办公桌上的内线电话。如何用智能手机(这里主要使用 Nokia E 系列)免费打内线电话呢?首先手机必须通过 Wifi 连上内部网络,然后通过内部网络的一台 Asterisk 服务器和电话线连上内部电话网络(PSTN),Asterisk 在这里相当于一个网关,用来连接 IP 网络和 PSTN 网络,这样我们就可以通过 IP 网上的电话(手机或者软电话)打内部电话(俗称座机)了,如果内部电话使用 IP 电话就更好了,就不用这么麻烦了。

上个星期在自己的 PC 上安装了一个 Digium 电话卡,并且 在 Ubuntu 上源码编译安装了 Asterisk 和 Digium 驱动,测了测效果,电话语音效果还不错。这个星期打算安装在服务器上,SUN 服务器没有 PCI 插槽,找了一台很老的 HP ProLiant ML110,配置是:Intel P4 3GHz CPU, 4GB ECC RAM,足够我们小组的人用了。按照 Asterisk 和 Digium 官方网站的推荐,VPSee 还是决定使用 CentOS 5.4 作为这台 Asterisk 服务器的操作系统。

安装和配置 Asterisk 和 Digium 卡

首先安装 CentOS 5.4 和优化系统,然后加上 Asterisk 的 Repositories:

# vi /etc/yum.repos.d/CentOS-Asterisk.repo
[asterisk-tested]
name=CentOS-$releasever - Asterisk - Tested
baseurl=http://packages.asterisk.org/centos/$releasever/tested/$basearch/
enabled=0
gpgcheck=0
#gpgkey=http://packages.asterisk.org/RPM-GPG-KEY-Digium

[asterisk-current]
name=CentOS-$releasever - Asterisk - Current
baseurl=http://packages.asterisk.org/centos/$releasever/current/$basearch/
enabled=1
gpgcheck=0
#gpgkey=http://packages.asterisk.org/RPM-GPG-KEY-Digium

再加上 Digium 的 Repositories:

# vi /etc/yum.repos.d/CentOS-Digium.repo
[digium-tested]
name=CentOS-$releasever - Digium - Tested
baseurl=http://packages.digium.com/centos/$releasever/tested/$basearch/
enabled=0
gpgcheck=0
#gpgkey=http://packages.digium.com/RPM-GPG-KEY-Digium

[digium-current]
name=CentOS-$releasever - Digium - Current
baseurl=http://packages.digium.com/centos/$releasever/current/$basearch/
enabled=1
gpgcheck=0
#gpgkey=http://packages.digium.com/RPM-GPG-KEY-Digium

安装 Asterisk 1.6 和 DAHDI:

# yum install asterisk16 asterisk16-configs asterisk16-voicemail \
dahdi-linux dahd

把 Asterisk 加到启动文件中以便开机就启动 Asterisk:

# /sbin/chkconfig asterisk on

安装完毕,启动和停止 Asterisk:

# /etc/init.d/asterisk start
# /etc/init.d/asterisk stop

插上电话线和电话

Digium 驱动安装成功并重启系统后,Digium 卡上的闪烁灯应该会被点亮,注意在拆机箱、安装 Digium PCI 卡时要把卡接上主机内的电源,这样电话才会听见拨号音。左边黑线连接电话机,右边白线连接电话线(PSTN):

digium card

配置 Digium

先运行 dahdi_genconf 自动生成配置文件,这样会在 /etc/dahdi/ 下面产生一个 system.conf,在 /etc/asterisk/ 下产生一个 dahdi-channels.conf,注意 Zaptel 项目被重新命名为 DAHDI,所以目录和配置文件名也有变化:

# /usr/sbin/dahdi_genconf
# vi /etc/dahdi/system.conf
vi /etc/asterisk/dahdi-channels.conf

配置 Asterisk

给系统分配电话号码,简单说明一下,1)如果要打外线需要先拨 9;2)如果从电话上(连在 Asterisk 服务器上的那个电话)接电话的话,Dial(dahdi/g1,20,rt);3)想把 incoming 电话转接到手机上(电话号码是 9252)的话,Dial(SIP/9252,20):

# vi /etc/asterisk/extensions.conf
[internal]
exten => 9250,1,Dial(SIP/9250,20)
exten => 9250,2,Hangup
exten => 9251,1,Dial(SIP/9251,20)
exten => 9251,2,Hangup
exten => 9252,1,Dial(SIP/9252,20)
exten => 9252,2,Hangup

exten => 92461,1,Dial(dahdi/g1,20,rt)
exten => 92461,2,Hangup

exten => _9.,1,Dial(dahdi/g2/${EXTEN:1})

[incoming]
exten => s,1,Answer()
exten => s,2,Dial(dahdi/g1,20,rt)
; exten => s,1,Dial(SIP/9252,20)

给手机或 SIP 软电话分配电话号码

# vi /etc/asterisk/sip.conf
[9250]
type=friend
context=internal
username=9250
host=dynamic                    ; This device needs to register
canreinvite=no                  ; Typically set to NO if behind NAT
dtfmode=rfc2833
nat=no                          ; X-Lite is behind a NAT router
disallow=all
allow=ulaw
subscribecontext=internal
mailbox=9250@internal                   ; Subscribe to status of multiple mailboxes

[9251]
type=friend
context=internal
username=9251
host=dynamic                    ; This device needs to register
canreinvite=no                  ; Typically set to NO if behind NAT
dtfmode=rfc2833
nat=no                          ; X-Lite is behind a NAT router
disallow=all
allow=ulaw
subscribecontext=internal
mailbox=9251@internal           ; Subscribe to status of multiple mailboxes

;Nokia Cellphone
[9252]
type=friend
context=internal
username=9252
host=dynamic                    ; This device needs to register
qualify=no
port=5060
notransfer=yes
disallow=all
allow=alaw

修改完配置文件后需要 Asterisk 重新导入配置文件:

# /usr/sbin/asterisk -vvvvvvvr
localhost*CLI> reload

测试

手机必须是支持 Wifi,SIP 的智能手机,VPSee 在 Nokia E51/E60/E61/E70/E71/N82 上都测试过没有问题,如果没有手机的话也可以用任何 SIP 软电话(比如 X-Lite 等)客户端测试。测试具体配置可以看 用 Nokia 手机连接 Asterisk 打 SIP 电话 的后半部分。

在 Ubuntu 9.10 上安装 Asterisk 和 Digium 卡

很久没有关注 Asterisk 了,现在 Asterisk 出了 1.6 版本,有一个较大的变化就是 Zaptel 项目被重新命名为 DAHDI,导致有些配置文件名和配置文件放置的地方有了点变化,对于习惯了 1.4 的用户有点不适应,而且好多资料都是按照 1.4 版本写的,比如那个经典免费书:Asterisk: The Future of Telephony.

以前写过一篇 如何用 Nokia 手机连接 Asterisk 打局域网 SIP 电话 的文章,是在没有 Digium 电话卡的情况下做的一个纯 VoIP 服务器。如果有电话卡的话就可以连到 PSTN 网络,这样电脑就可以通过 IP 网络给固定电话(PSTN )打电话。VPSee 用的是 Digium TDM400P PCI 语音电话板卡(见图),有4个口,1个连 PSTN 电话线(FXO),剩下 3个连电话机(FXS)。整个安装过程和配置操作在 Ubuntu Desktop 9.10 上完成,如果要看 CentOS 版本上面的安装过程可以看这篇,这里只给出了安装过程,具体 Digium 卡和 Asterisk 的配置过程可以看这篇:在 CentOS 5.4 上安装和配置 Asterisk 和 Digium 卡

digium card

安装前准备

先安装一些编译 Asterisk 需要的必备包:

# apt-get install build-essential subversion make linux-source kernel-package

再安装 Linux 内核头文件,安装的时候会有提示选择哪个版本的 linux-libc-dev,选择一个和当前内核版本对应的 linux-libc-dev 就可以了:

# apt-get install linux-kernel-headers
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package linux-kernel-headers is a virtual package provided by:
  linux-libc-dev 2.6.31-19.56
You should explicitly select one to install.
E: Package linux-kernel-headers has no installation candidate

# apt-get install linux-libc-dev

安装 linux-headers,同样的,需要从众多头文件版本中选择一个和当前内核版本相对应的 linux header 版本:

# apt-get install linux-headers
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package linux-headers is a virtual package provided by:
...
  linux-headers-2.6.31-19-generic-pae 2.6.31-19.56
  linux-headers-2.6.31-19-generic 2.6.31-19.56
  linux-headers-2.6.31-19-386 2.6.31-19.56
  linux-headers-2.6.31-19 2.6.31-19.56
...
You should explicitly select one to install.
E: Package linux-headers has no installation candidate

# apt-get install linux-headers-2.6.31-19-generic

还需要安装一些包:

# apt-get install libconfig-tiny-perl libcupsimage2 libcups2 \
libmime-lite-perl libemail-date-format-perl libfile-sync-perl \
libfreetype6 libspandsp1 libtiff-tools libtiff4 libjpeg62 \
libmime-types-perl libpaper-utils psutils libpaper1 ncurses-dev \
libncurses-dev libncurses-gst ncurses-term libnewt-dev libnewt-pic \
libxml2 libxml2-dev libspandsp-dev libspandsp1

安装 Asterisk

把工作目录切换到 /usr/src/ 下,以后所有操作都在这个目录下进行:

# cd /usr/src/

下载 asterisk, dahdi-kernel, dahdi-tools, libpri 的源代码:

# svn co http://svn.digium.com/svn/asterisk/trunk asterisk
# svn co http://svn.digium.com/svn/dahdi/linux/trunk dahdi-kernel
# svn co http://svn.digium.com/svn/dahdi/tools/trunk dahdi-tools
# svn co http://svn.digium.com/svn/libpri/branches/1.4/ libpri

编译安装 libpri:

# cd /usr/src/libpri
# make clean
# make
# make install

编译安装 dahdi-kernel:

# cd /usr/src/dahdi-kernel
# make clean
# make
# make install

编译安装 dahdi-tools:

# cd /usr/src/dahdi-tools
# make clean
# ./configure
# make
# make install
# make config

最后编译安装 asterisk:

# cd /usr/src/asterisk
# make clean
# ./configure
# make
# make install
# make config

运行和测试 Asterisk

最后检查一下 Asterisk 是否工作以及 Digium 卡的驱动是否装好:

# asterisk -r
...
localhost*CLI>

# lsmod | more
...
dahdi                 199240  11 xpp,dahdi_transcode,wcb4xxp,wctdm,wcfxo,wctdm24
xxp,wcte11xp,wct1xxp,wcte12xp,dahdi_voicebus,wct4xxp
...

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

用 Kannel 短信网关发送 SMS

前段时间 VPSee 做了一个用 SMS 给学生发送考试成绩的项目,想法是:通过一个 SMS 网关用短信把考试成绩发送给学生,成绩出来的时候大部分学生都赶着回家或者在回家的路上,所以用短信通知比较合适,而且短信价格低廉,费用可以忽略不计,如果要给几十个学生一个一个用手机打字发短信会累死人的。这个项目逻辑很简单:

1、从 “学生成绩数据库” 里读取学生成绩;
2、从 “学生个人档案数据库” 里读取学生手机信息;
3、通过 SMS 网关把学生成绩发送给学生手机。

这个项目需要架设一台 SMS 网关用来发送短信,Kannel 是目前 open source 里面最好的 SMS gateway,安装和使用都很方便,目前只支持 Linux 和 Unix-alike 操作系统。架设 SMS 网关前需要一张 SMS 卡以及一个可以把 SMS 和电脑联系起来的 PCMCIA 卡。VPSee 用的是 Vodafone 3G Wireless Card。下面介绍如何用 Kannel 网关发短信。

安装 PCMCIA 卡和驱动

首先需要把 3G 卡装到电脑上,如果是笔记本的话有 PCMCIA 卡插槽很方便,如果是台式机的话还需要一个集成 PCMCIA 的 PCI 卡。然后在 Linux 下装 3G 卡的驱动。

下载和编译

从 Kannel 官方网站上 kannel.org 下载 source code,然后编译安装。

继续阅读 »