こんにちは!
本記事を担当します KNSK と申します。
よろしくお願いします!
今回はAndroid編の最終回ということでAndroidアプリとラズパイの間の通信に関してご説明します。
通信方法
通信方法はBluetoothを使用します。
IoT界隈ではBLE(Bluetooth Low Energy)が使用されることが多いです。
BLEは通常のBluetooth(Bluetooth Classic)と比較すると
通信速度・通信距離の面で劣りますが、
その分低消費電力となっており、バッテリーで動作するデバイスに向いています。
しかし、顔認識システムの機器の構成上、消費電力を気にする必要が無く、
且つ、開発工数の削減が見込めることからBluetooth Classicを使用しています。
プロファイル
Bluetoothは通信の種類によって プロファイル が定義されています。
ヘッドホンなどで音声を伝送する場合に使用する『A2DP(Advanced Audio Distribution Profile)』、
マウスなどの入力機器で使用する『HID(Human Interface Device Profile)』など、さまざまなプロファイルがあります。
今回は仮想シリアル通信が可能となる『SPP(Serial Port Profile)』を使用します。
開発内容
1.ペアリング
Bluetooth通信を行うためには ペアリング が必要となります。
ペアリングはプログラムで実現させることもできますが、
今回は工数削減のため、OSの機能を使用して事前にペアリングしておく形にしました。
①AndroidのBluetooth設定画面を開き、ラズパイがAndroid端末を検出できる状態にします。

②ラズパイの画面でAndroid端末を選択し、ペアリングを開始します。

③それぞれの画面でペアリングを承認します。
Android:

ラズパイ:

これでペアリング完了です。

2.デバイス一覧の表示
ペアリング済みのデバイスを取得し、アプリ画面に表示します。
val btAdapter = BluetoothAdapter.getDefaultAdapter()
if (btAdapter?.isEnabled == true) {
btAdapter.bondedDevices?.let { btDeviceSet ->
// TODO: デバイス情報をアプリ画面へ表示するコード
}
}
if (btAdapter?.isEnabled == true) {はAndroid端末のBluetooth設定がONであるかチェックしています。
btDeviceSetがペアリング済みデバイス取得結果です。
AndroidのBluetooth設定画面で表示されていたデバイスが、アプリ画面でも表示されます。

3.通信処理
下記のクラスでBluetooth通信を実現します。
/**
* Bluetooth通信クラス
*/
class SppClient {
private val SERVICE_ID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
private var mBTSocket: BluetoothSocket? = null
/**
* 接続
*/
fun connect(targetDevice: BluetoothDevice?) {
thread {
mBTSocket = targetDevice?.createRfcommSocketToServiceRecord(SERVICE_ID)
}
}
/**
* データ送信
*/
fun send(sendData: ByteArray) {
mBTSocket?.outputStream?.let {
it.write(sendData)
}
}
/**
* 切断
*/
fun disconnect() {
mBTSocket?.close()
mBTSocket = null
}
// endregion
}
3-1. 接続
画面上に表示したデバイスリストからユーザに接続相手を選択してもらい、
選択されたデバイスとSPPで接続します。
/**
* 接続
*/
fun connect(targetDevice: BluetoothDevice?) {
thread {
mBTSocket = targetDevice?.createRfcommSocketToServiceRecord(SERVICE_ID)
}
}
SERVICE_IDはSPPとして接続ための情報です。プロファイルごとに定義されています。
targetDeviceがユーザに選択されたデバイスです。
mBTSocketがシリアル通信を行うためのオブジェクトです。
3-2. データ送信
ラズパイに対して、アプリ上で設定したデータや、パン・チルトの操作情報を送信します。
/**
* データ送信
*/
fun send(sendData: ByteArray) {
mBTSocket?.outputStream?.let {
it.write(sendData)
}
}
sendDataが送信データです。
最後に
SPPを使用した場合とBLEを使用した場合を比較すると、SPPの方がコード量は各段に少なく済みます。
今回のように実験的な用途には向いていると思われます。
次回
次回からはラズパイ編に突入します。
引き続きよろしくお願いします!
関連記事
-
第1回 Visual C++で作成したDLL内のクラスをC#で利用する方法
こんにちは、ILCです。 Visual C++ (以下 VC++)で作成されたDynamic...
公開日:2024.01.19 更新日:2024.01.19
tag : Windows
-
-
-
第1回 ラズパイを使用したBLE通信 ~ ディスプレイ、キーボード、マウスを接続しないで設定 前編 ~
こんにちは、GTです。よろしくお願いします。 最近業務でラズパイのBluetooth機能を使...
公開日:2021.12.24 更新日:2021.12.24
tag : Bluetooth Raspberry Pi
-
【新機能探訪】Android 13から導入された『アプリごとの言語設定』
こんにちは、KNSKです。よろしくお願いします。 今回は Android13の新機能である『...
公開日:2022.12.09 更新日:2022.12.09
tag : スマートデバイス
-
第3回 ラズパイを使用したBLE通信 ~ A/D変換・D/A変換を用いた入出力編 ~
こんにちは、GTです。よろしくお願いします。 第3回の今回は、ラズパイの入出力についてご紹介...
公開日:2023.02.24 更新日:2023.02.24
tag : Bluetooth BLE Raspberry Pi