Qt 蓝牙实现连接

1、蓝牙模块在嵌入式设备上是通过串口连接,这样我们跟蓝牙进行交互是通过串口进行交互的。
2、蓝牙一般是两板,一般是主机和从机,每块板跟嵌入式核心板都是通过串口进行通信的。
3、蓝牙与蓝牙之间的通信方式这个我们不用管,我们只需要分别配置两块板,让主机能够扫描到从机。
4、蓝牙板跟嵌入式核心板它们之间的通信协议是AT指令集。
5、我们首先需要了解AT指令集,分别设置主机和从机。
6、然后通过AT指令获取从机的MAC地址,然后在主机上指定扫描从机的MAC地址。
7、扫描成功后会自动进行配对,配对后会自动进入透传模式。
8、什么是透传模式,蓝牙分为两种模式,分别是透传模式和AT模式,透传模式就是蓝牙与蓝牙之间需要进行通信时设置的。AT模式是设置蓝牙的一些功能的。
9、进入透传模式后,主机发送数据给从机,从机也可以发送数据给主机。发送数据完毕后,退出透传模式到AT模式,然后通过AT指令进行其它需要的操作。

AT指令集可以百度搜索,也可以私聊我

主机协议解析代码
核心解析部分:
.h

#ifndef BLUETOOTHHANDLER_H
#define BLUETOOTHHANDLER_H

#include <QObject>

/* AT command Set*/
#define AT_BLEMODE_M                "AT+BLEMODE=1\r\n"     			//设置蓝牙为主机
#define AT_RESTORE                  "AT+RESTORE\r\n"        		//恢复出厂设置指令
#define AT_BLENAME                  "AT+BLENAME=ai-think-s\r\n"    	//设置蓝牙模块名称
#define AT_BLEMAC                  	"AT+BLEMAC="                    //设置蓝牙模块MAC地址
#define AT_TRANSENTER               "AT+TRANSENTER\r\n"    			//进入透传模式
#define AT_QUITTRANSENTER           "+++"                           //退出透传模式
#define AT_BLEAUTH                  "AT+BLEAUTH=123456\r\n"    		//设置蓝牙模块配对码
#define AT_BLEADVEN                 "AT+BLEADVEN=1\r\n"    			//开启蓝牙广播(仅允许在蓝牙从机状态执行设置)
#define AT_BLEADVDATA               "AT+BLEADVDATA=123456\r\n"    	//设置蓝牙广播数据
#define AT_BLEDISCONNECT            "AT+BLEDISCON\r\n"    			//断开蓝牙连接
#define AT_BLEAUTOCON               "AT+BLEAUTOCON="                //自动扫描连接

/* AT command query */
#define AT                      	"AT\r\n"                		//测试指令,串口是否通着
#define AT_BLERFPWR_QUERY    		"AT+BLERFPWR?\r\n"      		//查询蓝牙发射功率
#define AT_BLESTATE_QUERY    		"AT+BLESTATE?\r\n"      		//查询蓝牙连接状态
#define AT_BLEUNLOCK          		"$USVBLEUNLOCK#"      		    //开锁
#define AT_BLELOCK          		"$USVBLELOCK#"      		    //上锁
#define AT_BLEUNLOCKRES          	"$USVBLEUNLOCKSUCCESS#"         //开锁返回值
#define AT_BLELOCKRES          		"$USVBLELOCKSUCESS#"      		//上锁返回值

class BluetoothHandler : public QObject
{
    Q_OBJECT

public:
    explicit BluetoothHandler();
    void connectBlueTooth();
    void checkData(QByteArray& by, bool& hasReadHead);

    void delay(int msec, QByteArray res);
signals:
    void sig_Ok();
signals:
    void signSend(const unsigned char* ch,int len,int retry = 3);
private:
    QByteArray m_data;
    QByteArray m_recvRes;
    bool m_connectStatus = false;
};

#endif // BLUETOOTHHANDLER_H

.cpp

#include "bluetoothhandler.h"
#include <QEventLoop>
#include <QTimer>
#include <QDebug>

BluetoothHandler::BluetoothHandler()
{

}

void BluetoothHandler::delay(int msec,QByteArray res)
{
    m_recvRes = res;
    QEventLoop loop;
    QTimer::singleShot(msec,&loop,SLOT(quit()));
    connect(this,&BluetoothHandler::sig_Ok,&loop,&QEventLoop::quit);
    loop.exec();
}

void BluetoothHandler::connectBlueTooth()
{
    //退出透传模式
    emit signSend((unsigned char*)AT_QUITTRANSENTER,strlen(AT_QUITTRANSENTER));
    delay(1000,"OK");
    m_data.clear();

    //恢复出厂设置
    emit signSend((unsigned char*)AT_RESTORE,strlen(AT_RESTORE));
    delay(5000,"ready");
    if (m_data.contains("++AT+RESTORE"))
    {
        m_data.clear();
        //指令跟缓存中的数据拼接了,重发恢复出厂设置
        emit signSend((unsigned char*)AT_RESTORE,strlen(AT_RESTORE));
        delay(5000,"ready");
        if (!m_data.contains("ready"))
        {
            connectBlueTooth();
            return;
        }
    }
    else
    {
        if (!m_data.contains("ready"))
        {
            connectBlueTooth();
            return;
        }
    }
    m_data.clear();

    //设置主机模式
    emit signSend((unsigned char*)AT_BLEMODE_M, strlen(AT_BLEMODE_M));
    delay(5000,"ready");
    if (!m_data.contains("ready"))
    {
        m_data.clear();
        connectBlueTooth();
        return;
    }
    m_data.clear();

    //获取MAC地址
    static QByteArray sss;
    sss.clear();
    sss.append(AT_BLEAUTOCON);
    sss.append("94c960392537");
    sss.append(",FALSE,0\r\n");

    //自动扫描
    const unsigned char* atcmd = (const unsigned char*)sss.data();
    emit signSend(atcmd, sss.size());
    delay(10000,"OK");
    if (!m_data.contains("OK"))
    {
        connectBlueTooth();
        m_data.clear();
        return;
    }
    m_data.clear();
}

void BluetoothHandler::checkData(QByteArray &by, bool &hasReadHead)
{
    qDebug()<<by;
    if (by.contains(m_recvRes))
        emit sig_Ok();
    if (by.contains("EVENT:BLE_CONNECTED"))
    {
        qDebug()<<"bluetooth connect sucess";
        m_connectStatus = true;
    }
    if (by.contains("EVENT:BLE_DISCONNECT"))
    {
        qDebug()<<"bluetooth disconnect sucess";
        m_connectStatus = false;
    }
    m_data = by;
    by.clear();
}

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在QT安卓应用中连接服务,首先需要确保您的安卓设备已经开启,并且已经配对了需要连接设备。以下是连接服务的步骤: 1. 添加必要的权限 在您的项目文件中,添加以下权限: ```xml <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> ``` 2. 添加代码 QT提供了QBluetooth类,用于在Qt应用程序中实现连接和通信。以下是在QT连接服务的示例代码: ```c++ QBluetoothSocket *socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol); connect(socket, SIGNAL(connected()), this, SLOT(connected())); connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected())); connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead())); QBluetoothAddress address("00:11:22:33:44:55"); socket->connectToService(address, QBluetoothUuid(serviceUuid), QIODevice::ReadWrite); ``` 在此示例中,我们创建了一个QBluetoothSocket对象,并连接了一些信号和槽函数,以便在连接建立、连接断开和收到数据时进行处理。我们使用地址和服务UUID连接设备的服务。 3. 处理连接事件 在我们的示例代码中,我们连接了connected()槽函数。这个函数将在连接成功建立时被调用。您可以在此函数中执行任何必要的操作,例如发送数据或显示连接状态。 ```c++ void connected() { qDebug() << "Connected!"; } ``` 4. 处理断开连接事件 我们还连接了disconnected()槽函数,以便在连接断开时进行处理。您可以在此函数中执行任何必要的操作,例如显示连接状态或重新连接设备。 ```c++ void disconnected() { qDebug() << "Disconnected!"; } ``` 5. 处理接收数据事件 最后,我们连接了readyRead()槽函数,以便在收到数据时进行处理。您可以在此函数中执行任何必要的操作,例如解析数据或显示数据。 ```c++ void readyRead() { QByteArray data = socket->readAll(); qDebug() << "Data received:" << data; } ``` 以上是在QT安卓应用中连接服务的基本步骤。请注意,连接可能会受到许多因素的影响,例如范围、设备电量和信号干扰。因此,您可能需要进行额外的调试和优化,以确保您的连接可靠和稳定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方忘忧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值