13,000
回編集
細 (Wiki がページ「Qtの基礎 - Bluetooth」を「Qtの基礎 - Classic Bluetooth」に、リダイレクトを残さずに移動しました) |
|||
172行目: | 172行目: | ||
各サービスはUUIDで識別されており、標準的なサービスには予め定義されたUUIDが割り当てられている。<br> | 各サービスはUUIDで識別されており、標準的なサービスには予め定義されたUUIDが割り当てられている。<br> | ||
また、カスタムサービスの場合は独自のUUIDを使用する。<br> | また、カスタムサービスの場合は独自のUUIDを使用する。<br> | ||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QBluetoothServiceDiscoveryAgent> | |||
#include <QBluetoothAddress> | |||
#include <QDebug> | |||
#include <memory> | |||
class ServiceDiscovery : public QObject | |||
{ | |||
Q_OBJECT | |||
private: | |||
std::unique_ptr<QBluetoothServiceDiscoveryAgent> discoveryAgent; | |||
// プロトコルタイプを文字列に変換するヘルパー関数 | |||
QString protocolToString(int protocol) | |||
{ | |||
switch (protocol) { | |||
case 0: return "不明なプロトコル"; | |||
case 1: return "SDP"; | |||
case 3: return "RFCOMM"; | |||
case 15: return "L2CAP"; | |||
default: return QString("その他のプロトコル (%1)").arg(protocol); | |||
} | |||
} | |||
// エラーコードを文字列に変換するヘルパー関数 | |||
QString errorToString(QBluetoothServiceDiscoveryAgent::Error error) | |||
{ | |||
switch (error) { | |||
case QBluetoothServiceDiscoveryAgent::NoError: return "エラーなし"; | |||
case QBluetoothServiceDiscoveryAgent::InputOutputError: return "I/Oエラー"; | |||
case QBluetoothServiceDiscoveryAgent::PoweredOffError: return "Bluetoothがオフ"; | |||
case QBluetoothServiceDiscoveryAgent::InvalidBluetoothAdapterError: return "無効なアダプタ"; | |||
case QBluetoothServiceDiscoveryAgent::UnknownError: return "不明なエラー"; | |||
default: return "予期せぬエラー"; | |||
} | |||
} | |||
public: | |||
explicit ServiceDiscovery(QObject* parent = nullptr) : QObject(parent) | |||
{ | |||
try { | |||
// サービス探索エージェントの作成 | |||
discoveryAgent = std::make_unique<QBluetoothServiceDiscoveryAgent>(this); | |||
// 各種シグナルとスロットの接続 | |||
connect(discoveryAgent.get(), &QBluetoothServiceDiscoveryAgent::serviceDiscovered, this, &ServiceDiscovery::onServiceDiscovered); | |||
connect(discoveryAgent.get(), &QBluetoothServiceDiscoveryAgent::finished, this, &ServiceDiscovery::onScanFinished); | |||
connect(discoveryAgent.get(), static_cast<void(QBluetoothServiceDiscoveryAgent::*)(QBluetoothServiceDiscoveryAgent::Error)>(&QBluetoothServiceDiscoveryAgent::error), | |||
this, &ServiceDiscovery::onError); | |||
} | |||
catch (const std::exception &e) { | |||
qDebug() << "初期化エラー: " << e.what(); | |||
throw; | |||
} | |||
} | |||
// 特定のデバイスのサービス探索を開始 | |||
void startDiscovery(const QBluetoothAddress& address) | |||
{ | |||
try { | |||
qDebug() << "サービス探索を開始..."; | |||
discoveryAgent->setRemoteAddress(address); | |||
discoveryAgent->start(QBluetoothServiceDiscoveryAgent::FullDiscovery); | |||
} | |||
catch (const std::exception &e) { | |||
qDebug() << "探索開始エラー:" << e.what(); | |||
throw; | |||
} | |||
} | |||
// 探索を停止 | |||
void stopDiscovery() | |||
{ | |||
try { | |||
qDebug() << "サービス探索を停止..."; | |||
discoveryAgent->stop(); | |||
} | |||
catch (const std::exception &e) { | |||
qDebug() << "探索停止エラー:" << e.what(); | |||
throw; | |||
} | |||
} | |||
private slots: | |||
// サービスの探索に成功した場合のスロット | |||
void onServiceDiscovered(const QBluetoothServiceInfo& service) | |||
{ | |||
qDebug() << "サービスの探索に成功:"; | |||
qDebug() << " サービス名: " << service.serviceName(); | |||
qDebug() << " サービス説明: " << service.serviceDescription(); | |||
qDebug() << " プロトコル: " << protocolToString(service.protocolServiceMultiplexer()); | |||
// サービスの詳細情報を表示 | |||
if (service.serviceUuid().isNull()) { | |||
qDebug() << " UUID: カスタムUUID"; | |||
} | |||
else { | |||
qDebug() << " UUID: " << service.serviceUuid().toString(); | |||
} | |||
// サービスクラスを表示 | |||
QList<QBluetoothUuid> serviceClasses = service.serviceClassUuids(); | |||
if (!serviceClasses.isEmpty()) { | |||
qDebug() << " サービスクラス:"; | |||
for (const QBluetoothUuid& uuid : serviceClasses) { | |||
qDebug() << " -" << uuid.toString(); | |||
} | |||
} | |||
} | |||
// 探索完了時のスロット | |||
void onScanFinished() | |||
{ | |||
qDebug() << "サービス探索が完了"; | |||
} | |||
// エラー発生時のスロット | |||
void onError(QBluetoothServiceDiscoveryAgent::Error error) | |||
{ | |||
qDebug() << "エラーが発生: " << errorToString(error); | |||
} | |||
}; | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||