成人免费无码不卡毛片,亚洲AⅤ无码精品一区二区三区,国产尤物精品视频,久久精品日本亚洲,欧美成人一区三区无码乱码A片,中文字日产幕码一区二区色哟哟,亞洲日韓中文字幕網AV

Qt編程實例:基于Android的BLE通信軟件

2021/01/11
248
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

實現(xiàn)目標

自己編寫基于 Qt 的 Android 軟件,用于實現(xiàn)手機與 TB-02-kit 模塊進行數(shù)據(jù)通訊;

Android 軟件發(fā)送的數(shù)據(jù),經(jīng) TB-02-kit 模塊轉發(fā)至串口助手中輸出;

串口助手發(fā)送的數(shù)據(jù)可以在 Android 軟件中顯示,進而實現(xiàn) BLE 的數(shù)據(jù)雙向通信。

所需工具及環(huán)境

  • TB-02-kit 模塊 Qt Creator 4.10.1Qt 5.13.1XCOM V2.0 串口助手 Android 手機本人電腦 Windows 10 64bit [版本 10.0.19041.329]

 

前置知識

給大家介紹一款好用的藍牙 BT5.0 透傳模塊

Windows 下基于 Qt 開發(fā) Android 應用

BLE 中這些概念你都了解嗎

本文源碼

因為是第一次分享 Qt 代碼,為了方便大家學習,代碼中添加了大量注釋,大家對照著代碼學習效率高點。

后臺回復關鍵字“Android-BLE”,獲取本文涉及到的軟件及 Qt 工程源碼。

具體實現(xiàn)

1. 要使用 Qt 藍牙模塊, 項目的 .pro 文件中要添加聲明才可使用

 

2. 掃描設備

在構造函數(shù)中執(zhí)行藍牙設備掃描,即軟件一啟動就執(zhí)行掃描。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 創(chuàng)建搜索服務:https://doc.qt.io/qt-5/qbluetoothdevicediscoveryagent.html
    discoveryAgent =new QBluetoothDeviceDiscoveryAgent(this);
    // 設置 BLE 的搜索時間
    discoveryAgent->setLowEnergyDiscoveryTimeout(20000);
    connect(discoveryAgent,SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),this,SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo)));// 找到設備之后添加到列表顯示出來
    connect(discoveryAgent, SIGNAL(finished()), this, SLOT(scanFinished()));
    connect(discoveryAgent, SIGNAL(canceled()), this, SLOT(scanCanceled()));
    connect(this, SIGNAL(returnAddress(QBluetoothDeviceInfo)), this, SLOT(createCtl(QBluetoothDeviceInfo)));

    // 開始進行設備搜索
    discoveryAgent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);
}

 

3. 將掃描結果添加到 QListWidget 中

//deviceDiscovered signals 對應的槽函數(shù)
void Widget::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info)
{
    if (info.coreConfigurations() & QBluetoothDeviceInfo::LowEnergyCoreConfiguration)           // 獲取設備信息,并判斷該設備是否為 BLE 設備
    {
        // 格式化設備地址和設備名稱
        QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
        // 檢查設備是否已存在,避免重復添加
        QList items = ui->ctrBleList->findItems(label, Qt::MatchExactly);

        // 不存在則添加至設備列表
        if (items.empty())
        {
            QListWidgetItem *item = new QListWidgetItem(label);
            ui->ctrBleList->addItem(item);
            devicesList.append(info);
        }
    }
}

 

4. 連接藍牙,停止掃描

void Widget::on_btnConnectBle_clicked()
{
    // 確認選取了某一個藍牙設備
    if(!ui->ctrBleList->currentItem()->text().isEmpty())
    {
        // 獲取選擇的地址
        QString bltAddress = ui->ctrBleList->currentItem()->text().left(17);

        for (int i = 0; i        {
            // 地址對比
            if(devicesList.at(i).address().toString().left(17) == bltAddress)
            {
                QBluetoothDeviceInfo choosenDevice = devicesList.at(i);
                // 發(fā)送自定義 signals==>執(zhí)行 slots:createCtl
                emit returnAddress(choosenDevice);
                // 停止搜索服務
                discoveryAgent->stop();
                break;
            }
        }
    }
}

 

5. 獲取特征

void Widget::searchCharacteristic()
{
    if(m_bleServer)
    {
        QList list=m_bleServer->characteristics();
        qDebug()<<"[xiaohage]list.count()="<        // 遍歷 characteristics
        for(int i=0;i        {
            QLowEnergyCharacteristic c=list.at(i);
            /*如果 QLowEnergyCharacteristic 對象有效,則返回 true,否則返回 false*/
            if(c.isValid())
            {
                // 返回特征的屬性。
                // 這些屬性定義了特征的訪問權限。
                if(c.properties() & QLowEnergyCharacteristic::WriteNoResponse || c.properties() & QLowEnergyCharacteristic::Write)
                {
                    ui->ctrSystemLogInfo->insertPlainText("n 具有寫權限!");
                    m_writeCharacteristic = c;  // 保存寫權限特性
                    if(c.properties() & QLowEnergyCharacteristic::WriteNoResponse)
                    {
                        m_writeMode = QLowEnergyService::WriteWithoutResponse;
                    }
                    else
                    {
                        m_writeMode = QLowEnergyService::WriteWithResponse;
                    }
                }

                if(c.properties() & QLowEnergyCharacteristic::Read)
                {
                    m_readCharacteristic = c; // 保存讀權限特性
                }

                // 描述符定義特征如何由特定客戶端配置。
                m_notificationDesc = c.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
                // 值為真
                if(m_notificationDesc.isValid())
                {
                    // 寫描述符
                    m_bleServer->writeDescriptor(m_notificationDesc, QByteArray::fromHex("0100"));
                    ui->ctrSystemLogInfo->insertPlainText("n 寫描述符!");
                }
            }
        }
    }
}

 

6. 發(fā)送數(shù)據(jù)

writeCharacteristic()方法,發(fā)送數(shù)據(jù)給 ble 設備。

點擊界面中的"發(fā)送"按鈕,發(fā)送"Hello World"字符串。

void Widget::SendMsg(QString text)
{
    QByteArray array=text.toLocal8Bit();

    m_bleServer->writeCharacteristic(m_writeCharacteristic,array, m_writeMode);
}

void Widget::on_btnSendData_clicked()
{
    SendMsg("Hello World");
}

 

7. 寫入數(shù)據(jù)

通過藍牙 QLowEnergyService::characteristicRead 的回調接口,接收藍牙收到的消息。

void Widget::BleServiceCharacteristicRead(const QLowEnergyCharacteristic &c,const QByteArray &value)
{
    Q_UNUSED(c)

    ui->ctrSystemLogInfo->insertPlainText("n 當特征讀取請求成功返回其值時:");
    ui->ctrSystemLogInfo->insertPlainText(QString(value));
}

 

8. 斷開連接

Widget::~Widget()
{
    if(!(m_BLEController->state() == QLowEnergyController::UnconnectedState))
            m_BLEController->disconnectFromDevice();// 從設備斷開鏈接

    delete ui;
}

 

界面布局

 

結果展示

如果出現(xiàn)" Cannot connect to remote device. " ,可以點擊"連接"按鈕重新連接一下。

串口助手及應用程序輸出

 

To do

本實例只是演示一下 Android 手機與 TB-02-kit 模塊的通訊過程,程序里有需要完善的地方,比如,應該增加一個"掃描"按鈕,而不是軟件啟動過程中直接進行藍牙掃描,這樣的話,就需要藍牙的上電要在軟件啟動之前完成。

程序的健壯性也要完善,比如偶爾會出現(xiàn)與模塊無法正常連接的情況,需要再次點擊"連接"按鈕才可,這些工作你們自己可以完善一下哈。

有了本部分知識,下一步我們結合 Android 手機和 TB-02-kit 模塊,實現(xiàn) STM32 的設備的遠程控制

Qt 小知識

1. Qt Creator 程序輸出窗口過濾調試信息

 

2. 為 Button 添加事件

Button 控件右鍵菜單中選中“轉到槽 ...”,然后在彈出列表中選中信號:“clicked() ”,然后點擊 OK 按鈕,即可進入其事件函數(shù)中。

 

參考資料

Qt 官方文檔:https://doc.qt.io/qt-5/classes.html

谷歌

谷歌

谷歌公司(Google Inc.)成立于1998年9月4日,由拉里·佩奇和謝爾蓋·布林共同創(chuàng)建,被公認為全球最大的搜索引擎公司。谷歌是一家位于美國的跨國科技企業(yè),業(yè)務包括互聯(lián)網(wǎng)搜索、云計算、廣告技術等,同時開發(fā)并提供大量基于互聯(lián)網(wǎng)的產(chǎn)品與服務,其主要利潤來自于關鍵詞廣告等服務。

谷歌公司(Google Inc.)成立于1998年9月4日,由拉里·佩奇和謝爾蓋·布林共同創(chuàng)建,被公認為全球最大的搜索引擎公司。谷歌是一家位于美國的跨國科技企業(yè),業(yè)務包括互聯(lián)網(wǎng)搜索、云計算、廣告技術等,同時開發(fā)并提供大量基于互聯(lián)網(wǎng)的產(chǎn)品與服務,其主要利潤來自于關鍵詞廣告等服務。收起

查看更多

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

公眾號『嵌入式從0到1』,號主:程序員小哈,是一個軟硬件全棧開發(fā)工程師(12年工作經(jīng)驗的老司機),電子發(fā)燒友論壇鴻蒙版塊版主,公眾號內容專注于嵌入式學習。堅持原創(chuàng),寫有圖、有視頻的保姆級教程文章,篇篇有干貨。做一個講清楚,說明白,大家學得會的交流平臺。

沧州市| 芦溪县| 宝山区| 长治市| 永泰县| 芦山县| 遂昌县| 安阳市| 北辰区| 兴隆县| 涡阳县| 晋城| 台南市| 泰宁县| 开平市| 仪陇县| 嘉义市| 仁布县| 邯郸县| 菏泽市| 博爱县| 广丰县| 麟游县| 长子县| 蒙阴县| 东台市| 兴文县| 广宁县| 海盐县| 屯留县| 汕头市| 休宁县| 米泉市| 新晃| 勐海县| 邵阳市| 金门县| 平顺县| 乌鲁木齐县| 黄石市| 贞丰县|