Clingを使ってAndroidでUPnP
AndroidからUPnP対応端末をサーチして、特定端末のIPアドレスを取得したい。
最初はUDPソケットでM-SEARCHマルチキャスト送信というやり方で実現を試みるも、うまくいかない。。
マルチキャスト送信はできてるっぽいんだけど、受信がうまくいかないんだよな~。
(←あとでわかったけど、エミュレータの場合はUDPマルチキャストが未サポートなのでそれが原因だったのかも)
というわけでアプローチをかえて、ライブラリを探してみることに。
Clingというライブラリがありました。
ライセンスはStable版の1.xはLGPLで、テスト版の2.xはLGPLかCDDLを選べます。
Clingはドキュメントが充実しているので、上記のやりたいことであればCling Core User Manual Chapter5 Cling and Androidを読んだり、サンプルコードを読めば実現できちゃうと思いますが、日本語の情報はあんまりないみたいなので、簡単にまとめておきたいと思います。
0.概要
ClingはAndroid上で動作する場合、UPnP周りの処理はサービスとして動作します。
そのサービスにActivityからbindし、必要な処理を行うというのが動作のイメージになります。
1.ライブラリ本体の取得・設定
コチラからライブラリ本体をDLします。
自分は「cling-distribution-1.0.5.zip」というやつをDLしました。
zipファイルを展開すると、coreフォルダの中にcling-core-1.0.5.jarとteleal-common-1.0.13.jarがあるのでそれをAndroidプロジェクトのlibsフォルダに格納し、ビルドパスを通しておきます。
cling-core-1.0.5.jarだけでは動かないので注意。
2.manifestの編集
Cling Core User Manual 5.1. Configuring the application serviceを参考に、manifestにパーミッションとサービスの定義を追加します。(←自分はパーミッションの追加をわすれ、ちょっとハマった。。)
3.Activityの編集
処理を行いたいActivityに、Cling Core User Manual 5.2. Accessing the service from an activityを参考に、サービスのbind/unbind、serviceConnection、Clingサービスの処理結果を受け取るlistenerを記述します。
非常にざっくりですが、こんな感じでやれば動作すると思います。
あと注意としては、さっきも少し触れたけど、エミュレータはUDPマルチキャストが未サポートなため、動作しないようです。(←User Manualにもかいてある)
ところでUPnPのjavaライブラリとしては、CyberLink for Javaの方が有名なんですかね?