2013年6月26日水曜日

Android用にBouncy CastleのjarをPCにインストールする

Androidアプリ向けの証明書をアレするのにBouncy Castleのjarが必要なわけですが、、、
最新版はここからダウンロードできます。

しかし、現状最新版であるRelease 1.49のbcprov-jdk15on-149.jarを使ってBouncy Castle形式のキーストア(.bks)を作ってみてアプリで使おうとしたところ、、、

wrong version of keystore
というエラーがでます。

どうやら、1.49ではなくて1.46を使うと良いようです。
Release 1.46のリンクは見当たりありませんでしたが、一応、ここからダウンロードできます。


さて、bcprov-jdk15on-146.jarのインストール方法です。
こちらの記事で紹介した方法でJDK6がインストールされているUbuntuを対象としますが、他でも大体同じでしょう。
$ cd /usr/lib/jvm/java-6-oracle/
(JDKのインストールディレクトリで作業を行います。)
$ sudo cp ~/Download/bcprov-jdk15on-146.jar jre/lib/ext/
(ダウンロードしておいたBouncy Castleのjarをjre/lib/ext/ディレクトリにコピーします。)
$ sudo vi jre/lib/security/java.security
(下の方にスクロールしていって、下記のような記述の箇所の一番下に追加します)
#
# List of providers and their preference orders (see above):
#
security.provider.1=sun.security.provider.Sun
~(略)~
security.provider.9=org.bouncycastle.jce.provider.BouncyCastleProvider
(↑の一行を追加して保存。数字の箇所は適当に。。。)


これで、keytoolにて、
-provider org.bouncycastle.jce.provider.BouncyCastleProvider -storetype BKS
といったオプションを付けて使えるようになるはずです。
(たぶんあってるはず。実践方法はまた別途ということで...)


2013年4月21日日曜日

Fedora 18でBluetooth 4.0対応マウスを接続してみよう

前回の続きになります。

今回はBlueZ 5.xを実際に使ってみよー、というわけです。
(ちなみに、現在のところ最新版であるBlueZ 5.4がリリースされていました。
5.4のビルド方法は前回と一緒です。使い方も一緒です。)

さて、Bluetooth 4.0の対応の機器が必要なわけですが、
買ってきたのはiBUFFALOのBSMBB09DSBKというマウスとUSBドングルのセットです。
(他にBluetooth 4.0対応のマウスとしては、マッドキャッツのM.O.U.S.9がありますが、こちらは試してみたところ今回の手順では接続できませんでした。。。高かったのにー!)

このUSBドングルとのセットという点が結構重要だったりします。
一応、Windows 7では付属のドライバをインストールして接続できることは確認の上、いっちょLinuxでも動かしてみましょう...

試行錯誤
まずはBlueZ 5.xを使うに当たっての情報についてですが、、、これがまた情報が少ない。
公式サイトのBlueZ 5.0のリリースノートBlueZ 5のAPIとポーティングガイドぐらいしか見当たりませんでした。

ともあれ、ポーティングガイドに掲載されているテスト用スクリプトというやつを使うのが一番簡単なようです。

まずは、マウス付属のUSBドングルをPCに接続してBluetoothアダプターを起動してやります。
$ su
# hciconfig

hci1: Type: BR/EDR Bus: USB
   BD Address: 00:1B:DC:xx:xx:xx ACL MTU: 310:10 SCO MTU: 64:8
   DOWN
   RX bytes:501 acl:0 sco:0 events:23 errors:0
   TX bytes:369 acl:0 sco:0 commands:22 errors:0

hci0: Type: BR/EDR Bus: USB
  BD Address: 00:26:83:xx:xx:xx ACL MTU: 1022:8 SCO MTU: 121:3
  UP RUNNING PSCAN
  RX bytes:1006 acl:0 sco:0 events:48 errors:0
  TX bytes:2387 acl:0 sco:0 commands:48 errors:0
※ここから先はすべてルート権限で実行していきます。

私のPCにはマザーボード内蔵のBluetoothが載っていたりしますので、Bluetoothアダプタが2つ見えています。番号が大きいhci1が後から接続したUSBドングルということになっています。

通常(BlueZ 5のインストール後では)、USBドングルを接続しただけではDOWN状態になっているはずですので、次のコマンドでUPさせます。
# hciconfig hci1 up
# hciconfig
hci1: Type: BR/EDR Bus: USB
   BD Address: 00:1B:DC:xx:xx:xx ACL MTU: 310:10 SCO MTU: 64:8
   UP RUNNING PSCAN
   RX bytes:1026 acl:0 sco:0 events:50 errors:0
   TX bytes:1008 acl:0 sco:0 commands:49 errors:0

...略

UP RUNNING状態になりましたね。

続いてはポーティングガイドにあるDevice Discoveryを行ってみます。
BlueZ 5.3のソースツリーに移動し、
# cd work/bluez-5.3
(BlueZ 5.3のソースツリーへの移動。)
# cd test
# ./test-discovery -i hci1
(Bluetoothアダプタが複数ある場合は、-iオプションでアダプタを指定します)

これによりBluetoothのスキャンが始まります。(止めない限り続きますので、止める場合はCtr+Cです。)

スキャンを続けている状態で、マウスの電源を入れて、裏にあるペアリングボタンを5秒程押してペアリング状態にします。(緑のLEDが点滅)
すると、、、
[ 00:1B:DC:yy:yy:yy ]
   Name = BSMBB09DS
   Alias = BSMBB09DS
   Logged = True
   Adapter = /org/bluez/hci1
   Appearance = 962
   LegacyPairing = 0
   Paired = 0
   Connected = 0
   UUIDs = dbus.Array([dbus.String(u'00001812-0000-1000-8000-00805f9b34fb')], signature=dbus.Signature('s'), variant_level=1)
   Address = 00:1B:DC:yy:yy:yy
   RSSI = -64
   Icon = input-mouse
   Trusted = 0
   Blocked = 0
という感じでマウスが検出されてきました。見つかったらCtrl+Cで止めましょう。
(※MACアドレスは例として載せていますので、以降の手順では、スキャンによって見つかったMACアドレスで置き換えてください。)

続いては見つかったマウスに対するペアリングと接続です。
次のコマンドで、
# ./simple-agent -i hci1 00:1B:DC:yy:yy:yy
Agent registered
Device paired
ペアリングが成功したようです。マウスのLED点滅が消えます。

試しに
# hcitool con
Connections:
    
< Unknown 00:1B:DC:yy:yy:yy handle 43 state 1 lm MASTER AUTH ENCRYPT
接続まで完了している様子。。。しかし、マウスは動かず。。。

なぜだー!だいぶ長いこと悩んでいましたが、、、マウスを動かすにはUHIDが必要です。

接続手順
uhidドライバを探しましょう。Fedora 18ではカーネルモジュールとしてインストール済みでした。
# locate uhid.ko
/usr/lib/modules/3.6.10-4.fc18.x86_64/kernel/drivers/hid/uhid.ko
/usr/lib/modules/3.8.8-202.fc18.x86_64/kernel/drivers/hid/uhid.ko

こいつをinsmodしてやります。
# insmod /usr/lib/modules/3.8.8-202.fc18.x86_64/kernel/drivers/hid/uhid.ko
Kenrelのバージョンにあったものを使いましょう。(大体、新しい方でOK)

マウスの方はもう一度ペアリングからやり直しです。
ペアリングを解除してやります。
# ./test-device -i hci1 remove 00:1B:DC:yy:yy:yy

スキャンから手順をやり直します。
# ./test-discovery -i hci1
(略)
Ctrl+C
# ./simple-agent -i hci1 00:1B:DC:yy:yy:yy

はい!マウス動きましたー!

めでたし、めでたし。。。

そんなことぐらい、ちゃんとドキュメントに書いておいてくれよー!

以上。

2013年4月7日日曜日

Fedora 18でBlueZ 5.3をビルドしてみよう

LinuxではBlueZ 5.0で、Bluetooth 4.0のLEモードが実装されています。
ですが、現状のところBlueZ 5.xのパッケージが用意されているディストリビューションはありません。

そんなわけで、とりあえずビルドしてみましょう。

今回使うのは、Fedora 18。64ビット版の(Live-CDFedora-18-x86_64-Live-Desktop.iso)をVMware仮想マシン上にインストールしました。

インストールに関しては省略します。まあ、特殊なことは何もありません。普通にインストールしましょう。
ちなみに、VMware上でインストールがうまくいかない(画面が正常に表示されない)場合には、"3Dグラフィックのアクセラレーション"をOFFにしておくと良いようです。

インストール後は、一旦UPDATEを行ったのち、BlueZのビルドに必要なパッケージを追加でインストールします。
$ su
# yum install gcc libusb-devel dbus-devel glib2-devel libudev-devel libical-devel readline-devel

vmware-toolをインストールしたい場合は下記も追加します。
# yum install kernel-devel

あと追加でwgetも。
# yum install wget
# exit


bluezのソースコードを入手します。公式のHPより現状最新のbluez-5.3をダウンロードしてきます。
$ wget http://ftp.kernel.org/pub/linux/bluetooth/bluez-5.3.tar.xz

展開します。
$ xz -d bluez-5.3.tar.xz
$ tar xvf bluez-5.3.tar

ビルド
$ cd bluez-5.3
$ ./configure
$ make

続けてインストールしますが、これを行うとプリインストールされているBluetoothアプレットは使えなくなりますのでご注意。
$ su
# make install

動作確認するためには、一旦再起動します。

再起動後、試しにhcitoolコマンドを打ってみます
$ hclitool
...
lescan
lewladd
...

LE系のコマンドが追加されていますね。


さて、 続きはまた今度。

2013年3月3日日曜日

pandaboard ESで4AJ.2.2(Android JB)を動かしてみよう

Omappediaで公開されたpandaboard向けの
4AJ.2.2 OMAP4 Jelly Bean Panda Notes
を実践してみたレポートでございます。

大まかな手順については、以前の4AI.1.4と同じですが、細々と変わってる部分もありますので、また一通り書いておきます。

使うのはUbuntu 12.04(64bit版)と、pandaboard ESです。


環境準備
手順の通りでOK。

まずは以下のパッケージをインストールします。
$ sudo apt-get install git-core flex bison gperf libesd0-dev zip gawk ant libwxgtk2.6-dev zlib1g-dev build-essential tofrodos
$ sudo apt-get install lib32readline6-dev libstdc++6 lib32z1 lib32z1-dev ia32-libs g++-multilib libx11-dev lib32ncurses5-dev uboot-mkimage

追加で
$ sudo apt-get install gcc-4.4 gcc-4.4-multilib g++-4.4 g++-4.4-multilib

手順には載ってませんが、ビルドが通らないため以下も追加で
$ sudo apt-get install libxml2-utils xsltproc kpartx

armのツールチェインのインストールについては、下記の手順を例に。
$ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package6488/public/arm-none-linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ sudo mkdir -p /opt/toolchains
$ sudo tar jxvf arm-2010q1-202-* -C /opt/toolchains/
/opt/toolchains/arm-2010q1/にインストールされます。

repoツールの入手
$ mkdir ~/bin -p
$ sudo apt-get install curl
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ export PATH=~/bin:$PATH

JDK6についてはこちらを参照。


ソースツリーのダウンロード
ここは手順通りでOKです。

まずはAndroidのソースツリーのダウンロード。
適当なワーク用ディレクトリ下にて、
$ mkdir -p 4AJ.2.2; cd 4AJ.2.2
$ export YOUR_PATH=`pwd`
$ mkdir -p mydroid; cd mydroid
$ export MYDROID=`pwd`
$ repo init -u git://git.omapzoom.org/platform/omapmanifest.git -b 27.x -m RLS4AJ.2.2_JellyBean.xml
$ repo sync
回線によっては半日近くかかりますので、気長に待ちましょう。

続いてはKernel。githubに変わっていますね。
$ cd ${YOUR_PATH}
$ git clone git@github.com:icepeda/omap.git kernel/android-3.0
$ cd kernel/android-3.0
$ git fetch origin icepeda-panda-4aj22:master
$ git checkout master
Permission denied (pubickey).
と怒られてしまった場合は、こちらを参照。

続いてはU-boot
$ cd ${YOUR_PATH}
$ git clone git://git.omapzoom.org/repo/u-boot.git u-boot
$ cd u-boot
$ git checkout 2af35fca236557add6fdd33b836bf5c64455ac8f

続いてはX-loader
$ cd ${YOUR_PATH}
$ git clone git://git.omapzoom.org/repo/x-loader.git x-loader
$ cd x-loader
$ git checkout 4975b24da3887edff5cd24e44ca7cb4013f04239

パッチあて
こちらも基本手順の通りでOK。

まずはX-loaderへのパッチあて。
$ cd ${YOUR_PATH}/x-loader
$ wget https://gforge.ti.com/gf/download/frsrelease/961/6228/xloaderpanda.patch
$ git am xloaderpanda.patch

続いてはU-bootへのパッチあて
$ cd ${YOUR_PATH}/u-boot
$ wget https://gforge.ti.com/gf/download/frsrelease/961/6229/ubootpanda.patch
$ git am ubootpanda.patch

Kernelへのパッチあては必要なし
最後はAndroidへのパッチあて。
$ cd ${MYDROID}/device/ti/panda
$ git fetch git@github.com:icepeda/panda.git icepeda-panda-4aj22:master
$ git checkout master
$ cd ${MYDROID}/device/ti/proprietary-open
$ wget https://gforge.ti.com/gf/download/frsrelease/961/6240/proprietaryopenpanda.patch
$ git am proprietaryopenpanda.patch
$ patch -p1 < devicepanda3.patch
$ cd ${MYDROID}/hardware/ti/wlan
$ wget https://gforge.ti.com/gf/download/frsrelease/961/6239/hardwarepanda.patch
$ git am hardwarepanda.patch
$ cd ${MYDROID}/hardware/ti/dvp/
$ wget https://gforge.ti.com/gf/download/frsrelease/1021/6404/hardwarepanda2.patch
$ git am hardwarepanda2.patch
最後のパッチだけ手順とは当てる場所が異なっていますので注意。


ビルド
面倒なのでスクリプトを書きましょう。(単なるコピペですが。)

まずは環境変数のセット。下記をbuildenvというファイル名で保存しましょう。
#common
export YOUR_PATH=`pwd`
export PATH=$PATH:/opt/toolchains/arm-2010q1/bin
export MYDROID=${YOUR_PATH}/mydroid
mkdir -p $MYDROID/logs
export CROSS_COMPILE=arm-none-linux-gnueabi-
export PATH=${YOUR_PATH}/u-boot/tools:$PATH
 
#for WLAN Driver
export KERNEL_DIR=${YOUR_PATH}/kernel/android-3.0
export KLIB=${KERNEL_DIR}
export KLIB_BUILD=${KERNEL_DIR}
 
#for SGX Driver
export KERNELDIR=${YOUR_PATH}/kernel/android-3.0
X-loaderのビルドを行うbuild_xloader.shです。
#!/bin/bash
 
. buildenv
 
cd ${YOUR_PATH}/x-loader
make distclean
make ARCH=arm omap44XXpanda_config
make ift 2>&1 |tee $MYDROID/logs/x-loader_make.out

U-bootのビルドを行うbuild_uboot.shです。
#!/bin/bash
 
. buildenv
 
cd ${YOUR_PATH}/u-boot
make distclean
make ARCH=arm omap44XXpanda_config
make 2>&1 |tee $MYDROID/logs/u-boot_make.out

KernelとModuleのビルドを行うbuild_kernel.KernelとModuleのビルドを行うbuild_kernel.shです。
#!/bin/bash
 
. buildenv
 
cd ${YOUR_PATH}/kernel/android-3.0
#make ARCH=arm distclean
make ARCH=arm panda_defconfig
make ARCH=arm uImage 2>&1 |tee $MYDROID/logs/kernel_make.out
make ARCH=arm modules 2>&1 |tee $MYDROID/logs/kernel_modules.out
WLAN Driverのビルドを行うbuild_wlan_driver.shです。
#!/bin/bash
 
. buildenv
 
cd $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx
make ARCH=arm 2>&1 |tee $MYDROID/logs/wlan_driver_make.out

Androidのビルドを行うbuild_android.shです。
#!/bin/bash
 
. buildenv
 
cd $MYDROID
source build/envsetup.sh
lunch full_panda-eng
#make clean ;#(required for rebuild only)
make HOST_CC=gcc-4.4 HOST_CXX=g++-4.4 HOST_CPP=cpp-4.4 -j4 2>&1 |tee $MYDROID/logs/android_make.out

OMAP4OMAP4に搭載されているGraphicアクセラレータ用のSGX Driverをビルドするbuild_sgx_driver.shです。
#!/bin/bash

. buildenv

if [ ! -d $MYDROID/device/ti/proprietary-open/omap4/sgx_src/eurasia_km ]; then
   cd $MYDROID/device/ti/proprietary-open/omap4/sgx_src
   tar xzf eurasia_km.tgz
fi

cd $MYDROID
source build/envsetup.sh
lunch full_panda-eng

cd $MYDROID/device/ti/proprietary-open/omap4/sgx_src/eurasia_km/eurasiacon/build/linux2/omap4430_android
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- TARGET_PRODUCT="blaze_tablet" BUILD=release TARGET_SGX=540 PLATFORM_VERSION=4.0
最後は、書き込むイメージを一か所にまとめるbuild_img.shです。
#!/bin/bash

. buildenv

#Preparing Android binaries
export BOARD_TYPE="panda"

cd $MYDROID/out/target/product/$BOARD_TYPE
mkdir -p system/lib/modules
cp $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx/compat/compat.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx/net/wireless/cfg80211.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx/net/mac80211/mac80211.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx/drivers/net/wireless/wl12xx/wl12xx.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat_wl12xx/drivers/net/wireless/wl12xx/wl12xx_sdio.ko system/lib/modules/

cp $MYDROID/out/target/product/$BOARD_TYPE/target/kbuild/pvrsrvkm_sgx540_120.ko system/lib/modules/

#Updating Ducati
cd ${MYDROID}/out/target/product/panda/system/vendor/firmware/
rm ducati-m3.bin
wget https://gforge.ti.com/gf/download/frsrelease/997/6342/4AJ.2.2_Blaze_ducati-m3.bin
mv 4AJ.2.2_Blaze_ducati-m3.bin ducati-m3.bin

#Preparing images
cd $YOUR_PATH
mkdir -p omap4_sd_files_$BOARD_TYPE
cd omap4_sd_files_$BOARD_TYPE
cp -f $MYDROID/out/host/linux-x86/bin/fastboot .
cp -f $MYDROID/out/host/linux-x86/bin/mkbootimg .
cp -f $MYDROID/out/host/linux-x86/bin/simg2img .
cp -f $MYDROID/out/host/linux-x86/bin/make_ext4fs .

cp -f ${YOUR_PATH}/x-loader/MLO .
cp -f ${YOUR_PATH}/u-boot/u-boot.bin .
cp -f ${YOUR_PATH}/kernel/android-3.0/arch/arm/boot/zImage .

#Creating img files
cd ${MYDROID}
find out/target/product/$BOARD_TYPE -name *.img -exec rm -f {} \; 
source build/envsetup.sh
lunch full_panda-eng
make HOST_CC=gcc-4.4 HOST_CXX=g++-4.4 HOST_CPP=cpp-4.4
cp -f ${MYDROID}/out/target/product/$BOARD_TYPE/*.img $YOUR_PATH/omap4_sd_files_$BOARD_TYPE

cd $YOUR_PATH/omap4_sd_files_$BOARD_TYPE
./mkbootimg --kernel zImage --ramdisk ramdisk.img --base 0x80000000 --board omap4 -o boot.img

cd $YOUR_PATH/omap4_sd_files_$BOARD_TYPE
dd if=/dev/zero of=./cache.img bs=1048510 count=128
mkfs.ext4 -F cache.img -L cach

各シェルスクリプトには実行権限を与えておきましょう。下記のように実行します。

$ cd ${YOUR_PATH}
$ ./build_xloader.sh
$ ./build_uboot.sh
$ ./build_kernel.sh
$ ./build_wlan_driver.sh
$ ./build_android.sh
$ ./build_sgx_driver.sh
$ ./build_img.sh

SDカードへのAndroidブートイメージ書き込み
ここは完全に前回と同じですので略..
シリアルコンソールでautobootを止めて、fastbootで書き換えるいつもの手順です。

起動させてみると...


なんか画面の大きさが...期待外れ...
一応WiFiは動く。
Bluetoothは起動せず。

画面遷移などはわりとサクサク動きますね。
ブラウザは凄まじく動作が重いですが。

ソースコードはあるので、カスタマイズできると面白くなるかも。

一応、以上です。

2013年2月24日日曜日

githubのアカウントを作ろう

githubで公開されているとあるソースツリーを入手(git clone)したかったんですが、
Permission denied(publickey)
と怒られてしまいまして。

どうやらgithubに登録しておかなければいけないようです。


無料アカウントを作る
githubのPlans & Pricingのページで、無料の"Create a free account"をクリックします。

アカウント名、メールアドレス、パスワードを入力します。

以上でアカウント作成は完了。

SSHキーを登録する
Permission denied(publickey)と怒られる場合は、これが必要です。

Ubuntuでの手順ですが、Linuxなら大体同じで良いかと思います。

まず、自分のキーを生成するために下記コマンドを入力します。
$ ssh-keygen -t rsa -C "アカウント作成時に登録したメールアドレス"
Enter file in which to save the key (~/.ssh/id_rsa):
(キーの保存先を変更するかどうか?特に問題なければEnter)
Enter passphrase (empty for no passphrase):
(パスフレーズを入力せよ。なくてもOK。Enterで)
Enter same passphrase again:
(パスフレーズをもう一度入力せよ。Enterで)
すると、秘密鍵と公開鍵がホームディレクトリの.ssh/のid_rsa、id_rsa.pubに生成されます。
(使い回しもできますので、どこかに大切に保管しておきましょう。)

続いて、githubにサインインしておきまして、右上の方にある"Account Settings"のアイコンをクリックします。
左側のメニューから"SSH Keys"をクリックします。
そして、"Add SSH key"をクリック。

Titleは任意に入力。
Keyには上記で生成した~/.ssh/id_rsa.pubの中身をそのままコピーして貼り付けます。

"Add key"をクリックして登録完了です。

これでgithubのgit cloneが無事に進行します。

以上。やってみたらわりと簡単でしたね。

2013年2月17日日曜日

pandaboard ESでUbuntu 12.04

pandaboardでUbuntuを動かすには、OMAP4用のイメージがすでに用意されていますのでAndroidよりもお手軽です。

OMAP4用のUbuntu 12.04.2のダウンロードはこちらから。
今回はPreinstalled desktop imageの
Texas Instruments OMAP4 (Hard-Float) preinstalled desktop image
を試してみましょう。

まずは、ダウンロードしたファイルを適当な解凍ツールを使って解凍します。
ubuntu-12.04-preinstalled-desktop-armhf+omap4.img.gz

解凍すると
precise-preinstalled-desktop-armhf+omap4.raw
というファイル(2GB)があらわれますので、
これをUbuntuであればddコマンド、WindowsであればDD for Windowsを使ってSDカードに直接書き込みます。
なお、初期イメージは2GBですが、内容はインストーラーイメージになっており、セットアップの途中で全領域が使われるようになりますので2GBよりも大きいSDカードでOKです。

続いて、pandabord ESに上記で作成したSDカード、キーボード、マウス、HDMI、必要に応じてLANケーブルを接続し、電源を入れます。

Ubuntuのローディング画面が表示されてからずいぶん(10分少々)と待たされますが、 起動完了するとUbuntuのインストールセットアップのウィザードが表示されますので、通常通り進めていけばインストールは完了します。


起動すると普通にUbuntuです。

インストールしたての状態では、
WiFiは動くようですが、Bluetoothは動かないようです。
kenrelのバージョンは3.2.0(OMAP4用)ですね。