Android によるネットワーキング

あなたの世界に接続する

Android はアプリケーション開発のためのリッチなプラットフォームであり、魅力的なユーザー・インターフェース要素とデータ管理機能を提供しています。Android では、世界のさまざまなネットワークに接続するアプリケーションを開発するために、豊富なネットワーキング機能を活用することができます。皆さんはどこに接続したいでしょうか。例えば皆さんは世界に対して、皆さんが現在行っていることのすべてを Twitter を使って伝えたいかもしれません。あるいは、近くのコインランドリーやデリのカウンターで自分の順番が来たことを通知して欲しいかもしれません。Android を世界に接続し、皆さんについて伝えることに関心がある読者は、この記事を読んでください。

Frank Ableson, Software designer

Frank Ableson はニュージャージー州北部の起業家、ソフトウェア開発者であり、モバイルおよび組み込みアプリケーション・ソフトウェアを専門としています。彼は現在、Android によるアプリケーション開発に関する本を執筆中です。この本は Manning Publications から出版される予定です。彼は組み込みシステムとワイヤレス通信、そしてカー・エレクトロニクスにプロとしての関心を持っています。彼の最大のファンは、彼の妻の Nikki と彼らの子供達です。



2009年 6月 09日

はじめに

この記事では「Develop Android applications with Eclipse」で説明された基礎を基に、Android のネットワーキング機能について詳しく探ります。そのなかで、楽しく有益なことをするために Android のネットワーキング機能を活用する方法を学びます。Android プラットフォームは Java™ 開発者にとって理想的なプラットフォームです。Java 開発者は既に持っているスキルを使ってモバイル (「組み込み」) プラットフォームに対してネットワーク接続を実現することができます。

まず、Android アプリケーションで利用できるネットワーキング機能を紹介し、続いて Android の基本的なネットワーキング機能について説明し、さらに実際のアプリケーション (ネットワーキング機能が必要で環境監視システムとともに使用するアプリケーション) について詳しく検討します。なぜこのような環境監視システムが重要になるのでしょう。その理由として、次のような場合を考えてみてください。私の友人が数週間、街を離れている間に、私に電話をかけてきて、彼の家にある物のなかで郵送して欲しいものがあると頼んできました。私が彼の家に行ってみると、配管が破裂していて暖房器具が壊れているという困った状況にあることに気付きました。もし温度監視システムが設置されていたなら、そうしたトラブルを防げたかもしれません。この記事では、そうした監視システムで Android がどのような役割を果たせるかを検証します。


Android のネットワーキング機能

Android は Linux® カーネルをベースにしており、豊富なネットワーキング機能を備えています。まだ Android SDK をインストールしていない場合には、この SDK をダウンロードしてインストールしてから、この記事を読み進め、サンプルを試す必要があります。

表 1 は Android SDK に含まれるネットワーキング関連のパッケージの一部を示しています。

表 1. Android SDK のネットワーキング・パッケージ
パッケージ説明
java.netネットワーキング関連のクラスを提供します (ストリームやデータグラム用のソケット、インターネット・プロトコル、汎用の HTTP 処理など)。このパッケージには多目的のネットワーキング・リソースが含まれています。経験の長い Java 開発者であれば、このおなじみのパッケージを使って即座にアプリケーションを作成することができます。
java.io直接のネットワーキング機能を提供するわけではありませんが、非常に重要なパッケージです。このパッケージに含まれているクラスは、他の Java パッケージで提供されるソケットや接続によって使用され、さらに (ネットワークとのやり取りに頻繁に発生する) ローカル・ファイルを扱う際にも使用されます。
java.nio特定のデータ型のバッファーを表すクラスが含まれています。このパッケージは Java 言語ベースの 2 つのエンドポイント間でのネットワーク通信の際に便利です。
org.apache.*HTTP 通信のための細かな制御や機能を提供する、いくつかのパッケージを表します。よく使われるオープンソースの Web サーバーとして、皆さんも Apache をご存じかと思います。
android.netコアとなる java.net.* クラスにはない、ネットワーク・アクセス用のソケットが含まれています。このパッケージには、従来のネットワーキング機能を超える機能を持った URI クラスが含まれています。この URI クラスは Android アプリケーションの開発で頻繁に使用されています。
android.net.httpSSL 証明書を操作するためのクラスを含んでいます。
android.net.wifiAndroid プラットフォーム上で WiFi (802.11 無線イーサネット) のあらゆる側面を管理するクラスが含まれています。ただし、すべての機器に WiFi 機能が搭載されているわけではありません (その具体例として、Motorola や LG といったメーカーの折りたたみ式携帯電話への搭載が進められている Android の事例があります)。
android.telephony.gsmSMS (テキスト) メッセージの管理と送信に必要なクラスを含んでいます。今後、GSM 以外のネットワークにも同様の機能を提供するために、他のネットワーク用のパッケージが導入されるでしょう (例えば CDMA 用の android.telephony.cdma など)。

上記のリストは完全なものではありませんが、これを見ると Android プラットフォームが持つ機能の概要を理解できるはずです。次のセクションでは簡単なネットワーキング機能の例をいくつか挙げます。


簡単なネットワーキング機能の例

Android をネットワークに接続することがどれほど容易かを示すために、この例では Web ページからテキストを抽出する方法を説明します。この例のソース・コードを「ダウンロード」してください。図 1 は、このアプリケーションの実際を示しています。

図 1. Web ページからテキストを取得する
Web ページからテキストを取得する

このセクションでは、このサンプル・アプリケーションを作成するために必要なコードを示します。最初に UI の部分を調べ、次にネットワーク関連のコードについて説明します。

UI 要素は以下の 3 つです。

  • 「EditText」は、ユーザーが Web ページに入力する際に使われます (図 1 とリスト 2 に示した Web ページは http://developer.android.com です)。
  • 「ボタン」は Web ページのテキストを取得するようにプログラムに命令するために使われます。
  • データが受信されると、そのデータは「TextView」に表示されます。

リスト 1 は、このアプリケーションの完全な UI レイアウトである main.xml ファイルを示しています。

リスト 1. main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<EditText 
android:layout_height="wrap_content"
android:id="@+id/address"
android:layout_width="fill_parent"
android:text="http://google.com"
>
</EditText>
<Button
 android:id="@+id/ButtonGo" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content"
 android:text="go!"
 >
</Button>
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#ffffff"
    android:textColor="#000000"
	android:id="@+id/pagetext"
    />
</LinearLayout>

リスト 2 は、この例で使用する Java コードを示しています。

リスト 2. GetWebPage.java
package com.msi.getwebpage;

import android.app.Activity;
import android.os.Bundle;
// used for interacting with user interface
import android.widget.Button;
import android.widget.TextView;
import android.widget.EditText;
import android.view.View;
// used for passing data 
import android.os.Handler;
import android.os.Message;
// used for connectivity
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;


public class GetWebPage extends Activity {
    /** Called when the activity is first created. */

    Handler h;
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final EditText eText = (EditText) findViewById(R.id.address);
        final TextView tView = (TextView) findViewById(R.id.pagetext);
        
        this.h = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                // process incoming messages here
                switch (msg.what) {
                    case 0:
                    	tView.append((String) msg.obj);
                    	break;
                }
                super.handleMessage(msg);
            }
        };
        final Button button = (Button) findViewById(R.id.ButtonGo);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
            	try	{
            		tView.setText("");
                // Perform action on click
                	URL url = new URL(eText.getText().toString());
                    URLConnection conn = url.openConnection();
                    // Get the response
                    BufferedReader rd = new BufferedReader(new 
InputStreamReader(conn.getInputStream()));
                    String line = "";
                    while ((line = rd.readLine()) != null) {
                		Message lmsg;
                        lmsg = new Message();
                        lmsg.obj = line;
                        lmsg.what = 0;
                        GetWebPage.this.h.sendMessage(lmsg);
                    }
            	}
            	catch (Exception e)	{
            	}
            }
        });        
    }
}

このコードは、いくつかの汎用領域に分割することができます。まずこのコードには、このアプリケーションで使われている UI、データの受け渡し、そしてネットワーキング関連のクラスを適切に参照するための、重要な (必須の) import 文がいくつかあります。ネットワーキング関連のコードはすべて、OnClickListenerOnClick メソッド内にあります。これらのコードは、ボタン (図 1go! というラベルのついたボタン) が選択されると呼び出されます。

URL クラスと URLConnection クラスの両方によって、ユーザーが選択した Web サイトへの実際の接続が行われます。BufferedReader インスタンスは Web サイトに接続することで受信されるデータの読み取りを行います。各行が読み取られるごとに、読み取られた行のテキストが TextView に追加されます。データは単純に直接 TextView に割り当てられるわけではありません (ただしこの例では単純に割り当てられているかもしれません)。ここではデザイン・パターンを導入し、メッセージ・オブジェクトを作成したらそれをハンドラーのインスタンスに渡すようにしています。この方法は UI を更新するための推奨の方法であり、複数のスレッドが並行で実行されている可能性のある実際のアプリケーションの場合は、特にお薦めです。

この例では、Android アプリケーションは、Apache や Internet Information Server (Microsoft® のサーバー上の IIS) などの HTTP Web サーバーと通信しています。このアプリケーションが HTTP ではなく TCP ソケットを直接操作していたとすると、アプリケーションの実装方法を変える必要があります。リスト 3 のコード・スニペットは、リモート・サーバーとやり取りする別の方法を示しています。このリストは別のスレッドとして実装されています。

リスト 3. Daytime クライアント
    public class Requester extends Thread {
        Socket requestSocket;
        String message;
        StringBuilder returnStringBuffer = new StringBuilder();
        Message lmsg;
        int ch;
        @Override
        public void run() {
            try {
                this.requestSocket = new Socket("remote.servername.com", 13);
                InputStreamReader isr = new InputStreamReader(this.requestSocket.
getInputStream(), "ISO-8859-1");
                while ((this.ch = isr.read()) != -1) {
                    this.returnStringBuffer.append((char) this.ch);
                }
                this.message = this.returnStringBuffer.toString();
                this.lmsg = new Message();
                this.lmsg.obj = this.message;
                this.lmsg.what = 0;
                h.sendMessage(this.lmsg);
                this.requestSocket.close();
            } catch (Exception ee) {
                Log.d("sample application", "failed to read data" + ee.getMessage());
            }
        }
    }

前の例と同じように、上記のコードはメッセージとハンドラーによる手法を使って呼び出し側にデータを返送し、UI の更新とその後の処理を行っています。リスト 1 のコードとは異なり、この例では HTTP サーバーとの通信を行わないため、URLConnection クラスを使っていません。その代わりに下位レベルの Socket クラスを使用し、ポート 13 でリモート・サーバーに対してストリーム・ベースのソケット接続を開いています。ポート 13 は昔ながらの「Daytime サーバー」アプリケーションです。

Daytime サーバーは、ソケット接続の要求を受け付けると、日付と時刻をテキスト・フォーマットで呼び出し側のソケットに送信します。データが送信されると、サーバーによってソケットが閉じられます。またこの例は InputStreamReader と特定の文字エンコーディングを使用する方法も示しています。

テキスト・メッセージの送信も Android を使って行うことができます。リスト 4 はこの例を示しています。

リスト 4. テキスト・メッセージを送信する
void sendMessage(String recipient,String myMessage) {
 SmsManager sm = SmsManager.getDefault();
 sm.sendTextMessage("destination number",null,"hello there",null,null);
}

テキスト・メッセージの送信は単純です。まず、静的なメソッド getDefault() を使って SmsManager への参照を取得します。次に sendTextMessage メソッドを呼び出します。以下はその引数です。

受信者の携帯電話番号
市外局番を含みます。
サービス・センターの電話番号
null を指定した場合、そのメッセージの処理にデフォルトのサービス・センターを使って構わないことを意味します。よほど特殊なアプリケーションでない限り、このパラメーターは null にします。
ペイロード
データが分割されて複数のメッセージになっても構わない場合を除き、メッセージの長さを 160 バイト未満にします。
待機中の Intent
メッセージが送信された場合、またはエラーが発生した場合に開始されるオプションとしての Intent です。この通知が必要ない場合には、このパラメーターの値として null を渡して構いません (Intent と Android の基本については「参考文献」を参照)。
送達 Intent
送達の確認が受信された場合に開始されるオプションとしての Intent です。送達通知が重要ではない場合には、このパラメーターの値として null を渡して構いません。

Web ページに接続する場合であれ、カスタムの TCP アプリケーションに接続する場合であれ、Android プラットフォームはそれらに対応することができ、またそうした処理を支援することができます。リスト 4 に示すように、テキスト・メッセージの送信は容易です。オプションの Intent パラメーターを使うと、メッセージが送信されて実際に送達されてからアクションを実行する、ということさえできます。これは強力な機能であり、すべてのモバイル・プラットフォームで利用できるわけではありません。

次のセクションでは、実際のアプリケーションの設計について簡単に調べます。


環境監視システムの概要

このシナリオでは、皆さんは施設管理者であるとします。会社が事務所として使用している建物がいくつかあり、それらを皆さんが管理しています。施設の管理はデータ・センターの管理と大きく異なることはありません。退屈な長い時間があるなかで、ときどき緊急の事態が発生して大騒ぎするといった具合です。皆さんはちょうど先日、給湯器の故障の後始末を監督する必要がありました。10 年間使われていた給湯器が故障し、古い PC やトレーニング・マニュアルなどで一杯の倉庫が水浸しになっていたのです。幸い皆さんは遠出していませんでした。もし遠出していたとすれば、状況は極めて酷いことになっていたはずです。この事故 (そしてこの事故と似た事例があったこと) をきっかけに、施設の状況の監視を支援するために Android を使うというアイデアが浮かびました。図 2 は、そうしたシステムの概略を示すブロック図です。

図 2. システムを監視するための概略ブロック図
システムを監視するための概略ブロック図

このアーキテクチャーは、マイクロコントローラーを使っていくつかの簡単なセンサーとやり取りし、データを収集するという、従来の手法です。収集されたデータはシリアル通信プロトコル (RS232 や RS485 など) を使ってコントローラーに送信されます。コントローラーはおそらく PC または同様のマシンです。次にこのデータは、ファイアーウォールを介してインターネット経由でアクセスされます。Android を搭載した携帯電話 (TMobile G1 など) との間で使用されるプロトコルは、HTTP または独自の仕組みです。

コントローラーと Android 搭載機器との間で送信されるデータは、以下の内容を示す基本情報です。

  • 水があるかどうか
  • 現在の温度
  • 消費電力
  • 何らかの汎用的なアナログ値またはデジタル値

なぜ消費電力を気にする必要があるのでしょう。1 つの理由としては単純に、誰かが電気を点けたままにしていると、電気代が上がるからです。別の理由は、もう少し深刻な問題に対応するためです。例えば大型の冷凍庫があるにもかかわらず電源が切れてしまっていると、費用のかかる厄介な状況に対処する羽目になるかもしれません。また別の例としては、エアコン用のブレーカーが落ちてしまい、コンピューター・ルームの冷房が止まっているかもしれません。

基本設計は有効なようです。図 2 で Android を使っている部分は、任意のモバイル・プラットフォームに置き換えることができます。しかし例えば、マイクロコントローラーを Android 搭載の装置に置き換えたらどうでしょう。次のセクションでは、このようにアプリケーションを拡張する方法について、そして Android にもっと重要な役割を持たせるとどんな機能を実現できるかについて説明します。


アプリケーションを拡張する

この記事で紹介した最初のアーキテクチャーでは、マイクロコントローラーが中心でした。マイクロコントローラーは形状やサイズが多種多様であり、Microchip による 6 ピンの「10F」部品もあれば、大量の周辺機器、ピン、コード空間などを備えた 32 ビットの巨大なものさえあります。もし、従来のマイクロコントローラーの代わりに Android を装置の中に入れてみたらどうでしょう。この方法はコストの点で一部のアプリケーションでは最初から検討の余地がないかもしれませんが、図 3 をよく眺めてこの方法の可能性を検討してみてください。

図 3. 装置の中に Android を使用した場合に考えられるアーキテクチャー
装置の中に Android を使用した場合に考えられるアーキテクチャー

組み込み用途に Android を採用すると、よりリッチなプログラミング環境で作業を行えるようになります。それまでと同じように湿度、温度、消費電力などの特性を監視できる一方、音声や映像、振動などの記録もできるようになります。またミニ・アラームやアクセス制御システム、そして環境監視ツールを実現することもできます。Android は十分にネットワークに対応しているため、コントローラー用の PC を使わずに直接ネットワークと通信できるようになります。

またこの手法によって、現場でソフトウェアを更新できるという、さらなるメリットもあります。例えば、この監視ソフトウェアに新しい機能を追加したいとします (さらには、この監視ソフトウェアのバグを修正したいとします)。従来のマイクロコントローラーによる手法では、そうしたことは可能であっても面倒であり、しかも非常に高い費用がかかったり、最悪の場合は不可能であったりします。Android を使用すれば、整然としていて大幅な柔軟性を備えたデプロイメント・モデルを実現することができます。

現在、Android は主に携帯電話上で実行されていますが、既にネットブックや他のプラットフォームにポーティングされています。この記事を読むことで、何らかのヒントが得られたようであれば幸いです。私は急いで現場に行き、私のシステムの動作を継続させなければなりません。いつ別の給湯器が故障するかもしれないのです。


まとめ

この記事では、Android によるネットワーキングの概要を学びました。作成できるアプリケーションの例として、Web サーバーとのやり取り、テキスト・メッセージの送信などについて説明しました。また、実際の環境監視システムに Android を接続する方法について調べました。そしてサンプル・コードにより、少し特殊なアプリケーション用に Android を拡張できる可能性について検討し、一例として組み込みコントローラーについて調べました。

では次回の記事にご期待ください。次回は Android ベースの携帯電話を使って簡単な監視システムを構築する方法について詳しく説明します。


ダウンロード

内容ファイル名サイズ
GetWebPage source codeos-android-networking_GetWebPage.zip14KB

参考文献

学ぶために

  • Develop Android applications with Eclipse」を読んでください。
  • Android 開発者のためのサイトでは、ドキュメントやダウンロード、ブログその他を提供しています。
  • Android のスポンサーである Open Handset Alliance についての資料を読んでください。Open Handset Alliance は技術やモバイル関係の 47 社で構成されており、モバイルにおける革新を加速するために、またリッチで安価な、そしてより良いモバイル・エクスペリエンスをユーザーに提供するために協力を行っています。
  • 『Unlocking Android』を読み、Android を詳しく学んでください。
  • Dalvik 仮想マシンについて学んでください。
  • Dalvik 仮想マシンの内部動作を解説したチュートリアルが YouTube に投稿されていますので、調べてみてください。
  • Unlocking Android: A Developer's Guide』は Android オペレーティング・システムと開発ツールについて、簡潔かつ実践的な解説をしています。
  • developerWorks podcasts ではソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
  • developerWorks の Technical events and webcasts で最新情報を入手してください。
  • developerWorks を Twitter でフォローしてください。
  • IBM オープンソース開発者にとって関心のある、世界中で今後開催される会議や業界展示会、ウェブキャスト、その他のイベントについて調べてみてください。
  • developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使った開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。
  • IBM とオープンソース技術、そして製品機能を調べ、学ぶために、無料の developerWorks On demand demos をご覧ください。

製品や技術を入手するために

  • Android SDK をダウンロードしてください。
  • 最新の Eclipse IDE をダウンロードしてください。
  • 皆さんの次期オープンソース開発プロジェクトを IBM ソフトウェアの試用版を使って革新してください。ダウンロード、あるいは DVD で入手することができます。
  • IBM 製品の試用版をダウンロードするか、あるいはオンラインで IBM SOA Sandbox を試し、DB2®、Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=407053
ArticleTitle=Android によるネットワーキング
publish-date=06092009