「Qtの基礎 - Bluetooth Low Energy」の版間の差分

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: