13,005
回編集
903行目: | 903行目: | ||
デバイスのMACアドレスとポート番号を指定して、<code>QBluetoothSocket::connectToService</code>メソッドを実行する。<br> | デバイスのMACアドレスとポート番号を指定して、<code>QBluetoothSocket::connectToService</code>メソッドを実行する。<br> | ||
接続状態の変化を監視するためのシグナル / スロット接続を設定する。<br> | 接続状態の変化を監視するためのシグナル / スロット接続を設定する。<br> | ||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QBluetoothSocket> | |||
#include <QDebug> | |||
QBluetoothSocket socket(QBluetoothServiceInfo::RfcommProtocol); | |||
connect(&socket, &QBluetoothSocket::connected, []() { | |||
qDebug() << "接続成功"; | |||
}); | |||
connect(&socket, &QBluetoothSocket::stateChanged, [](QBluetoothSocket::SocketState state) { | |||
qDebug() << "状態変更:" << state; | |||
}); | |||
connect(&socket, &QBluetoothSocket::errorOccurred, [](QBluetoothSocket::SocketError error) { | |||
qDebug() << "エラー発生:" << error; | |||
}); | |||
</syntaxhighlight> | |||
<br> | |||
RFCOMM (Radio Frequency Communication) とは、Bluetooth Classicで使用される重要なプロトコルの1つである。<br> | |||
RFCOMMプロトコルの特徴を以下に示す。<br> | |||
* シリアルポート通信をエミュレートするプロトコル | |||
* RS-232C通信の代替として設計 | |||
* 信頼性の高い双方向通信を提供 | |||
* 最大60個の同時接続をサポート | |||
<br> | |||
Qtで使用可能な他のBluetoothプロトコルを以下に示す。<br> | |||
* L2CAP (Logical Link Control and Adaptation Protocol) | |||
*: 低レイヤーのプロトコル | |||
*: RFCOMMの基盤となるプロトコル | |||
*: より高速なデータ転送が可能 | |||
*: 生のデータパケット送受信に使用 | |||
*: <br> | |||
* RFCOMM | |||
*: 最も使用される。 | |||
*: シリアルポートエミュレーション | |||
*: 多くのBluetooth機器で採用されている。 | |||
*: 多くのBluetooth通信では、使いやすさと互換性の高さからRFCOMMが選択される。 | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// RFCOMMプロトコルを指定する場合 | |||
// シリアル通信が必要な場合 あるいは 安定性が重要な場合 | |||
QBluetoothSocket socket(QBluetoothServiceInfo::RfcommProtocol); | |||
// L2CAPプロトコルを指定する場合 | |||
// 高速な通信が必要な場合 あるいは 低レベルの制御が必要な場合 | |||
QBluetoothSocket socket(QBluetoothServiceInfo::L2capProtocol); | |||
</syntaxhighlight> | |||
<br> | <br> | ||
==== 接続の維持 ==== | ==== 接続の維持 ==== | ||
912行目: | 961行目: | ||
<br> | <br> | ||
また、必要に応じて定期的なキープアライブメッセージを送信する。<br> | また、必要に応じて定期的なキープアライブメッセージを送信する。<br> | ||
<br> | |||
<syntaxhighlight lang="c++"> | |||
QBluetoothAddress address("XX:XX:XX:XX:XX:XX"); | |||
socket.connectToService(address, <ポート番号 例: 1>); | |||
</syntaxhighlight> | |||
<br> | <br> | ||
==== データの送信 ==== | ==== データの送信 ==== | ||
<code>QBluetoothSocket::write</code>メソッドを使用してデータを送信する。<br> | <code>QBluetoothSocket::write</code>メソッドを使用してデータを送信する。<br> | ||
<br> | |||
<syntaxhighlight lang="c++"> | |||
QByteArray sendData = "Hello"; | |||
socket.write(sendData); | |||
</syntaxhighlight> | |||
<br> | <br> | ||
==== データの受信 ==== | ==== データの受信 ==== | ||
# <code>QBluetoothSocket::readyRead</code>シグナルを受信してデータの到着を検知する。 | # <code>QBluetoothSocket::readyRead</code>シグナルを受信してデータの到着を検知する。 | ||
# <code>QBluetoothSocket::readAll</code>メソッド、あるいは、<code>QBluetoothSocket::read</code>メソッドでデータを読む。 | # <code>QBluetoothSocket::readAll</code>メソッド、あるいは、<code>QBluetoothSocket::read</code>メソッドでデータを読む。 | ||
<br> | |||
<syntaxhighlight lang="c++"> | |||
connect(&socket, &QBluetoothSocket::readyRead, []() { | |||
QByteArray data = socket.readAll(); | |||
qDebug() << "受信データ: " << data; | |||
}); | |||
</syntaxhighlight> | |||
<br> | <br> | ||
==== 切断処理 ==== | ==== 切断処理 ==== | ||
924行目: | 990行目: | ||
# <code>QBluetoothSocket::disconnected</code>シグナルを受信して切断完了を確認する。 | # <code>QBluetoothSocket::disconnected</code>シグナルを受信して切断完了を確認する。 | ||
# 必要に応じて、リソースの解放を実施する。 | # 必要に応じて、リソースの解放を実施する。 | ||
<br> | |||
<syntaxhighlight lang="c++"> | |||
connect(&socket, &QBluetoothSocket::disconnected, []() { | |||
qDebug() << "切断完了"; | |||
}); | |||
// 切断を実行 | |||
socket.disconnectFromService(); | |||
</syntaxhighlight> | |||
<br> | <br> | ||
==== 組み合わせ ==== | ==== 組み合わせ ==== |