先端IT OBEX@gumstix

先端IT OBEX@gumstix
sada
課題
• GumstixのBluetoothでアドホックネットワー
クを作ろう!
– 二つのGumPodが近づいたら、自動的に1曲転
送しよう!
準備1 ~インストール~
• OpenOBEXのインストール
– ダウンロード
• http://openobex.triq.net/downloads
– 解凍(下記ディレクトリ下に配置)
• $(BUILDROOT)/build_arm_nofpu/
– configure
• ./configure --prefix $(BUILDROOT)
/build_arm_nofpu/staging_dir/ --exec-prefix $(BUILDROOT)
/build_arm_nofpu/staging_dir/ --host arm
– make
• Make; make install
• 注意: $(BUILDROOT)のディレクトリ名は各自の
環境に合わせること
準備2 ~make~
• Makefileの編集
– 環境に合わせて下記を編集
• BUILDROOT=
• 確認
– make
– もし失敗した場合は下記を特にチェック
• arm-linux-gcc はあるか?
• OpenOBEX はただしく入っているか?
• ライブラリパスに x86 用が入っていないか?
準備3 ~ディレクトリ~
• ディレクトリ作成
– upload:他人へ渡すファイル保存用
– download:他人からもらったファイル保存用
• 音楽ファイル保存
– upload ディレクトリに保存しておく
起動方法
• 起動方法
– 共に起動しておく
• サーバ:
– sdpd
– sdptool –channel=1 add OPUSH
– file_exchange –s
• クライアント:
– file_exchange –c
課題手順
• 作業方法
– file_exchange.c を編集する
– 送受信部分は実装済み
• 改良場所案
– 誰と交換?
• 現在は最初に近づいた相手
– どのファイル?
• 現在は upload/aaa のファイル
– 何回?
• 現在は一度のみで終了
関数の概要
• inquiry
– Bluetoothデバイスの検索
• syncwait
– 処理が終了するまで待機する
• connect_client
– クライアントがサーバに接続する
• put_client
– クライアントがサーバにファイルを転送する
• connect_client_done
– クライアントの処理終了時に呼ばれる
• server_done
– サーバの処理終了時に呼ばれる
• server_request
– サーバのリクエスト発生時に呼ばれる
• obex_event
– OBEXのイベント発生時に呼ばれる
• init_obex
– OBEXを初期化する
• get_myaddr
– 自分のBluetoothのIDを取得する
• server_do
– サーバが接続を待機する
• main
– メイン関数
注意点
• Server register error! と出力される
– OSを再起動すると直ります
交換手順
• gumstixの発見
– 複数gumstixが存在する場合は・・・
• 渡すファイルの選択
OBEXを用いたBluetoothの
ファイル送信手順
•
•
•
•
デバイス発見
デバイス初期化
接続
ファイル送信
デバイス発見
• デバイス発見:sdp_general_inquiry関数
– sdp_general_inquiry(ii, 20, 8, &count);
デバイス初期化
• ハンドラ初期化:OBEX_Init関数
– handle =
OBEX_Init(OBEX_TRANS_BLUETOOTH,
obex_event, 0);
• ハンドラへのコンテキスト設定:
OBEX_SetUserData関数
– OBEX_SetUserData(handle, &global_context)
接続
• 接続:BtOBEX_TransportConnect関数
– BtOBEX_TransportConnect(handle, BDADDR_ANY,
&bdaddr, channel)
• 自分に関する情報を通知
– OBEX_ObjectNew(handle,
OBEX_CMD_CONNECT))
– OBEX_ObjectAddHeader(handle, object,
OBEX_HDR_WHO, hd,
6,OBEX_FL_FIT_ONE_PACKET)
– OBEX_Request(handle, object);
OBEXによるファイル送信
• ファイル送信
– オブジェクト生成
• object = OBEX_ObjectNew(handle, OBEX_CMD_PUT);
– ファイルサイズを通知
• hd.bq4 = file_size;
• OBEX_ObjectAddHeader(handle, object, OBEX_HDR_LENGTH, hd, 4, 0);
– ファイル名を通知
• hd.bs = rname;
• rname_size = OBEX_CharToUnicode(rname, rname, sizeof(rname));
• OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd,
rname_size, 0);
– ファイルの内容を通知
• hd.bs = buf;
• OBEX_ObjectAddHeader(handle, object, OBEX_HDR_BODY, hd, file_size,
0);
– 送信
• OBEX_Request(handle, object);