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

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追加)
---

2013年1月20日日曜日

mbedでBluetoothのRSSI受信信号強度の取得



HCI_Write_Inquiry_Mode で Inquiry Result format with RSSI を設定すると、
Inquiry Result Event から Inquiry Result with RSSI Event に変わってRSSI付きの検索結果が
返って来るようになります。

更に、HCI_Periodic_Inquiry_Mode にしておけば Inquiry Command を都度送らなくても、
繰り返して Inquiry Result Event や Inquiry Result with RSSI Event が返って来るようになります。

上のグラフは自分の携帯電話のBluetoothのRSSIを一日間cosmに記録した例です。
mbedオレンジボードに繋いだBluetoothのUSBドングルで検出してcosmにデータを送っています。
cosmにはトリガーがあるので、例えば不検出になったらHTTP POSTすればみまもりに使えそうです。

mbedで実行していたプログラムは次のとおりです。

mimamoriBluetooth_example

(2013/1/20)
---

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
---

2012年5月4日金曜日

mbedでBluetoothデバイスを検出する

USBのインタラプト転送を理解するためにmbedでBluetoothデバイスを検出するだけのプログラムを書いてみた。
本来はUSBマウスを使いたかったが、なぜか認識されなかったのでインタラプト転送があるBluetoothアダプタを選んだ。
既にBlueUSBで実現されているのでBluetoothのプロトコルは参考にしています。
USBホスト機能はNetServicesSourceに含まれていたUSBホストのプログラムを改良した。
バルク転送は実装されていたので、インタラプト転送のエンドポイントのヘッドポインタを
バルクヘッド(HcBulkHeadED)ではなくインタラプトヘッド(HccaInterruptTable)に繋げる。
インタラプト転送はperiodic転送に含まれているので、HcControlのperiodic転送(PLE)を有効にする。
USBホスト初期時に HcPeriodicStart に FI*90/100 を設定する。
プログラムはmbedサイトに置いておきます。

BlueD Bluetooth device discover

使用例:
#include "mbed.h"
#include "BlueD.h"
Serial pc(USBTX, USBRX);

BlueD bd;

int main() {
    pc.baud(460800);
    printf("Bluetooth device discover\n");
    while(1) {
        set addr = bd.discover_devices();
        for (set::iterator it = addr.begin() ; it != addr.end(); it++) {
            string addr(*it);
            string name = bd.lookup_name(addr);
            printf("%s [%s]\n", addr.c_str(), name.c_str());
        }
        wait(30);
    }
}

制限事項
アダプタのUSBハブ経由の接続には対応していない。
USBに接続されているのがBluetoothアダプタなのかは確認していない。
インターバルは32msecに固定。
---