ラベル BTstack の投稿を表示しています。 すべての投稿を表示
ラベル BTstack の投稿を表示しています。 すべての投稿を表示

2013年3月22日金曜日

mbed official USBHostでBTstackを動かす

以前、mbedに移植したBTstackをmbed official USBHostに対応してみました。

http://mbed.org/users/va009039/code/BTstack/

以前のUSBライブラリを削除して、
追加、変更したのは次のファイルだけです。
USBHostBTstack.h
USBHostBTstack.cpp
hci_transport_usb.cpp

Bluetoothマウスの動作確認はしました。しかし、パソコンとのSPPシリアルポート通信はパソコンに
よっては接続に失敗する時がある。L2CAP、SDPは動いていてSPPのサービス情報を読み取れる。
BTstackとパソコンのBluetoothドライバとの相性のようにも思えるがよくわからない。

BluetoothのUSBはコントロール転送とインタラプト転送とバルク転送を使っています。
インタラプト転送はマウスのクラスドライバ、バルク転送はMSDフラッシュディスクのクラスドライバを
参考にしました。パケット送信はブロックモードで動かしました。

パケット受信はブロックされずに、USBHostのスレッドusb_process()からコールバックされています。
スタックは4Kバイトくらい。BTstackと非同期で動くのが安全なのかわからないので、
BTstackと同じスレッド、つまりmain()のスレッドからコールバックされるように変更する予定です。

(2013/3/22)

予めPINコードで認証した時は接続に失敗するが、接続時に認証する時は接続できる。
HCI_EVENT_LINK_KEY_REQUESTが送られてきた時に間違った link keyを送っているので接続出来ないようです。
L2CAP_EVENT_CHANNEL_OPENED for PSM_RFCOMM
rfcomm_max_frame_size_for_l2cap_mtu:  48 -> 43
Received SABM #0
Sending UA #0
Multiplexer up and running
HCI_EVENT_LINK_KEY_REQUEST
responding to link key request
Received DISC #0, (ougoing = 0)
Sending UA #0
Closing down multiplexer
TODO: no connections established - delete link key prophylactically

(2013/3/22追加)
---

2012年7月17日火曜日

mbedでRPC over Bluetoothのテスト


BTstackのSPPの動作テストのループバックではローカルエコーと区別がつきにくいので間にRPCを入れてみた。
上の動画ではパソコンからmbedのLEDを操作しています。

spp_rpc.cpp

TeraTermの場合は次のように設定してからmbedに接続します。


(2012/7/17)
---

2012年7月3日火曜日

BTstackをmbedで動かす(3)

BTstackをmbedで動かす(2)の続き。
パソコンでリアルタイムに撮影した画像が見たかったので初めてC#でプログラムを書いてみた。

パソコン: camviewer
mbed: spp_camera.cpp

撮影している様子と撮影した画像の表示。

しかし、転送速度は遅い。
UVCカメラから送られてくるフレームをSレコードにしてSPPで送っている。
短いフレームを大量に送っているのが原因なのかもしれない。

追加7月4日
int rfcomm_send_internal(uint16_t rfcomm_cid, uint8_t *data, uint16_t len)
で送れるのは252バイトまでだった。長くてもエラーは帰ってこないので注意、ハングアップします。
---

2012年6月28日木曜日

BTstackをmbedで動かす(2)



超低速ではあるがUSBカメラで撮影した画像をBluetoothのSPPでパソコンに送ってみた。

spp_camera.cpp
BTstack

spp_counter.cppを改造すれば簡単にできるかと思っていたが、フロー制御をしないといけないみたいで、
短時間に大量のデータを送るとエラー(RFCOMM_NO_OUTGOING_CREDITS)になってしまう。
仕方ないので送信キュー(queue<string> send_queue;)を作って、
メインループ(cam_process_ds)でエラーにならないように送るようにしてみた。

デバッグしやすいように、撮影した画像は16進数テキストに変換して送っています。
ターミナルソフトでSPPのポートを開くとデータが5秒間隔で流れ込んで来ます。

動作確認としてパソコン側のソフトはPython2.7+PySerial2.5(pyserial-2.5.win32.exe)で作りました。
バイナリーに変換してJPEGファイルとして保存しているだけ。上の画像は保存した画像です。

spp.py

---

2012年6月24日日曜日

BTstackをmbedで動かす(1)



BTstack(http://code.google.com/p/btstack/)Bluetooth stackをmbedに移植してみました。

サンプルプログラムの説明。

mouse_demo.cpp
マウスとペアリング(マウスのコネクトボタンを押す)するとマウスからのデータを表示します。
左クリックでLED1、右クリックでLED2、ホイールボタンでLED3が点灯します。

spp_demo.cpp
SPPでループバックをします。
パソコンからデバイスを検索すると上のキャプチャ画像のようにmbedのBluetoothデバイスがみつかります。

spp_counter.cpp
SPPでパソコンにデータを送ります。

spp_flowcontrol.cpp
SPPでパソコンからのデータを500msec間隔で受信します。

led_counter.cpp
BTstackのタイマー処理の確認。LED2が点滅します。

BTstack
---