Bluetooth RFCOMM(remote operation)

Bluetooth RFCOMMサービスを利用することで、Haruziraのリモート通信制御を外部のBluetoothデバイス(自作のプログラムや電子回路)経由で操作することが可能となる。

ここでは、この機能を利用するための設定やプログラム及び電子回路を開発する方法について説明する。

なお、Haruziraがバックグラウンド状態に遷移している場合は、OSのセキュリティの為にマイクをONにすることができない。

少し不便であるが、音声認識の利用の為にマイクをONにする場合は、フォアグランド状態で行うように注意する必要がある。

※この機能は、Haruzira version 2.3.0以降で利用可能となる。

 

リモート操作対応機能

以下は、外部Bluetoothデバイスから制御できる操作である。

 機能  説明
 音声認識の開始

Haruziraに登録を行ったリモート音声コマンドを送信するための、音声認識機能を起動し音声入力開始状態にする。

 ユーザーコマンド送信  Haruziraに登録を行ったリモート音声コマンドをダイレクトにリモートデバイスへ送信する。(音声認識機能は利用しない)
リモート操作のロック

リモート操作をロックすることで、 一時的にBluetoothデバイスから離れる場合等に、第三者からの不正な操作を防止することができる。

ロック状態の解除は、Haruziraからのみ行うことができる。

 

 

利用方法

ここでは、以下のデバイス環境を例として説明する。

 デバイス環境  説明
 サーバー

Haruziraが稼働するWindows 10 desktopまたはWindows 10 mobile。

 クライアント

Raspberry Pi 3に接続されたリモート操作を行う電子回路とPythonプログラム。PythonからBluetoothを制御するためにPyBluezモジュールを利用する。

 

※以下、サーバー側の操作は【S】、クライアント側の操作は【C】で表記する。

1.PythonでBluetoothモジュールを利用できるようにするために、以下のようにPyBluezモジュールをインストールする。(GATTプロファイルモジュールもインストールしておく。)

①【C】pyBluez の依存パッケージをインストール

>  sudo apt-get install python-dev libbluetooth3-dev

②【C】pyBluezモジュール のインストール

>  sudo pip3 install pybluez

③【C】gattlib の依存パッケージをインストール

>  sudo apt-get install libglib2.0 libboost-python-dev libboost-thread-dev

④【C】gattlib をインストール

>  sudo pip3 install gattlib

⑤【C】Raspberry PiのBluetoothデバイス状態をチェックする。

> hciconfig

hci0:   Type: BR/EDR  Bus: UART
        BD Address: XX:XX:XX:XX:XX:XX ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING PSCAN ISCAN
        RX bytes:794 acl:0 sco:0 events:53 errors:0
        TX bytes:2586 acl:0 sco:0 commands:53 errors:0

もしDOWNしている場合は、UPする。
> sudo hciconfig hci0 up
DOWN状態の場合は、bluetoothctlコマンドでscanを行うと以下のようなエラーが発生する。
Failed to start discovery: org.bluez.Error.NotReady

2.通信を行うデバイスとペアリングを行う。

①【S】Windows 10のBluetoothペアリング設定画面を起動しておく。(Bluetoothはオン)

 

 

 

 

 

 

②【C】Raspberry Piで「bluetoothctl」を起動する。 >  sudo bluetoothctl

③【C】bluetoothctlでデバイスをスキャンし検出されるまで待機する。 >  scan on

検出に成功すると、以下の様に表示される。

[NEW] Device XX:XX:XX:XX:XX:XX デバイス名

(XX:XX:XX:XX:XX:XXはBluetoothデバイスアドレス)

※ここで検出したペアリング対象のBDアドレス(Bluetoothデバイスアドレス)を覚えておく。

④【C】対象デバイスが検出できたら検出されたアドレスを指定しペアリングする。

>  pair xx:xx:xx:xx:xx:xx

ペアリングが成功すると、次のようにペアリング成功が表示される。

Attempting to pair with xx:xx:xx:xx:xx:xx
[CHG] Device xx:xx:xx:xx:xx:xx Connected: yes                                                            
[CHG] Device xx:xx:xx:xx:xx:xx Modalias: bluetooth:v0006p0001d0A00                                       
[CHG] Device xx:xx:xx:xx:xx:xx UUIDs:                                                                    
        00001000-0000-1000-8000-00805f9b34fb                                                             
        00001105-0000-1000-8000-00805f9b34fb                                                             
                             :
        232e51d8-91ff-4c24-ac0f-9ee055da30a5                                                             
        d9009112-cd2b-4e7a-a463-437d71e14905                                                             
[CHG] Device xx:xx:xx:xx:xx:xx Paired: yes                                                               
Pairing successful                                                                                       
[CHG] Device xx:xx:xx:xx:xx:xx Connected: no

⑤【S】Windows 10の画面にペアリング許可のメッセージが表示されるのでOKを選択し許可する。

ペアリングが完了すると、以下のような画面になる。

 

 

 

 

 

 

⑥【C】bluetoothctlでスキャンを停止する。 >  scan off

⑦【C】bluetoothctlを終了する。 >  quit

 

3.HaruziraのBluetooth RFCOMMサービスを有効にする。

①【S】Haruziraの設定メニューで「リモート設定」ページを表示する。

②【S】Bluetoothの利用を有効にする。

 

 

 

 

 

 

4.Haruziraのリモートデバイスとリモート音声コマンドを登録する。

①【S】リモートデバイス管理で接続先のデバイスを登録する。

 

 

 

 

 

②【S】リモート音声コマンド管理で音声コマンドを登録する。

 

 

 

 

 

 

5.HaruziraのBluetooth RFCOMMサービスで利用するChannel(Port)番号を取得する。

①【S】Windows 10でHaruziraのリモート読み上げページからサーバーを起動する。

②【C】Raspberry PiのsdptoolコマンドにBDアドレスを指定しChannel(Port)を調べる。

>  sdptool browse XX:XX:XX:XX:XX:XX

取得に成功すると、以下のように表示される。

Service Name: Bluetooth Rfcomm Haruzira Service
Service Description: Bluetooth Rfcomm Haruzira Service Windows10 UWP
Service RecHandle: 0x1000f
Service Class ID List:
  UUID 128: 00001101-0000-1000-8000-00805f9b34fb
Protocol Descriptor List:
  “L2CAP” (0x0100)
  “RFCOMM” (0x0003)
    Channel: 7

※ここまでの手順で取得したBDアドレスとChannel番号は、サービスへ接続時に使用するので覚えておく。

 

サンプルプログラム