AndroidでIP Multicastを使ってみる IP Multicast on Android

最近,慣れないJavaに悪戦苦闘しつつAndroidアプリ開発に取り組んでいます.ちょっとした習作としてIP Multicastを扱うアプリを書いてみましたので,そのご紹介をしたいと思います.

AndroidでIP Multicastを扱うには

まず,AndroidでIP Multicastを扱う方法を説明します.
AndroidでIP Multicastを扱う方法は,通常のUDP Socketを扱う場合とほぼ同じですが,次の点が異なります.

  • IP Multicastのパケットを受け取るために,”MulticastLock”を作成する必要がある
  • ソケットの生成はMulticastSocketを使用する

マルチキャストアドレス宛てパケットを受け取る

Androidでは通常,バッテリ消費の観点からマルチキャストアドレス宛てパケットはフィルタリングされます.そのため,マルチキャストアドレス宛てパケットを受信したい場合,そのことを明示する必要があります.

なお,この操作を行うには,パーミッション”android.permission.CHANGE_WIFI_MULTICAST_STATE”を付与する必要があります.

ソケットの生成とグループのJoin/Leave

これはAndroid固有の話ではありませんが,ソケットの生成にはjava.net.MulticastSocketを使います.

サンプルアプリ: IPv6MutlicastChat

IP Multicastを使用する簡単なサンプルとして,テキストチャットアプリを開発してみました.
このアプリでは,同一マルチキャストグループに参加している端末間でテキストチャットを行うことができます.各端末でアプリを起動し,同一グループ・ポート番号を指定した上で”Join”を押すと,複数端末間でテキストチャットが実現できます.

ss_chat ss_join

IPv6 Multicastでの利用を想定していますが,IPv6固有の処理を行っているわけではないので,IPv4 Multicastでも使用できるはずです.エラー処理等,改善すべき点が多々残っていますが,サンプルとしてひとまず動く状態にはなっています...

注意点

このアプリの実装では,ローカルでbindされるアドレスはマルチキャストアドレスのスコープによって自動的に選択されます.例え ば,”ff12::1″というグループアドレスを選択すると,リンクローカルアドレスがbindされます.一方,”ff1e::1″というグループアドレ スを選択すると,グローバルユニキャストアドレスがbindされます.
IPv6グローバルユニキャストアドレスが降ってこない環境で「実験だから...」と適当に”ff1e:…”のようなアドレスを入力すると,アドレスがbindできずエラーが表示されますので,ご注意ください.

冷静に考えれば当たり前の話なのですが,自分自身この問題で少し躓いてしまったので,自戒を込めて書いておきます.

ソースコード

ソースコードは下記リンクからtar.gz形式でダウンロードできます.Git repositoryからcloneすることもできます.

IPv6MulticastChat.tar.gz

ライセンスはMITライセンスとしています.ライセンスの範囲内で,ご自由にお使い下さい.

Yohei KANEMARU