Bluetooth SPPでWindowsPCと通信

2022.4.13 Coskx Lab  

1 はじめに

Bluetooth SPPでAndroidがWindowsPCと通信
AndroidデバイスとwindowsPCのシリアル通信ターミナル間でBluetooth Classic通信(Bluetooth Low Energyではありません)を行います。
Bluetooth通信では,Master(initiator)とSlave(Acceptor)の間で通信が行われます。
ここでは,AndroidDeviceをMaster,windowsPCのシリアル通信ターミナルをSlaveとして使うことにします。
Master側では毎回通信相手を捜さなくてもよいように,通信前にPairing(Bonding)をしておきます。
Slaveは常時Masterからの接続を受け付けられるように動作しています。(windowsPCのシリアル通信ターミナルを先に起動させておきます。)
Masterは,通信相手を1つだけ指定して接続し,通信を始めます。


Bluetooth通信ひな型アプリ(Android側)
Android12(API31)以降ではBluetoothに関するPermissionの取り扱いが変更されました。
このアプリでは,変更前と変更後の療法に対応するようになっています。
できるだけ単純化するため,受信ストリームをポーリングして,受信を行っています。
このアプリはPCとの通信を想定していますが,他のマイクロコンピュータ(Slaveとして動作)とのBluetooth Classic通信での送受信にも使えます。

2 使用環境

3 プログラムソース

sourcefiles2.zipのダウンロード
作成中のpackage名が異なる場合は変更してください。

3.1 AndroidManifest

sourcefiles2.zip中にAndroidManifestが含まれています。
AndroidManifast.xmlにおいて,Bluetoothを使うことを宣言します。次のように6行追加になっています。

AndroidManifast.xml
    <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/>
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
        android:usesPermissionFlags="neverForLocation"
        tools:targetApi="s" />

3.2 Activity_main.xml

sourcefiles2.zip中にactivity_main.xmlが含まれています。
次のようなスクリーンをイメージしています。
上から順に次のように配置されています。
 ・通信相手選択ボタン
 ・接続ボタン
 ・通信相手のデバイス名(まだ決まっていない場合はno device)
 ・文字列Hello 送信ボタン
 ・文字列Bonjour 送信ボタン
 ・受信文字列表示領域


3.3 MainActivity.java

・sourcefiles2.zip中にMainActivity.javaが含まれています。
・onCreate()中で各ボタンの動作を定めています。Android12以降ではperemissionを要求します。
・selectボタンでは,Alertダイアログの択一リストを使って,ペアリングされたデバイス一覧の中から通信相手を選択するようにします。
・connectボタンでは,選択されている通信相手と通信できるようにします。
・Handlerを使用して,一定間隔で起動することで受信ポーリングを実施します。

4 PC側の準備
4.1 準備の概要

AndroidとWindowsPC間で通信するためには,次のことが必要です。
(1)WindowsPCでBluetoothが使えることが前提です
(2)WindowsPCではシリアル通信を行うために,BluetoothをCOMポートとして動作するようにする作業が必要です。
(3)WindowsPCではシリアル通信アプリ(ここではTera Termを想定しています)を使用します。
(4))WindowsPC側のシリアル通信アプリが先に接続状態になって待ち受けているところに,Android側のBluetooth通信ひな型アプリから接続します。

4.2 通信のためにWindowsPCのBluetoothをシリアルポートに結びつける

WindowsPCでBluetoothが使える状態であることが必要です。(bluetoothカードが内蔵,またはbluetoothアダプタを利用する)

WindowsPCのBluetoothをシリアルポート(COMポート)に結びつける手順は次の通りです。
WindowsPCの設定 → Bluetooth設定でBluetooth ON



WindowsPCの設定 → Bluetooth設定 → その他のBluetooth設定 → Bluetooth設定 → オプション




「BluetoothデバイスによるこのPCの検出を許可する」にチェックマークを入れる




WindowsPCの設定 → Bluetooth設定 → その他のBluetooth設定 → Bluetooth設定 → COMポート → 追加ボタン




「着信(デバイスが接続を開始する)」にチェックマークを入れ,OK




ポートにCOMxが「着信」設定で作られる。(ここではCOM8が作られている)
ここで作られたCOM8を後でターミナルアプリに設定する。



4.3 AndroidとPCのペアリングを行う

ペアリングに関しては個々のandroidデバイスの説明をnet検索してペアリングを実現してください。

4.4 WindowsPCのシリアルターミナルアプリSerial_Terminal_plusを利用する

WindowsPCのTeraTermはよく使われますが,セルフエコーの設定が必要で,送信・受信が同一画面内で行われているため,使いにくい場合があります。
Serial_Terminal_plus(https://github.com/healthywalk/Serial_Terminal_plus
はmicro:bitとPCのシリアル通信を想定されていますが,一般的なシリアルターミナル(送信・受信が別々に表示される)としても使用できます。
WindowsPC側のシリアルターミナルアプリとしてこのSerial_Terminal_plusを利用することにします
多くの文字列事前設定可能なボタンが並んでいますが,今は使いません。
WindowsPCのSerial_Terminal_plusが起動したら,シリアル接続し,COMx(先ほどの例ではCOM8)を選択してください。
先にSerial_Terminal_plusを「CONNECT」ボタンで,起動させてから,Bluetooth通信ひな型アプリ(Android側)を起動します。
先にSerial_Terminal_plusをここまで起動しておく必要があります。

Serial_Terminal_plus は次からダウンロードできます。

ダウンロード


5 実行の様子

5.1 WindowsPCの準備ができたところで,Androidデバイスの設定でBluetoothのペアリングをしておきます。(準備)
ペアリングの方法は,WindowsのバージョンやAndroidデバイスに依存するので,net検索してください。

5.2Bluetooth通信ひな型アプリ(Android側)を起動します



起動時の様子
WindowsPCは起動していますが,まだ接続されていません。

5.2 接続先の選択
ボタン「SELECT MAC ADRS」をタップすると,ペアリングされているデバイス名の一覧が表示されるので,WindowsPC(ここではELDERTOMCAT)を選択します。



デバイス選択
ここに表示されるのはAndroidデバイスとペアリングが完了しているデバイスのみです。
事前にペアリングしておく必要があります。

5.3 選択されたデバイスに接続します。



接続先のデバイス名が表示されています。
ボタン「CONNECT」が有効になります。
ボタン「CONNECT」をタップすると接続が完了します。

5.4 送受信します。






接続が完了するとボタン「SEND HELLO」と「SEND BONJOUR」が有効になります。 「SEND HELLO」と「SEND BONJOUR」をタップすると,HelloとBonjourを送信します。 PC側にHelloとBonjourが受信され,表示されます。 PC側から,Hello from WinPCを送信すると,Android側に表示されます。

6 まとめ

Bluetooth通信(Master)ひな型Android用アプリを作成しました。
WindowsPCのSerial_Terminal_plusとの間で送受信ができるようになりました。
接続手順が煩雑で一か所でも間違えると交信出来ない点のは難点です。