Qt Bluetoothの概要
Qt Bluetooth API の典型的なユースケースは以下の通りです:
- ローカルのBluetoothデバイスの情報を取得する。
- 範囲内にある他のBluetoothデバイスをスキャンし、それらの情報を取得する。
- OBEX Object Push Profile(OPP)を使用してリモートデバイスにファイルをプッシュする。
- シリアルポートプロファイル(SPP)を使用して、RFCOMMチャネルを介してリモートデバイスに接続する。
- SPPを使用した着信接続を許可するRFCOMMサーバーの作成
- Bluetooth Low Energy デバイスの仕様を取得します。
- Bluetooth Low Energy デバイスに接続します。
- Bluetooth Low Energy デバイスからアドバタイズを受信する。
Object Push Profile は Android と Windows ではサポートされていません。
Windows では、RFCOMM 機能の一部を Qt で設定することはできません 。サービスのServiceClassIds とProtocolDescriptorList は自動的に入力されます。そのため、これらのフィールドにカスタム値を指定してサービスを登録しても、Windows では期待した結果が得られない場合があります。
注意: RSSI(Received Signal Strength Indicator)とBluetooth LEデバイスによってアドバタイズされるManufacturer Specific DataはWin32バックエンドではサポートされていません。また、ペアリング済みのデバイスを見つけるには、Windows 設定を使用します。
以下のセクションでは、上記のユースケースで Qt Bluetooth C++ API クラスを使用する方法を説明します。
ローカルデバイス情報の取得
Qt Bluetooth API には 3 つの主な目的があります。最初の目的は、ローカルおよびリモートのデバイス情報を取得することです。デバイス情報を取得する最初のステップは、デバイス上でBluetoothが利用可能かどうかをチェックし、ローカルデバイスのアドレスと名前を読み取ることです。QBluetoothLocalDevice は、これらの情報をすべて提供するクラスです。さらに、Bluetoothのオン/オフ、デバイスの可視性の設定、現在の接続の確認にも使用できます。
QBluetoothLocalDevice localDevice; QString localDeviceName; // Check if Bluetooth is available on this device if (localDevice.isValid()) { // Turn Bluetooth on localDevice.powerOn(); // Read local device name localDeviceName = localDevice.name(); // Make it visible to others localDevice.setHostMode(QBluetoothLocalDevice::HostDiscoverable); // Get connected devices QList<QBluetoothAddress> remotes; remotes = localDevice.connectedDevices(); }
Bluetoothデバイスのスキャン
QBluetoothLocalDevice と同様に、API はQBluetoothDeviceInfo を提供し、リモート・デバイスの同様の情報を提供します。自分でQBluetoothDeviceInfo オブジェクトを作成し、そこにデータを入力することもできますが、より簡単な方法は、QBluetoothDeviceDiscoveryAgent を使用して、接続可能な範囲内にある可視Bluetoothデバイスの自動検索を開始することです。
void MyClass::startDeviceDiscovery() { // Create a discovery agent and connect to its signals QBluetoothDeviceDiscoveryAgent *discoveryAgent = new QBluetoothDeviceDiscoveryAgent(this); connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), this, SLOT(deviceDiscovered(QBluetoothDeviceInfo))); // Start a discovery discoveryAgent->start(); //... } // In your local slot, read information about the found devices void MyClass::deviceDiscovered(const QBluetoothDeviceInfo &device) { qDebug() << "Found new device:" << device.name() << '(' << device.address().toString() << ')'; }
デバイス間のデータ交換
2台のBluetooth対応デバイス間で通信を行うより柔軟な方法は、仮想シリアルポート接続を作成し、その接続を介して自由にデータを交換することです。これはシリアルポートプロファイル(SPP)によって実現できます。シリアルポートプロファイルは、BluetoothトランスポートプロトコルRFCOMM上でシリアル接続をエミュレートします。
着信SPP接続を受信できるようにするには、QBluetoothServer を使って着信接続をリッスンする必要があります。
rfcommServer = new QBluetoothServer(QBluetoothServiceInfo::RfcommProtocol, this); connect(rfcommServer, &QBluetoothServer::newConnection, this, QOverload<>::of(&ChatServer::clientConnected)); bool result = rfcommServer->listen(localAdapter); if (!result) { qWarning() << "Cannot bind chat server to" << localAdapter.toString(); return; }
QBluetoothSocket を使用して、クライアントの役割を果たす別のデバイスからこのサーバーに接続します:
void ChatClient::startClient(const QBluetoothServiceInfo &remoteService) { if (socket) return; // Connect to service socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol); qDebug() << "Create socket"; socket->connectToService(remoteService); qDebug() << "ConnectToService done"; connect(socket, &QBluetoothSocket::readyRead, this, &ChatClient::readSocket); connect(socket, &QBluetoothSocket::connected, this, QOverload<>::of(&ChatClient::connected)); connect(socket, &QBluetoothSocket::disconnected, this, &ChatClient::disconnected); connect(socket, &QBluetoothSocket::errorOccurred, this, &ChatClient::onSocketErrorOccurred); }
このような接続を使用すると、双方向であらゆる形式のデータを交換できます。ゲームや、2つのデバイス上の2つのアプリケーションのインスタンス間の状態を同期させるのに最適です。サーバーとクライアントの設定方法の詳細については、QBluetoothServer とQBluetoothSocket クラスの詳細説明セクションを参照してください。SPPを始めるのに適した例は、Bluetooth Chatの例です。
Bluetooth Low Energy
Bluetooth Smartとしても知られるBluetooth Low Energyは、エネルギー消費の少ないデバイス同士の通信を可能にする新しい技術です。この技術と関連する Qt API の詳細については、Bluetooth Low Energy Overview を参照してください。
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。