13,009
回編集
| 1,314行目: | 1,314行目: | ||
| <br><br> | <br><br> | ||
| == BLE通信の使用例 == | |||
|  <syntaxhighlight lang="c++"> | |||
|  // BLEManager.hファイル | |||
|  #include <QCoreApplication> | |||
|  #include <QTimer> | |||
|  #include <memory> | |||
|  #include "bledevicescanner.h" | |||
|  #include "bleservicediscovery.h" | |||
|  #include "blepairing.h" | |||
|  #include "bleconnection.h" | |||
|  #include "bledatatransfer.h" | |||
|  class BLEManager : public QObject | |||
|  { | |||
|     Q_OBJECT | |||
|  private: | |||
|     std::unique_ptr<BLEDeviceScanner>    scanner; | |||
|     std::unique_ptr<BLEServiceDiscovery> serviceDiscovery; | |||
|     std::unique_ptr<BLEPairing>          pairing; | |||
|     std::unique_ptr<BLEConnection>       connection; | |||
|     std::unique_ptr<BLEDataTransfer>     dataTransfer; | |||
|     QBluetoothDeviceInfo                 targetDevice; | |||
|     std::unique_ptr<QTimer>              transferTimer; | |||
|     void connectSignals() | |||
|     { | |||
|        // スキャナのシグナル接続 | |||
|         connect(scanner.get(), &BLEDeviceScanner::deviceDiscovered, this, &BLEManager::onDeviceDiscovered); | |||
|         connect(scanner.get(), &BLEDeviceScanner::errorOccurred, this, &BLEManager::onErrorOccurred); | |||
|         // ペアリングのシグナル接続 | |||
|         connect(pairing.get(), &BLEPairing::pairingComplete, this, &BLEManager::onPairingComplete); | |||
|         connect(pairing.get(), &BLEPairing::errorOccurred, this, &BLEManager::onErrorOccurred); | |||
|         // 接続管理のシグナル接続 | |||
|         connect(connection.get(), &BLEConnection::connected, this, &BLEManager::onConnected); | |||
|         connect(connection.get(), &BLEConnection::serviceDiscovered, this, &BLEManager::onServiceDiscovered); | |||
|         connect(connection.get(), &BLEConnection::errorOccurred, this, &BLEManager::onErrorOccurred); | |||
|         // データ転送のシグナル接続 | |||
|         connect(dataTransfer.get(), &BLEDataTransfer::characteristicChanged, this, &BLEManager::onCharacteristicChanged); | |||
|         connect(dataTransfer.get(), &BLEDataTransfer::errorOccurred, this, &BLEManager::onErrorOccurred); | |||
|     } | |||
|     void startPeriodicDataTransfer() | |||
|     { | |||
|        transferTimer = std::make_unique<QTimer>(this); | |||
|        transferTimer->setInterval(1000);  // 1秒間隔 | |||
|        connect(transferTimer.get(), &QTimer::timeout, this, [this]() { | |||
|           // サンプルデータの送信 | |||
|           QByteArray data = generateSampleData(); | |||
|           dataTransfer->writeCharacteristic(QBluetoothUuid(QString("YOUR_CHARACTERISTIC_UUID")), data ); | |||
|        }); | |||
|        transferTimer->start(); | |||
|     } | |||
|     QByteArray generateSampleData() | |||
|     { | |||
|        // サンプルデータの生成 (実務では、適切なデータを生成) | |||
|        QByteArray data; | |||
|        data.append(0x01);  // コマンド | |||
|        data.append(0x02);  // データ長 | |||
|        data.append(0x03);  // データ1 | |||
|        data.append(0x04);  // データ2 | |||
|        return data; | |||
|     } | |||
|     void processReceivedData(const QByteArray &data) | |||
|     { | |||
|        // 受信データの処理 (実務では、適切な処理を実装) | |||
|        if (data.isEmpty()) return; | |||
|        // データの解析例 | |||
|        quint8 command = data.at(0); | |||
|        switch (command) { | |||
|           case 0x01: | |||
|              qDebug() << "コマンド1を受信"; | |||
|              break; | |||
|           case 0x02: | |||
|              qDebug() << "コマンド2を受信"; | |||
|              break; | |||
|           default: | |||
|              qDebug() << "不明なコマンド: " << command; | |||
|              break; | |||
|        } | |||
|     } | |||
|  public: | |||
|     explicit BLEManager(QObject* parent = nullptr) : QObject(parent) | |||
|     { | |||
|        // 各コンポーネントの初期化 | |||
|        scanner = std::make_unique<BLEDeviceScanner>(this); | |||
|        serviceDiscovery = std::make_unique<BLEServiceDiscovery>(this); | |||
|        pairing = std::make_unique<BLEPairing>(this); | |||
|        connection = std::make_unique<BLEConnection>(this); | |||
|        dataTransfer = std::make_unique<BLEDataTransfer>(this); | |||
|        connectSignals(); | |||
|     } | |||
|     // デバイススキャンを開始 | |||
|     void startDeviceScan() | |||
|     { | |||
|        qDebug() << "BLEデバイスのスキャンを開始..."; | |||
|        scanner->startScan(); | |||
|     } | |||
|  private slots: | |||
|     void onDeviceDiscovered(const QBluetoothDeviceInfo& device) | |||
|     { | |||
|        // ターゲットデバイスかどうかを確認 (実務では、適切なフィルタリングが必要) | |||
|        if (device.name().contains("YourDeviceName", Qt::CaseInsensitive)) | |||
|        { | |||
|           scanner->stopScan(); | |||
|           targetDevice = device; | |||
|           qDebug() << "ターゲットデバイスを発見: " << device.name(); | |||
|           // ペアリングを開始 | |||
|           pairing->requestPairing(device.address()); | |||
|        } | |||
|     } | |||
|     void onPairingComplete(const QBluetoothAddress &address, bool success) | |||
|     { | |||
|        if (success) { | |||
|           qDebug() << "ペアリング完了: 接続を開始..."; | |||
|           connection->connectToDevice(targetDevice); | |||
|        } | |||
|        else { | |||
|           qDebug() << "ペアリングに失敗"; | |||
|        } | |||
|     } | |||
|     void onConnected() | |||
|     { | |||
|        qDebug() << "デバイスに接続完了"; | |||
|        connection->setAutoReconnect(true);  // 自動再接続を有効化 | |||
|     } | |||
|     void onServiceDiscovered(QLowEnergyService *service) | |||
|     { | |||
|        qDebug() << "サービスを発見: " << service->serviceUuid().toString(); | |||
|        // 対象のサービスかどうかを確認 | |||
|        if (service->serviceUuid() == QBluetoothUuid(QString("YOUR_SERVICE_UUID"))) { | |||
|           dataTransfer->setService(service); | |||
|           // Notifyを有効化 | |||
|           dataTransfer->enableNotifications(QBluetoothUuid(QString("YOUR_CHARACTERISTIC_UUID"))); | |||
|           // 定期的なデータ送信を開始 | |||
|           startPeriodicDataTransfer(); | |||
|        } | |||
|     } | |||
|     void onCharacteristicChanged(const QBluetoothUuid &uuid, const QByteArray &value) | |||
|     { | |||
|        qDebug() << "データを受信:"; | |||
|        qDebug() << "  UUID: " << uuid.toString(); | |||
|        qDebug() << "  値: " << value.toHex(); | |||
|        // 受信データの処理 | |||
|        processReceivedData(value); | |||
|     } | |||
|     void onErrorOccurred(const QString &error) | |||
|     { | |||
|        qDebug() << "エラーが発生: " << error; | |||
|        // エラーに応じた適切な処理を実装 | |||
|        // ...略 | |||
|     } | |||
|  }; | |||
|  </syntaxhighlight> | |||
| <br> | |||
|  <syntaxhighlight lang="c++"> | |||
|  // main.cppファイル | |||
|  #include <QCoreApplication> | |||
|  #include "BLEManager.h" | |||
|  int main(int argc, char *argv[]) | |||
|  { | |||
|     QCoreApplication app(argc, argv); | |||
|     try { | |||
|        // BLEマネージャーオブジェクトの生成と開始 | |||
|        auto bleManager = std::make_unique<BLEManager>(); | |||
|        bleManager->startDeviceScan(); | |||
|        return app.exec(); | |||
|     } | |||
|     catch (const std::exception &e) { | |||
|        qDebug() << "致命的なエラーが発生: " << e.what(); | |||
|        return -1; | |||
|     } | |||
|  } | |||
|  </syntaxhighlight> | |||
| <br><br> | |||
| {{#seo: | {{#seo: | ||