Androidとその可能性
SIProp Project
代表：いまむらのりつな©SIProp Project, 2006-2008

1

自己紹介
氏名：今村謙之（いまむらのりつな）
年齢：29歳＋18ヶ月
IT業界歴：約7年
SIP歴：約5年
SIPropプロジェクト運営中

得意言語：Java、C
得意分野：SIP、ネットワーク層（開発～運用、セキュリティー）
特記事項：PCサーバ タワー8台運営中(自宅にて)©SIProp Project, 2006-20082

Agendaデモ
なぜ？
事例ポイント©SIProp Project, 2006-20083

シグナリングとセッション
シグナリング(呼制御)とは？
UA間などでロケーション情報をやり取りして、ユーザー間にセッションを確立する仕組み

セッションとは？
メディアの送信側と受信側の組み合わせ、および送信側から受信側へのデー
タストリームの流れ
出典：ソフトフロント社HPより©SIProp Project, 2006-2008

4

HTTPとSIPの違い
SIPの特徴(HTTPとの相違点)
ステートフルプロトコル
クライアントの状態がある

クライアント間通信
相手からの通知が可能
Cometのようなものロケーション情報
ルーティング可能
クロスドメイン間の通信が可能
JSONPのようなもの
出典：ソフトフロント社HPより©SIProp Project, 2006-2008

5

デモアプリ概要
Android用のチャットアプリケーション
特徴
Android（=Peer）間で直接通信する
Android（=Peer）間でセッションを確立する①セッションの要求②呼び出し中イベント③セッション確立④チャットメッセージ送受信©SIProp Project, 2006-2008

6

デモ見てね（はぁと©SIProp Project, 2006-20087なぜ、こんなものを？ 1/2
Androidの適用分野
スマートフォン、携帯ゲーム機
Windows Mobile や iPhone(iPod touch) の世界
サービス
ユーザエクスペリエンス

低価格携帯電話
世界レベルで携帯電話が普及する世界
丸山先生の資料参照のこと

家電向けプラットホーム
本格的に無線デバイスがPC化する世界
プラットホームの統一化
台数の桁が違う©SIProp Project, 2006-20088なぜ、こんなものを？ 2/2
ハードウェアとソフトウェア(物理領域)の融合
超低価格デバイス
無線デバイス版の100ドルPCのようなもの

単一機能デバイス
液晶が無くスピーカーだけのデバイスで、タクシーが近づいてきたら、タクシーからの無線を受けて、Beep音がなるデバ
イス

無線デバイスのメリット
移動し、肌身離さず持っている
車車間通信による、事故の回避用のデータ局所的なデータ処理だけできればよい⇒アドホックに通信することにメリットがある！
⇒デバイス間SNSを作りたい！
©SIProp Project, 2006-20089応用事例：概要
リアルタイム・イベント配信
Webサービスなどから拾った情報を、リアルタイムにAndroidへ配信するシステム

共同開発
GMOインターネット 次世代システム研究室様
powered by SIProp Project 「雷電」

Web&Jabberマッシュアップサーバ(雷電サーバ)

GMO様、サービスDB
Android端末
Android端末
ユーザA
ユーザB

©SIProp Project, 2006-200810

CMです。
書籍
俺流プロトコル実装入門
内容
nRFCの定義
Stackの設計・実装
Stackを利用したIMアプリ
実装

著作
SIProp Project

発売中
約500ページ
約4000円©SIProp Project, 2006-2008

11

開発Tips 1/2
デモアプリを作る上で、はまった箇所の解説
注意点
基本的なAndroid開発知識がある
ActivityやViewなどのGUI系の話はない
よって、Android開発入門的な話はありません
入門的な話は、『Android勉強会』で！

©SIProp Project, 2006-2008

12

開発Tips 2/2
jarの利用Java5.0でコンパイルしたjarのライブラリ

Serviceプログラミング
Activityとの連携方法

Socket, ServerSocketプログラミング
複数スレッドの扱い方

直接通信環境の構築
qemu の tap 機能の利用
Linux Zaurus 上 で、Android©SIProp Project, 2006-200813

jarの利用
書籍のCD-ROMに付属しているjarをリンク
Java5.0でコンパイルしたもの

結果
何事もなく、利用可能だった。
いうことなし。<(_ _)>java.io.InputStream;java.io.OutputStream;java.io.ByteArrayOutputStream;java.io.Serializable;java.net.InetAddress;
java.net.ServerSocket;
java.net.Socket;

java.util.Hashtable;java.util.HashMap;
java.util.ArrayList;
java.util.LinkedList;
java.util.Iterator;
java.util.ListIterator;
java.util.Collections;java.util.regex.Matcher;java.util.regex.Pattern;java.util.Random;©SIProp Project, 2006-2008

14

Serviceプログラミング 1/4
Serviceとは？
バックグラウンドプロセス
デーモンのようなモノ

使用例
音楽プレーヤー

今回のお題
AIDL(Android Interface Definition Language)を介して通信するIPC(Inter Process Communication)プログラ
ミング
基本的にはプリミティブな型しかつかえない
CPU依存、プログラム依存を排除する©SIProp Project, 2006-2008

15

Serviceプログラミング 2/4
AIDLファイルの定義
要は、コールバック用のAPIを書いたモノ
Activity用とService用の2つが必要
AIDLファイルの中身：
interface IIMServiceCallback {void onNewSession(String id, String session_id, String fromAddr);
void onProvisional(String id);void onConnected(String id);}

自動生成されたJavaファイルの一部：
public interface IIMServiceCallback extends android.os.IInterface {/** Local-side IPC implementation stub class. */public static abstract class Stub extends android.os.Binder implementsorg.siprop.pip.android.service.IIMServiceCallback {private static final java.lang.String DESCRIPTOR ="org.siprop.pip.android.service.IIMServiceCallback";/** Construct the stub at attach it to the interface. */public Stub() {©SIProp Project, 2006-200816

Serviceプログラミング 3/4
Activityでやること
Service側のAIDLを呼び出して、Activity側のAIDLを登録する
Activity側でのAIDLインプリメント：
private IIMServiceCallback mCallback = new IIMServiceCallback.Stub() {public void onNewSession(String id, String session_id, String fromAddr)
throws DeadObjectException {mHandler.sendMessage(………
}Activity側でのAIDL呼び出し：
protected void onCreate(Bundle icicle) {super.onCreate(icicle);// サービスを起動する。
bindService(new Intent(IIMService.class.getName()),
mConnection, Context.BIND_AUTO_CREATE);
protected ServiceConnection mConnection = new ServiceConnection() {public void onServiceConnected(ComponentName className, IBinderservice) {mService = IIMService.Stub.asInterface(service);mService.registerCallback(mCallback);©SIProp Project, 2006-200817

Serviceプログラミング 4/4
Activity側(クラス)Service側(クラス)①Stubを用いて、AIDLインタフェースを無名クラスとして実装
Activity側IADL

Service側IADL

Stubs(実体)

Stubs(実体)②ServiceConnection#onServiceConnectedの実装③Service側のIADL実体を受け取る。
IMService.Stub.asInterface()
Service側IADL
Stubs(実体)④Service側のIADL実体を受け取る
mService.registerCallback(mCallback);

Activity側IADL
Stubs(実体)＊正確には、独自で実装する必要がある©SIProp Project, 2006-2008

18

Socketプログラミング 1/3
java.netパッケージをそのまま利用可能
TCPによる接続

最大同時４接続
複数のスレッドが動く

ServiceやActivityは、インスタンスを生成したスレッド以外のスレッドから操作することは出来ない！！！
生成スレッドにアタッチする必要がある！
Handlerクラスを使用する©SIProp Project, 2006-2008

19

Socketプログラミング 2/3
Agent(Socket待ち受けスレッドを保持しているクラス)のコールバック用メソッドを変更
コールバック対象のインスタンスを、Handerにする
コールバック用のメソッドとして、Handler#sendMessage(Message)を用いる。
変更前：
public void incomingINVITE(Call c, PIPRequest request) {listener.onNewSession(c.getCallId(), request);}変更後：
public void incomingINVITE(Call c, PIPRequest request) {handler.sendMessage(handler.obtainMessage(0, 0, 0,
new EventMessage(IMEvent.onNewSession,new Object[]{c.getCallId(), request})));}©SIProp Project, 2006-2008

20

Socketプログラミング 3/3
Service内にHandlerを生成して、ここでコールバック先のメソッドを選択するように変更
Handlerは、Serviceのインスタンス生成時に生成する必要がある##Service内
private Handler mHandler = new Handler() {@Override
public void handleMessage(Message handlerMessage) {// EventMessageを取り出す。
EventMessage msg = (EventMessage)handlerMessage.obj;
Object[] objs = msg.getArgs();// イベントの種類により、IMServiceのコールバック先メソッドを選択する
switch (msg.getEventType()) {case onNewSession:// 引数と共に、コールバックする
imService.onNewSession((String)objs[0], (PIPMessage)objs[1]);break;(以下略)©SIProp Project, 2006-200821

直接通信環境の構築 1/3
qemu の tap 機能の利用
ホストOS上の tap デバイスとブリッジすることにより、ゲストOS(Android)のNICが、あたかもホストOS側のNICのように使用できる機能©SIProp Project, 2006-200822

直接通信環境の構築 2/3
1. Android上のNIC設定の書き換え
1. etc/qemu-init.sh の編集
例：
ifconfig eth1 192.168.1.2 netmask 255.255.255.0 up
route add default gw 192.168.1.1 dev eth1

2. ホストOSの tap と ブリッジ デバイスの設定
例：
brctl addbr br0
tunctl -u $USER -t net_android
brctl addif br0 eth0
brctl addif br0 net_android3. Androidのqemu起動オプションの変更${android_sdk}/tools/emulator -console -qemu -net user -net nic -net
nic,vlan=1 -net nic -net tap,vlan=1,ifname=net_android©SIProp Project, 2006-200823

直接通信環境の構築 3/3
Linux Zaurus 上 で、Androidcortez氏が、開発しているZaurus上で動作する
Androidパッケージを利用
http://www.omegamoon.com/blog/static.php?page=ZaurusA
ndroid特徴
Zaurus上に、専用のLinuxがインストールされる
Zaurus Linuxには、リーチ不可能

qemu上ではなく、chrootによるjail上で動作ベースOS上のリソースを利用できる©SIProp Project, 2006-200824

ご静聴ありがとうございました。

<(_ _)>
http://www.siprop.org/
Blog: http://noritsuna.siprop.org/©SIProp Project, 2006-200825