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 电话和解决方案要便宜的多。

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


继续阅读 »

用 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,然后编译安装。

继续阅读 »