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

利用 Android 和 Wi-Fi 做间谍相机

现在 iPhone 和 Android 上的应用程序如此丰富不是偶然的,在 iPhone 和 Android 上开发应用实在是太简单了,开发人员很容易就能上手。VPSee 花了两天的时间完成了一个 Android 上的中、日、英文本阅读器,还包括自动识别文本编码(不用自己调编码设定),触摸放大、翻页等功能,这在 Nokia Symbian 上是不可能的(至少两天内不可能完成),如果有人也有过痛苦的 Symbian 开发经历就会明白 VPSee 在说什么。现在 Android 在 Scripting Layer for Android (SL4A) 项目的帮助下能支持 Python, Perl, JRuby, Lua, BeanShell, JavaScript, Tcl 等脚本语言,我们安装 SL4A 后可以在 Android 上直接运行这些脚本,使得 Android 能支持更多编程语言、更加强大了。

利用 Android 和 Wi-Fi 做间谍相机的想法是这样的,在 Android 上装一个 web server 并用 Ruby 写个小小的 web app,通过浏览器和 wifi 访问这个 web server 和 web app,每次访问 web app 都会拍一张照片并更新 web server 上的照片。这样我们只需要把 Android 手机藏在某个地方,然后在电脑上就可以 “看” 到 Android 拍到的照片了~~(请保留邪恶的想法:D),以下操作在 VPSee 的 HTC Desire (Android 2.1) 上测试通过:

安装 SL4A 和 JRuby

首先到 SL4A 官方网站下载 sl4a_r2.apk 安装到 Android 上,然后点击 “menu” -> “View” -> “Interpreters”,然后再点击 “menu” -> “Add” -> “JRuby-1.4” 就会安装 JRuby for Android,安装成功后打开 SL4A 就会看到 hello_world.rb 和 toggle_airplane.rb 连个例子脚本,点击 “menu” -> “Add” 就会看到多了一个 “JRuby-1.4” 选项。

Ruby web app

接下来在自己电脑上写个 web app,并把 web app 拷贝到 Android 上,用 Ruby 写 web app 当然最好是用 Ruby on Rails 了,这里的应用没那么复杂,使用另一个轻量级 Ruby web 框架 Sinatra 就可以了。在桌面上创建一个 spycam 项目、创建相关目录、安装 sinatra:

$ cd /Users/vpsee/Desktop/
$ mkdir spycam
$ cd spycam
$ mkdir public
$ mkdir vendor
$ mkdir vendor/gems

$ gem install --http-proxy http://192.168.0.1:3128 sinatra
$ gem unpack sinatra --target=vendor/gems
Unpacked gem: '/Users/vpsee/Desktop/spycam/vendor/gems/sinatra-1.0'
$ gem unpack rack --target=vendor/gems
Unpacked gem: '/Users/vpsee/Desktop/spycam/vendor/gems/rack-1.1.0'

创建一个 spycam.rb 文件,并把以下内容拷贝过去(代码来自这篇文章):

$ vi spycam.rb

APP_DIR = File.expand_path File.dirname(__FILE__)
GEM_DIR = File.join(APP_DIR, 'vendor', 'gems')
PUBLIC_DIR = File.join(APP_DIR, 'public')

Dir.entries(GEM_DIR).each do |dir|
  $LOAD_PATH << File.join(GEM_DIR, dir, 'lib')
end

require "rack"
require "sinatra/base"
require "android"
DROID = Android.new

TEMPLATE = <<HTML
<!DOCTYPE html>
<html>
<head>
<title>Spy Camera - vpsee.com</title>
</head>
<body>
<a href="/"><img src="latest.png"></a>
</body>
</html>
HTML
class SpyCam < Sinatra::Base set :public, File.join(APP_DIR, 'public') get "/" do snapshot_path = File.join PUBLIC_DIR, 'latest.png' DROID.cameraCapturePicture snapshot_path TEMPLATE end end SpyCam.run!

运行

测试一下上面的 web app 和远程 WiFi 相机是否能拍照。用电脑通过 USB 连上 Android,拷贝上面的 spycam 下的 spycam.rb, public, vendor 到 Android 下的 sl4a/scripts,然后断开 Android USB 连接,运行 SL4A 执行 spycam.rb 脚本就会自动启动 WEBrick server 和运行 spycam.rb,WEBrick 是个提供 HTTP web services 的 Ruby 库,集成在 RoR 开发环境里用来测试程序,也是一个简单的 HTTP server,成功运行后显示应该如下:

Android WEBrick

在任何一台使用相同网络的电脑上打开浏览器访问 http://192.168.1.115:4567(Android 当前使用的 IP 地址是 192.168.1.115)就可以看到 Android 拍照了,每点击一次照片就会更新。

Android Spy Camera

用 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


继续阅读 »