12,796
回編集
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: |