0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CoreBluetoothForUnityAdvent Calendar 2023

Day 6

CoreBluetoothForUnity サンプル Debug

Last updated at Posted at 2023-12-05

本記事について

この記事は CoreBluetoothForUnity Advent Calendar 2023 の6日目の記事です。

Debug サンプルと Read の実装について解説します。

pm_debug_sample.png

環境

  • CoreBluetoothForUnity 0.4.3

Debug サンプルとは

各イベントの発生をログに出力するサンプルです。
Peripheral, Central のどちらかを開発する際に、もう片方をこの Debug サンプルと通信することで、ちゃんと実装できているか、どんな値が送受信されているかを用意に確認できるかなと思います。

debug.png

3つのシーンから構成されています。

シーン名 画面
Home debug_home.png
Central debug_central.png
Peripheral debug_peripheral.png

Home から Central と Peripheral のシーンに遷移でき、左上の HOME を押すことで Home に戻ることができます。

Home があることで、1アプリで Central, Peripheral の両方のテストが可能です。

Read

Debug サンプルでは、01_LightControl, 02_ButtonInformation でやっていなかった Central から Peripheral への Read を実装しています。
CoreBluetooth の Read は Characteristic のデータを直接読むわけではない点がポイントです。実際にコードを追います。

Read の Central の実装

SampleDebug_Central.cs
public void OnClickRead()
{
    if (_peripheral == null)
    {
        Debug.Log("peripheral is null.");
        return;
    }

    if (_remoteCharacteristic == null)
    {
        Debug.Log("remoteCharacteristic is null.");
        return;
    }

    _peripheral.ReadValue(_remoteCharacteristic);
}

ReadValue

Central からの読み込みリクエストは ReadValue で行います。
そして、その結果が Notify と同様に DidUpdateValueForCharacteristic で受け取れます。

ここではやっていませんが、以下のように Read 可能かどうかを確認することもできます。

.cs
if (characteristic.Properties.HasFlag(CBCharacteristicProperties.Read))
{
    peripheral.ReadValue(characteristic);
}

Read の Peripheral の実装

癖があるのはこちらです。

SampleDebug_Peripheral.cs
void ICBPeripheralManagerDelegate.DidReceiveReadRequest(CBPeripheralManager peripheral, CBATTRequest request)
{
    if (request.Characteristic.UUID != _characteristicUUID)
    {
        peripheral.RespondToRequest(request, CBATTError.AttributeNotFound);
        return;
    }

    int valueLength = _value?.Length ?? 0;
    if (request.Offset > valueLength)
    {
        peripheral.RespondToRequest(request, CBATTError.InvalidOffset);
        return;
    }

    request.Value = _value ?? new byte[0];
    peripheral.RespondToRequest(request, CBATTError.Success);
    Debug.Log($"[DidReceiveReadRequest] {System.Text.Encoding.UTF8.GetString(request.Value)}");
}

Read のリクエストを受け取るには、ICBPeripheralManagerDelegate.DidReceiveReadRequest を実装します。

request.Value に値を設定、RespondToRequest で返答することで Central に値を返すことができます。

で、この時 request.Value に値を設定するというプロセスで Characteristic の値を参照しなくても構いません。

本サンプルではメンバ変数の _value をセットしています。

おわりに

本記事では CoreBluetoothForUnity のサンプル Debug と Read の実装について解説しました。

Debug サンプルは新しく機能を追加するたびに更新していく予定です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?