2016年4月10日日曜日

Bluetoothの接続デバイスを取得する(c++)

※素人のメモ書きです、ご注意ください。

Bluetoothの信号を受け取ってみるのを目標に、今回はまず一覧取得まで作ってみた(コードはGistに投げました)。

こちらのページを参考に、C++で作成。変更したのはwcoutとendlをそれぞれstd::wcout,std::endlにして#include<iostream>を追加したくらい。


基本的には、
  1. radio側の情報取得用配列(para_radio)を用意し初期化
  2. radio側ではHANDLEを作成、BluetoothFindFirstRadioでPC側の持っているBTH機器の位置(?)を構造体に送る(findで成功失敗を確認)
  3. 成功した場合、BluetoothGetRadioInfoでPC側の機器情報を用意した配列(info)に送る
  4. 機器名出力、BluetoothFindNextRadioで次のBTH機器を確認、あれば3へ
  5. device側の情報取得用配列(para_dev)を用意し、情報取得のためのフラグ設定を行う
  6. BluetoothFindFirstDeviceで情報を取得する
  7. 機器名出力後、BluetoothFindNextDeviceで次の機器を確認、あれば6へ
(5に関して、設定毎でどのように結果が変わるのかが気になったので、書いたコードではループしています)

HANDLE型のradioは、FILEみたいな振る舞いをするものかと思ったけれど、device側ではHANDLE型は使われていない。radio側とdevice側で扱う関数は、似ているけれど部分で違うようです。

  
visual studioで、構造体名などで右クリックで定義が見られることを知ったので、ヘッダファイルの見方も慣れていきたいと思いつつ。


--

 構造体BLUETOOTH_DEVICE_SEARCH_PARAMSに関して、

定義では

    BOOL    fReturnAuthenticated;   //  IN  return authenticated devices
    BOOL    fReturnRemembered;      //  IN  return remembered devices
    BOOL    fReturnUnknown;         //  IN  return unknown devices
    BOOL    fReturnConnected;       //  IN  return connected devices

    BOOL    fIssueInquiry;          //  IN  issue a new inquiry
    UCHAR   cTimeoutMultiplier;     //  IN  timeout for the inquiry

    HANDLE  hRadio;                 //  IN  handle to radio to enumerate - NULL == all radios will be searched


とあったが、実際にどうなるのか気になったのでfReturnUnknownとfReturnConnectedのみ確認しました(他はすべてTRUE)。
windows側のBluetooth設定で「BSHSBE21(ペアリング済)」「iphone(ペアリング可能」「不明なデバイス」の3つが表示されている状態での実行結果です。

 

fReturnUnknownはTRUEにすると「名前の取得に失敗していても表示」、fReturnConnectedは「ペアリング済のみ表示」になるようです。



0 件のコメント:

コメントを投稿