13,000
回編集
(→組み合わせ) |
|||
381行目: | 381行目: | ||
<br> | <br> | ||
Classic Bluetoothでは、<code>QBluetoothServiceInfo</code>クラスを使用して、単純なサービス情報を管理する。<br> | Classic Bluetoothでは、<code>QBluetoothServiceInfo</code>クラスを使用して、単純なサービス情報を管理する。<br> | ||
<br> | |||
==== Bluetoothサービスディスカバリの準備 ==== | |||
<code>QBluetoothServiceDiscoveryAgent</code>クラスのインスタンスを生成する。<br> | |||
<br> | |||
以下に示すシグナルを接続する。 | |||
* QBluetoothServiceDiscoveryAgent::serviceDiscovered | |||
*: 発見したサービスを通知する。 | |||
* QBluetoothServiceDiscoveryAgent::finished | |||
*: 探索完了を通知する。 | |||
* QBluetoothServiceDiscoveryAgent::error | |||
*: エラー発生時の通知 | |||
<br> | <br> | ||
<syntaxhighlight lang="c++"> | |||
#include <QBluetoothServiceDiscoveryAgent> | |||
#include <QDebug> | |||
QBluetoothServiceDiscoveryAgent discoveryAgent; | |||
// シグナルとスロットの接続 | |||
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered, [](const QBluetoothServiceInfo &info) { | |||
qDebug() << "サービス発見"; | |||
}); | |||
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished, []() { | |||
qDebug() << "探索完了"; | |||
}); | |||
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::error, [](QBluetoothServiceDiscoveryAgent::Error error) { | |||
qDebug() << "エラー発生"; | |||
}); | |||
</syntaxhighlight> | |||
<br> | |||
==== サービスディスカバリの開始 ==== | |||
<code>QBluetoothAddress</code>クラスを使用して、対象デバイスのBluetoothアドレスを指定する。<br> | |||
<br> | |||
<code>QBluetoothServiceDiscoveryAgent::setRemoteAddress</code>メソッドを実行して、探索対象のデバイスを設定する。<br> | |||
<code>QBluetoothServiceDiscoveryAgent::start</code>メソッドを実行して、ディスカバリを開始する。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QBluetoothAddress> | |||
// デバイスのBluetoothアドレスを設定 | |||
QBluetoothAddress address("XX:XX:XX:XX:XX:XX"); | |||
discoveryAgent.setRemoteAddress(address); | |||
// ディスカバリ開始 | |||
discoveryAgent.start(QBluetoothServiceDiscoveryAgent::FullDiscovery); | |||
</syntaxhighlight> | |||
<br> | |||
==== サービスの発見時 ==== | |||
<code>QBluetoothServiceDiscoveryAgent::serviceDiscovered</code>シグナルで通知された<code>QBluetoothServiceInfo</code>クラスから必要な情報を取得する。<br> | |||
<br> | |||
QBluetoothServiceInfoクラスでは、以下に示す情報が取得できる。<br> | |||
<br> | |||
これらの情報は、Bluetoothデバイスとの接続やサービスの詳細な把握に役立つ。<br> | |||
ただし、全ての情報が必ず使用可能とは限らないため、デバイスやサービスの種類によっては取得できる情報が異なることに注意する。<br> | |||
<br> | |||
* サービスの基本情報 | |||
** serviceDescription() | |||
**: サービスの説明文 | |||
** serviceName() | |||
**: サービス名 | |||
** serviceProvider() | |||
**: サービスプロバイダ名 | |||
** serviceUuid() | |||
**: サービスのUUID | |||
** serviceAvailability() | |||
**: サービスの可用性 (0x00~0xFF) | |||
*: <br> | |||
* プロトコル関連 | |||
** protocolServiceMultiplexer() | |||
**: プロトコルサービス多重化子 (PSM) 値 | |||
** serverChannel() | |||
**: RFCOMMサーバチャンネル番号 | |||
** socketProtocol() | |||
**: 使用されているソケットプロトコル (RFCOMM / L2CAP) | |||
*: <br> | |||
* サービスクラス情報 | |||
** serviceClassUuids() | |||
**: サービスクラスのUUIDリスト | |||
** serviceProvider() | |||
**: サービスプロバイダ情報 | |||
*: <br> | |||
* 接続関連 | |||
** device() | |||
**: サービスを提供しているデバイス情報 | |||
** isComplete() | |||
**: サービス情報が完全かどうか | |||
** isRegistered() | |||
**: サービスが登録されているかどうか | |||
** isValid() | |||
**: サービス情報が有効かどうか | |||
*: <br> | |||
* 属性関連 | |||
** attributes() | |||
**: 全ての属性のリスト | |||
** contains(quint16 attributeId) | |||
**: 特定の属性の存在確認 | |||
** attribute(quint16 attributeId) | |||
**: 特定の属性値の取得 | |||
*: <br> | |||
* プロファイル関連 | |||
** majorServiceClass() | |||
**: メジャーサービスクラス (オーディオ、電話等) | |||
** minorServiceClass() | |||
**: マイナーサービスクラス (詳細なサービス種別) | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered, [](const QBluetoothServiceInfo &info) { | |||
// サービス名を取得 | |||
QString name = info.serviceName(); | |||
// UUIDを取得 | |||
QBluetoothUuid uuid = info.serviceUuid(); | |||
// プロトコルを取得 | |||
int protocol = info.protocolServiceMultiplexer(); | |||
qDebug() << "サービス名: " << name; | |||
qDebug() << "UUID: " << uuid.toString(); | |||
qDebug() << "プロトコル: " << protocol; | |||
}); | |||
</syntaxhighlight> | |||
<br> | |||
==== 探索完了 または エラー時 ==== | |||
<code>QBluetoothServiceDiscoveryAgent::finished</code>シグナルで探索完了を検知する。<br> | |||
<br> | |||
<code>QBluetoothServiceDiscoveryAgent::error</code>シグナルでエラーを検知する。<br> | |||
<br> | |||
必要に応じて、<code>QBluetoothServiceDiscoveryAgent::stop</code>メソッドで探索を終了することも可能である。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// 完了時の処理 | |||
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished, []() { | |||
qDebug() << "探索が完了しました"; | |||
}); | |||
// エラー時の処理 | |||
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::error, [](QBluetoothServiceDiscoveryAgent::Error error) { | |||
switch (error) { | |||
case QBluetoothServiceDiscoveryAgent::NoError: | |||
qDebug() << "エラーなし"; | |||
break; | |||
case QBluetoothServiceDiscoveryAgent::PoweredOffError: | |||
qDebug() << "Bluetoothがオフです"; | |||
break; | |||
default: | |||
qDebug() << "その他のエラー"; | |||
} | |||
}); | |||
// 探索を途中で停止する場合 | |||
discoveryAgent.stop(); | |||
</syntaxhighlight> | |||
<br> | |||
==== 組み合わせ ==== | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <QBluetoothServiceDiscoveryAgent> | #include <QBluetoothServiceDiscoveryAgent> | ||
#include <QBluetoothAddress> | #include <QBluetoothAddress> | ||
#include <QDebug> | #include <QDebug> | ||
class ServiceDiscovery : public QObject | class ServiceDiscovery : public QObject | ||
393行目: | 547行目: | ||
private: | private: | ||
QBluetoothServiceDiscoveryAgent discoveryAgent; | |||
// | // プロトコルタイプ | ||
QString protocolToString(int protocol) | QString protocolToString(int protocol) | ||
{ | { | ||
407行目: | 561行目: | ||
} | } | ||
// | // エラーコード | ||
QString errorToString(QBluetoothServiceDiscoveryAgent::Error error) | QString errorToString(QBluetoothServiceDiscoveryAgent::Error error) | ||
{ | { | ||
421行目: | 575行目: | ||
public: | public: | ||
explicit ServiceDiscovery(QObject* parent = nullptr) : QObject(parent) | explicit ServiceDiscovery(QObject* parent = nullptr) : QObject(parent), discoveryAgent(this) | ||
{ | { | ||
// 各種シグナルとスロットの接続 | |||
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered, this, &ServiceDiscovery::onServiceDiscovered); | |||
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished, this, &ServiceDiscovery::onScanFinished); | |||
connect(&discoveryAgent, static_cast<void(QBluetoothServiceDiscoveryAgent::*)(QBluetoothServiceDiscoveryAgent::Error)>(&QBluetoothServiceDiscoveryAgent::error), | |||
this, &ServiceDiscovery::onError); | |||
} | } | ||
442行目: | 587行目: | ||
void startDiscovery(const QBluetoothAddress& address) | void startDiscovery(const QBluetoothAddress& address) | ||
{ | { | ||
qDebug() << "サービス探索を開始..."; | |||
discoveryAgent.setRemoteAddress(address); | |||
discoveryAgent.start(QBluetoothServiceDiscoveryAgent::FullDiscovery); | |||
} | } | ||
456行目: | 595行目: | ||
void stopDiscovery() | void stopDiscovery() | ||
{ | { | ||
qDebug() << "サービス探索を停止..."; | |||
discoveryAgent.stop(); | |||
} | } | ||
private slots: | private slots: | ||
// | // サービスの探索に成功した場合 | ||
void onServiceDiscovered(const QBluetoothServiceInfo& service) | void onServiceDiscovered(const QBluetoothServiceInfo& service) | ||
{ | { | ||
476行目: | 609行目: | ||
// サービスの詳細情報を表示 | // サービスの詳細情報を表示 | ||
if (service.serviceUuid().isNull()) | if (service.serviceUuid().isNull()) qDebug() << " UUID: カスタムUUID"; | ||
else qDebug() << " UUID: " << service.serviceUuid().toString(); | |||
else | // サービスクラスを表示 | ||
QList<QBluetoothUuid> serviceClasses = service.serviceClassUuids(); | |||
if (!serviceClasses.isEmpty()) { | |||
qDebug() << " サービスクラス:"; | |||
for (const QBluetoothUuid& uuid : serviceClasses) { | |||
qDebug() << " -" << uuid.toString(); | |||
} | |||
} | } | ||
493行目: | 631行目: | ||
} | } | ||
// | // 探索完了時 | ||
void onScanFinished() | void onScanFinished() | ||
{ | { | ||
499行目: | 637行目: | ||
} | } | ||
// | // エラー発生時 | ||
void onError(QBluetoothServiceDiscoveryAgent::Error error) | void onError(QBluetoothServiceDiscoveryAgent::Error error) | ||
{ | { | ||
505行目: | 643行目: | ||
} | } | ||
}; | }; | ||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// 使用方法 | |||
ServiceDiscovery discovery; | |||
// 例: MACアドレスを指定してサービス探索を開始 | |||
QBluetoothAddress address("XX:XX:XX:XX:XX:XX"); | |||
discovery.startDiscovery(address); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> |