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

ナビゲーションに移動 検索に移動
 
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>
==== 組み合わせ ====
==== 組み合わせ ====

案内メニュー