Avance.Lab

クラウドから組み込みまで、
弊社のソフトウェア開発ノウハウを紹介

技術紹介

第4回 顔認識デバイス Android編 〜 ラズパイとの通信 〜

tag: スマートデバイスIoT

こんにちは!

本記事を担当します 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の方がコード量は各段に少なく済みます。

今回のように実験的な用途には向いていると思われます。

次回

次回からはラズパイ編に突入します。

引き続きよろしくお願いします!

KNSK
KNSK

現在は主にスマホアプリ開発を担当しています。

ハイスペックでコンパクトなスマホが欲しいです。