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 で設定することはできません 。サービスのServiceClassIdsProtocolDescriptorList は自動的に入力されます。そのため、これらのフィールドにカスタム値を指定してサービスを登録しても、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つのアプリケーションのインスタンス間の状態を同期させるのに最適です。サーバーとクライアントの設定方法の詳細については、QBluetoothServerQBluetoothSocket クラスの詳細説明セクションを参照してください。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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。