Cyber Link for JavaのAndroidのサンプル的な

こんな感じでDevice作りましたお

Descriptionは適当に書いてつくったお
なんかおかしいからURLBaseとかぐらいは自分で書いたほうがいいのかも

description.xml
<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<device>
		<deviceType>urn:nakamiri-ath-cx:AndroidDevice:1</deviceType>
		<friendlyName>Nakamiri Android UPnP server</friendlyName>
		<manufacturer>Nakamiri</manufacturer>
		<manufacturerURL>http://d.hatena.ne.jp/nakamiri/</manufacturerURL>
		<modelDescription>Nakamiri Android UPnP server by hoge</modelDescription>
		<modelName>1-00-00</modelName>
		<modelURL>http://d.hatena.ne.jp/nakamiri/</modelURL>
		<serialNumber>0000001</serialNumber>
		<UDN>RootDevice</UDN>
		<UPC>00000-00001</UPC>
	</device>
</root>
UpnpDevice
package cx.ath.nakamiri.nakamiriUpnpDevice;

import org.cybergarage.upnp.Device;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class UpnpDeivce extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try {
        	Device upnpDev = new Device(this.getResources().openRawResource(R.raw.description));
        	upnpDev.start();
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
    
    @Override
	public boolean onCreateOptionsMenu (Menu menu) {
		super.onCreateOptionsMenu(menu);
		
		MenuItem item0 = menu.add(0, 0, 0, "dododo");
		
		MenuItem item1 = menu.add(0, 1, 0, "exit");
		
		return true;
	}
	
	@Override
	public boolean onOptionsItemSelected (MenuItem item) {
		switch (item.getItemId()) {
		case 0:
			return true;
		case 1:
			finish();
			return true;
		}
		
		return true;
	}
}

Openswanインストールメモ

    • 2011/07/05 Last Update

Ubuntu 10.04.1 & xl2tpd-1.2.5 & Openswan U2.6.23/K2.3.32-32-generic-pae
で、Android向けに接続できるVPNサーバを立てようとしてガチで1週間ぐらい詰んだのでメモメモ

# apt-get install openswan xl2tpd

xl2tpd

/etc/xl2tpd/xl2tpd.conf
[global]
auth file = /etc/ppp/chap-secrets
; ここから下はデバッグ用かな?
debug avp = yes
debug network = yes
debug packet = yes
debug state = yes
debug tunnel = yes

[lns default]
ip range = 172.17.64.51-172.17.64.70
local ip = 172.17.64.50
require chap = yes
require authentication = yes
name = nakamiriVPNsrv
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.lns
length bit = yes
  • ip range: VPN鯖で割り振るIPの範囲
  • local ip: VPN鯖自身のLANのIP
  • nameはchap-secretsで指定するためのものっぽいので、自由に
  • 他は名前通りの機能かな?
  • length bitは何に使うのかわかりませんえん(´・ω・`)
/etc/ppp/chap-secrests
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
nakamiri        *       "moge"  *
  • 凡例どおりに書いちゃえば(・∀・)イイヨイイヨー
  • serverの所で、先程のファイルでnameで付けた名前で指定ができるみたいです

Openswan

/etc/ipsec.conf
version 2.0

config setup
	nat_traversal=yes
	virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
	protostack=netkey
	nhelpers=0

include /etc/ipsec.d/*.conf
  • virtual_privateはプライベートアドレスの範囲を指定するものっぽい(NATの判断をするためかな?)
  • oe=offはonだと動かなかったのでこめんとあうつ
  • nhelpers=0じゃないと動かなかったので書き足し
/etc/ipsec.secrets
%defaultroute %any : PSK "premoge"
  • 自分のIP、$defaultrouteでNICに指定されてるIPをもってくる
  • %anyは何でもってことなのかしら
  • ipsec showdefaultでデフォの設定が見れるみたい
/etc/ppp/options.l2tpd.lns
ipcp-accept-local
ipcp-accept-remote
require-mschap-v2
noccp
nodefaultroute
auth
crtscts
idle 1800
debug
lock
proxyarp
connect-delay 5000
logfile /var/log/xl2tpd.log
  • 殆どいみわかんねえお!
  • require-mschap-v2でMSCHAP-V2がつかえるらしいよ!
  • ログファイルはそうやってかきだすお!中身読んでもさっぱりわからんかったが!ksg!
/etc/ipsec.d/l2tp-psk.conf
conn L2TP-PSK-NAT
        rightsubnet=0.0.0.0/0
        also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
        authby=secret
        pfs=no
        auto=add
        keyingtries=3
        rekey=no

	ikelifetime=8h
	keylife=1h

        type=transport

	left=%defaultroute
        leftprotoport=17/1701

        right=%any
        rightprotoport=17/%any
  • rightsubnetで接続元のサブネットを指定して振り分けるみたい
  • 指定したサブネットを弾くとかに使うのかな?よくわからんでs
  • 二つ書いたけど、一つでもいいのかな?よくわからんでs
/etc/sysctl.conf

末尾に以下を追加

net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0

で、システムに適用
動くかどうか確認
FAILEDとかが出てきたらなんか怪しいよ

# sysctl -p
# ipsec verify

Windows

VPNサーバをNAT内(ルータ内)に設置したときは、Windows側でレジストリの設定が必要です。

  • Windows7
    • \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\PolicyAgent
    • ここに
    • DWORD値 で
      • AssumeUDPEncapsulationContextOnSendRule
      • 値は2 で設定して再起動することが必要みたいです。

ほげげ

Androidから中々つながらなくて苦労した(´・ω・`)
/etc/ipsec.confのoe=offあたりとか、nhelpersあたりが怪しいけど、結局再現しなかったりでわからず…。
とりあえずこれで、LAN内でのL2TP PSKはできたっぽい?

参考にしたサイト
https://ikochan.homelinux.com/trac/ubuntu/wiki/Openswan
Ken's Memo: andoridから自宅へのVPN
HowTo/openswan - Debian Wiki
他にもいっぱい参考にさせてもらったけど、ありすぎて(´Д⊂ モウダメポ

Cyber Link for Javaのインスコめも

Cyber Link for Javaのjarをダウンロード

http://www.cybergarage.org/twiki/bin/view/Main/CyberLinkForJava

XMLパーサをダウンロード

kXML

kXMLを使ったけれども、xmlpullに対応してればなんでもよさそう?

あとはビルドパスでライブラリ->外部Jarなりで尾張

package upnp;

import org.cybergarage.upnp.ControlPoint;
import org.cybergarage.upnp.device.SearchResponseListener;
import org.cybergarage.upnp.ssdp.SSDPPacket;

public class Control extends ControlPoint implements SearchResponseListener {

	public Control () {
		this.addSearchResponseListener(this);
		start();
		
		search("upnp:rootdevice");
	}
	
	public void deviceSearchResponseReceived(SSDPPacket pkt) {
		String uuid = pkt.getUSN();
		String target = pkt.getST();
		String location = pkt.getLocation();
		
		Out.println("uuid: " + uuid + " target: " + target + " loc: " + location);
		
	}

}

こんなソースで、mainのほうでインスタンス作ってやればrootdeviceはとってこれましたよ。
素晴らしいライブラリ過ぎて涙がでちゃう。

CyberLinkのドキュメント適当訳

俺用適当訳
ライセンス的に問題があったらすぐ消します。コメントなりで連絡いただけると幸いです…。

1, はじめに

UPnPアーキテクチャは、自宅でメディアサーバやメディアプレイヤーのようなデバイスの発見や操作を可能とするための、オープンなネットワークづくりに基づいたアーキテクチャです。

UPnPアーキテクチャは、GENA、SSDPSOAP、HTTPU、HTTPのようなたくさんのスタンダードなプロトコルに基づいたアーキテクチャです。
従って、あなたのUPnPデバイスをつくるためにはこれらのプロトコルを理解し、実装しなければなりません。

CyberLink for C はUPnP開発者のための開発パッケージです。CyberLinkは自動的にこれらのプロトコルを操作し、デバイスとコントロールポイントを素早く作ることをサポートします。

UPnPの詳しいことを知るには下のサイトとドキュメントを見てください。

2. セットアップ

このパッケージを使うため、JDKJREライブラリディレクトリにパッケージをコピーします。
例えば

cp ~~~


現在のパッケージはXMLSOAPリクエストをパースするための以下のパッケージが必要です。CyberLinkは以下のXMLパッケージを自動的にロードします。もしXMLパッケージをもってなければ、パッケージをインストールして下さい。

3. デバイス

3.1 クラス概要

下のStatic structure diagramはUPnPデバイスを作るためのCyberLinkの関係クラスです。デバイスはいくつかのデバイスとサービスが組み込まれ、サービスはいくつかのアクションと状態変数を持ちます。

3.2 Description

まず、UPnPデバイスを作るならデバイスとサービスのいくつかのdescription fileをつくらなければなりません。

rootデバイスはdescriptionを用いて作られたデバイスなら、自動的に追加されるためURLBaseエレメントを作るべきではありません。

デバイスと作るにはservice descriptionが必要とされますが、presentationURLとiconListは推薦オプションです。詳細はUPnP仕様書のdescriptionフォーマットを見てください。

3.3 初期化

UPnPデバイスを作るため、root descriptionファイルと共にデバイスクラスのインスタンスを作ります。作成されたデバイスはルートデバイスで、Device::start()を用いることのみでアクティブにすることができます。デバイスがスタートされたら、デバイスがUPnPネットワークにアナウンスされます。以下はデバイスの初期化例です。


InvalidDescriptionExceptionはdescriptionが正しくないときに発生します。getMessage()を使うと、例外の理由の詳細を知ることができます。

もうひとつの方法として、下記のようにdescriptionファイルの代わりに Device::loadDescription() と Service::loadSCPD() を用いてdescriptionをロードすることができます。ロードが失敗したとき、ローディングメソッドは例外が発生します。


activeなrootデバイスはいくつかのサーバプロセスをもっており、コントロールポイントからリクエストが送られた時自動的にレスポンスを返します。例えば、コントロールポイントがdescriptionファイルを得たとき、デバイスはHTTPサーバでdescriptionfileを返します。デバイスがスタートしたとき、マシンのHTTPサーバに使用可能なポートを自動的に検索します。

rootデバイスは以下のデフォルトパラメータと共に生成されます。これは、デバイスがスタートされる前に以下のメソッドによって変更することができます。

3.4 Notify

Device::start()を用いてUPnPネットワークにデバイスがスタートしたとき、自動的に ssdp::alive と共のnotifyメッセージを用いてアナウンスされます。Device::stop()を用いてデバイスが停止したとき、ssdp:byebyeを用いてメッセージが告知されます。Device::announce()とDevice::byebye()を用いてnotify messageを告知することができます。

コントロールポイントがM-SEARCHを用いてUPnPネットワークに検索リクエストを送信したとき、自動的にコントロールポイントへ検索レスポンスを送信します。デバイスは自動的にリース時間の中で告知を再送します。

3.5 組み込みデバイス

デバイスはいくつかの組み込まれたデバイスをもってるかもしれません。Device::getDeviceList()を用いることで組み込まれたデバイスリストを得ることができます。以下の例ではデバイスの中の全ての組み込みデバイスのfriendly nameを出力します。

Device::getDevice()を用いてfriendly nameかUDNを用いて組み込みデバイスを探すことができます。以下の例はfriendly nameによって組み込みデバイスを得ます。


とりあえずここまで

XMLDocument使うときのあれこれ

  • XPathを使ってXMLパースを行うとき
str = "XMLのStringほげほげ";

XmlDocument xml = new XmlDocument();
xml.loadXml(str);

xml.SelectSingleNode("/root/device/friendlyName");

みたいな感じでとりたかったんだけど、どうもXMLExceptionが出る。
よくよく確認してみたら

  • ~~~

みたいな値がありました。
コロンがついている値があるとXmlNamespaceManagerを指定してあげないと、パース時にエラーになってしまうぽい。

そんなわけで面倒な私はChildNodeをとってきてforeachでぶん回してNameで一致してるか確認する方法をとったのであった。まる

AndroidにOpenCV

そんなわけで入れるんですよ

Cygwinは入ってる前提で進めます


改造版NDKをダウンロード
http://www.crystax.net/android/ndk-r4.php

解凍して出てきた「android-ndk-r4-crystax」ディレクトリをCygwinのユーザホームディレクトリに放り込む。
# ホームディレクトリじゃないと、OpenCVコンパイル時にうまくいかなさそう
# どこいじるかわからないから適当に調べてね!

ホームディレクトリに.bashrc .bash_profileを作成

.bash_profileはこんな感じに編集

if [ -f $HOME/.bashrc ]; then
source $HOME/.bashrc
fi

.bashrcはこんな感じ

# lsの色つけ的な
alias ls='ls -F --show-control-chars --color=auto'

# ls のショートカット的な
alias l='ls'

# このへんでNDKのパスを通してる
export PATH=$PATH:~/android-ndk-r4-crystax/

パスが通ってるか確認

Nakamiri@NAKAMIRI-PC ~
$ ndk-build
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: /home/Nakamiri/OpenCV-2.2.0/android/build/jni/Android.mk
/home/Nakamiri/android-ndk-r4-crystax/build/core/add-application.mk:98: *** Android NDK: Aborting...    .  Stop.

OpenCVのダウンロード
http://sourceforge.jp/projects/sfnet_opencvlibrary/downloads/opencv-unix/2.2/OpenCV-2.2.0.tar.bz2/

解凍してまたホームディレクトリにぶち込む

あとは以下の感じにコマンド実行

Nakamiri@NAKAMIRI-PC ~
$ cd OpenCV-2.2.0/
$ mkdir build
$ cd build
$ cmake ..
$ make

で、終わったよー

というめもめも