ZaurusでBluetoothを使う(その2) 最終更新日: 2003/10/21 21:45

目次
OBEX Object Push
の実用化
コンパイル
プログラムの実行
送信の簡便化
パッケージ
関連リンク

関連ページ
Bluetoothを使う(1)
導入/OBEXテスト編
作成パッケージの
ダウンロード

その他
Zaurus関連トップ
掲示板

OBEX Object Pushの実用化

ZaurusでBluetoothを使う(その1)で、Zaurus上でBlueZ + OpenOBEXを使ってファイル送受信が出来ることは確認できたが、 obextestでは実用的に使うには問題がある。 実用とするにはそれなりのツールを用意する必要があるだろう。
obextestのソースを流用して自分で作ろうかと思っていたが、 Bluetooth and Linuxというリンク集ページから探してみたところ、 受信用デーモンと送信用プログラムが既に存在することがわかったので、これをコンパイルしてみることにした。

コンパイル

[opdのコンパイル]

opdは、OBEX Object Push の受信用のデーモン。
これを起動しておくことで、他の機器からのOBEX Object Push要求を受け付けてファイル受信を行うことが出来る。
こちらからソースを入手できる。

コンパイルは、BlueZとOpenOBEX関連のインクルードファイルが読めるようにしておけば問題なく出来る。 .configureもないので、makeを実行するのみ。

# make

make installもないので、自分で作成したバイナリをコピー。

# cp opd /usr/sbin/
# chown root /usr/sbin/opd
# chmod 755 /usr/sbin/opd
実行にはOpenOBEXのライブラリが必要なので、ライブラリパスには注意する必要がある。


[ussp-push, obextoolのコンパイル]

ussp-push, obextoolは、OBEX Object Push送信用のツール。
こちらからソースを入手できる。
こちらはglibも必要なので、コンパイル時にあらかじめglibのインクルードファイルを読める環境にしておく必要がある。 コンパイル自体は、こちらもmakeを実行するのみ。

# make
# cp obextool /usr/local/bin/
# chown root /usr/local/bin/obextool
# chmod 755 /usr/local/bin/obextool

ussp-pushはコンパイルは出来たものの、その後のテストでうまく実行できなかったため、インストールはしなかった(後述)。

実行には、OpenOBEX,glibのライブラリが必要となる。
Zaurus用のglibは、こちらでパッケージ化されたものを使用させていただいた。

プログラムの実行

あらかじめ、Bluetoothは使える状態にしておく

/etc/rc.d/init.d/bluetooth start

また、OpenOBEX及びglibのライブラリを使用するため、/usr/local/libがライブラリパス($LD_LIBRARY_PATH)に記載されている必要がある。

  • /home/zaurus/.profile
  • /home/zaurus/.bashrc

等に以下の記述を追加しておくと良い(/home/QtPalmtop/qpe.shを修正してもいい筈)。

export LD_LIBRARY_PATH=/home/QtPalmtop/lib:/usr/local/lib

odpは以下のようにして実行する。

# /usr/sbin/odp --mode OBEX --channel 10 --sdp --daemonize --path /tmp

--pathで指定したディレクトリ内に受信したファイルが保存される。また、この例ではチャンネル10を受信チャンネルとして指定している。 /etc/rc.d/init.d/bluetoothのスクリプト内で起動/終了しておくようにしておけば便利だろう。 (参考)
この状態で、PC等の他機器からファイル送信を行うと、指定したディレクトリにファイルが格納される。

送信には、ussp_pushとobextoolの2つがあるが、 ussp_pushはrfcommでポートを割り当てておかないと使えないようなので、 obextoolの方を使ってみる

$ obextool push /mnt/card/Documents/test.txt xx:xx:xx:xx:xx:xx 2

のように、

obextool push [ファイル名] [送信先アドレス] [送信先チャンネル]

で送信できる。 相手のチャンネルは、sdptoolで調べられる。

$ sdptool search OPUSH
Inquiring ...
Searching for OPUSH on xx:xx:xx:xx:xx:xx ...
Service Name: OBEX Object Push
Service RecHandle: 0x10001
Service Class ID List:
  "OBEX Object Push" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 2
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100

「Channel:」とあるのがチャンネル番号(上記の場合2)。

ussp-pushの方は、

# rfcomm bind 0 xx:xx:xx:xx:xx:xx 2
# ussp-push /dev/rfcomm0 /mnt/card/Documents/test.txt test.txt

のようにすれば送信できる筈なのだが、送信時に必ずエラーが出てしまいうまく動かなかった。
obextoolの方を常用するつもりだったので原因を追及していない。

送信の簡便化

さて、受信はopdを起動しておきさえすれば勝手に受信してくれるので問題ないが、 送信時にいちいちコマンドをたたくのはちょっと、というかかなり面倒。 相手先アドレスなんかもいちいち覚えていられないし。
本当はQt環境で利用できるフロントエンドを作るべきなのだけど、 今回はとりあえずFDとiSelectの組み合わせで送信が簡単に行えるようにしてみた。

とりあえず、FDとiSelectをインストールしておく。
(ターミナルが入っていない場合には、当然それも)
Zaurus用のパッケージは以下のページから入手可能。

FD上で選択しているファイルに対してOBEX送信が出来るようキーバインドを追加する。 /etc/fd2rc(~/.fd2rc)ファイルに以下の行を追加する。

bind 'B'  "btobexpush %C" WARNING_BELL

これで、SHIFT + Bで選択中のファイルを引数にしてbtobexpushが起動するようになる。
btobexpushは/usr/local/binあたりに以下のようにして作成。

# vi /usr/local/bin/btobexpush
# vi /usr/local/bin/btobexpush.def
# chmod 755 /usr/local/bin/btobexpush

  • /usr/local/bin/btobexpush

    #!/bin/sh
    `egrep -e ^[^#] /usr/local/bin/btobexpush.def | \
     iselect -f -a -t "Select Bluetooth Device..." | \
     sed -e "s/\([0-9a-fA-F][0-9a-fA-F:]*\)[ \t][ \t]*\([0-9][0-9]*\)[ \t].*/
    obextool push $1 \1 \2/"`
    

  • /usr/local/bin/btobexpush.def

    # Bluetooth OBEX OBJECT PUSH Selecter Definition
    # [BT Address]      [Channel] [Device Name (comment)]
    # FF:FF:FF:00:00:00 10        myself
    xx:xx:xx:xx:xx:xx    2   Windows PC
    xx:xx:xx:xx:xx:xx   10   Macintosh (Mac OS X 10.2)
    

    btobexpush.defには、送信先相手のアドレス、チャンネル、名称(任意)を記述しておく。

    これで、FDを起動して送信したいファイル上でSHIFT + Bを押せば、 btobexpush.defに記述した一覧が画面に表示され、 送信先を選択してEnterを押すことでobextooによる送信が実行される。

    これでそこそこ便利に送受信が行えるようになった。

  • パッケージ
    関連リンク