iT邦幫忙

DAY 19
3

回應鐵人賽的文章變鐵人系列 第 19

[Reply] 15分鐘用ruby把android手機變成遠端間諜相機

回應 lucius Android 開發心得
以及 ataru 所分享的 Scripting Layer for Android(SL4A)
這篇也是有趣的具體應用。

Ruby已能在Android上發揮大作用了,
但沒人知道這件事。

現在可以在Android的裝置上寫ruby的應用程式,
而且不需裝任何的SDK,
也不需要裝那龐大的Eclipse的環境,
當然也不需要寫任何的Java程式。

你可能聽過 Ruboto,但Damon Kohler及其團隊,
android-scripting 已改善了SL4A,
增加了一堆的特點並且穩定。

Scripting Layer for Android (SL4A, formerly known as Android Scripting Environment or ASE) brings scripting languages to Android by allowing you to edit and execute scripts and interactive interpreters directly on the Android device. These scripts have access to many of the APIs available to full-fledged Android applications, but with a greatly simplified interface that makes it easy to get things done... Python, Perl, JRuby, Lua, BeanShell, JavaScript, Tcl, and shell are currently supported, and we're planning to add more.

甚至支援其他程式當成APK使用,
所以可用的程式語言及相關附屬,
對使用者完全是通透的。

我們想在Android上跑一些簡單的ruby程式,
但若要跑完整而簡單的應用程式,行嗎?
讓我們來建個間諜相機的應用程式,
好知道誰從我們辦公室中偷走什麼東西。
程式應可快照出相機所見的情況,
或者可隨時指定更新快照。

我們需要用簡單而輕量的ruby框架。
Sinatra是相當容易用,
且能在較舊的Android裝置上跑得動。

同樣地,
我們也需要簡單而輕量且是純ruby的網站服務。
WEBrick是純ruby所寫的,
也是標準函式庫的一部份,
在Android也跑得夠快。

首先,在桌電或筆電裡寫程式,
還不需要用到手機。

開始一個新的Sinatra的專案
怎麼是Sinatra?
因為我們無法在Android的手機裡安裝rubygems,
所以需要把Sinatra及其相關的附屬套件,
跟著所寫的應用程式包在一起。

因為我們將在Android上跑JRuby,
我們不能用任何是C來產生的函式庫,
否則會與JRuby不相容。

建目錄給gems及快照

mkdir public
mkdir vendor
mkdir vendor/gems

要用到的gems複製到你所做的gems

$ gem install sinatra
$ gem unpack sinatra --target=vendor/gems
Unpacked gem:'/spycam/vendor/gems/sinatra-1.0'
$ gem unpack rack --target=vendor/gems
Unpacked gem:'/spycam/vendor/gems/rack-1.1.0'

建立應用程式
產生一個spycamera.rb在專案目錄中。

首先把一些重要的目錄名稱設到程式中的常數。
當在SL4A下跑的時候,
需要確切知道這些目錄的路徑所在。

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

也更新載入路徑,
好讓JRuby能找到我們所做的gems。

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

載入Sinatra之前,要先載入rack,
避免在SL4A產生錯誤。

require "rack"
require "sinatra/base"

最後需要SL4A裡的Android API界面,
這可讓我們做API的叫用,
像是叫相機拍照及儲存。

require "android"
DROID = Android.new

建簡單的HTML的樣版。
樣版顯示存在 putlic/latest.pn 的快照。
如果點選快照,
就會照新的照片且更新網頁。

TEMPLATE = <<HTML
  
  
    
      <title>Android Camera</title>
    
    
        <a href="/"><img src="latest.png"></a>
    
  
HTML

最後建立一個小的Sinatra應用程式,
來照相、儲存,並透過樣版網頁顯示出來。

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!

安裝(部署)應用程式
現在終於用到手機,
先在Android裝置裝SL4A(r1 APK在)。
跑SL4A,到interpreters選單,安裝JRuby。

裝好JRuby,就可把你的應用程式裝在手機裡。

用USB連結你的手機到開發程式的電腦,
複製寫好的程式到手機中的SL4A的script目錄。
在安裝好SL4A時,
會有一些ruby的範例程式,可以刪掉。

從SL4A 跑spycam.rb

把你這個間碟相機放在某地方,
開啟你的瀏覽器到http://手機的IP:4567/,
就可以透過網路連到手機。

進一步閱讀
可看看Github上的Broadcast
是更多相關功能給Android用的web應用程式。
透過http可以遠端監控、控制,
像是位置追蹤,遠端文字發聲(text-to-speech?),
及遠端檔案管理。

此間諜相機應用程式的原始碼在github 的spycam 專案裡。

也參考一下:
SL4A Home Page
My Presentation on Broadcast and Ruby-on-Android at RIRUG

本文簡譯自 Turn your Android Phone Into a Remote Spy Camera with Ruby in 15 Minutes

系列文章


上一篇
[Reply] 利用Python快速分享Linux中的檔案
下一篇
[Reply] 利用倚天字型畫中文 ascii art (文字畫)
系列文
回應鐵人賽的文章變鐵人30

1 則留言

0
SunAllen
iT邦研究生 1 級 ‧ 2010-10-19 10:10:20

沙發

我的...爛...moto..新手機,已經不需要用到USB傳輸線了,鐵人賽結束後,會來試試twtw大大這一篇。喜歡
讚

我要留言

立即登入留言