【问题标题】:QtBlueTooth not functional on LinuxQtBlueTooth 在 Linux 上不起作用
【发布时间】:2017-04-15 13:28:04
【问题描述】:

我正在开发一个使用 Qt 5.7 启用蓝牙 LE 功能的嵌入式应用程序。我正在开发的设备旨在充当外围角色,它可以广播广告包并让智能手机连接到。

目标板运行 Ubuntu Linux 14.04,bluez 版本 5.43(最新)由于 Qt 文档说“在 Qt 5.7 中,添加了支持外围角色的附加 API 作为技术预览,后端仅针对 Linux 实现/蓝Z。”所以,我认为 Qt 蓝牙 API 正是我所需要的。

但是当我构建和运行 Qt 蓝牙示例(蓝牙低能量心率服务器示例和蓝牙扫描仪示例)时,它们都不起作用。我只能得到控制台输出:“qt.bluetooth: Dummy backend running. Qt Bluetooth module is non-functional。”

我在谷歌上搜索了那个错误消息,似乎很多开发人员都收到了这个错误消息,因为他们在 Windows 平台上使用 Qt bluetooth API,而 qt bluetooth api 不支持 Windows。但是我使用的是 Ubuntu Linux,很明显有问题,但我不知道究竟是什么导致了这个问题。

我正在尝试什么:

  1. 启用 QtBluetooth 日志记录。但没有什么比这更有趣的信息了。
  2. 不要使用任何 Qt 蓝牙 API,只需使用命令行工具 hciconfig 和 hcitool 手动设置广告操作。它确实有效!我的 iPhone 可以“看到”设备,我可以连接到它!

根据我的尝试,我认为我的硬件还可以,蓝牙芯片可以工作,但我确实需要 QtBluetooth API 才能正常工作。也许我错过了一些重要的事情? bluez 需要一些配置吗?请帮忙。

【问题讨论】:

    标签: linux qt bluetooth bluez


    【解决方案1】:

    好的,我终于设法解决了这个问题。 Qt 有一些特性测试功能,当你通过源代码构建它时。如果主机上没有安装一些开发包,会导致测试失败,功能无法正常工作。在这种情况下,qt 将使用虚拟后端,因此示例应用程序仍然可以编译并运行,但没有任何实际用途。

    说到 qt 蓝牙,所需的开发包是 libbluetooth-dev bluetooth blueman bluez libusb-dev libdbus-1-dev bluez-hcidump bluez-tools(我列出了比需要更多的安装,以防万一),确保在 BEFORE 制作之前将所有这些安装在主机上。

    完成所有准备工作后,我运行配置脚本为 Qt 生成 Makefile。这是我使用的配置脚本:

    #!/bin/sh
    ./configure \
    -v \
    -prefix /opt/qt-5.7.0 \
    -release \
    -opensource \
    -xplatform linux-arm-gnueabi-g++ \    # yes, I need to cross-compile
    -qt-sql-sqlite \
    -qt-zlib \
    -qt-pcre \
    -no-opengl \
    -no-sse2 \
    -no-openssl \
    -qt-freetype \
    -nomake examples \
    -nomake tests \
    -no-separate-debug-info \
    -no-qml-debug \
    -pkg-config \
    -confirm-license    
    

    运行configure脚本后,你会在你的QtSourcePath/qtbase/bin/下得到一个qmake可执行文件,然后你可以通过执行来测试你的qtbluetooth功能:

    qtSourcePath/qtbase/bin/qmake qtSourcePath/qtconnectivity/qtconnectivity.pro   
    

    如果您看到类似的内容:

    Checking for bluez... yes
    Checking for bluez_le... yes
    Checking for linux_crypto_api... yes
    

    那么你就可以走了,只需为整个 Qt 源代码 make && make install,qt 蓝牙现在可以正常工作了。

    编辑:

    如果无论如何您都无法通过蓝牙测试(当您需要交叉编译时很有可能,就像我的情况一样),我已经找到了一个解决方法。你还是需要在make之前安装所有需要的dev-packages,这次为了通过蓝牙功能测试,你可以使用你系统自带的qmake(apt-get install qt5-qmake, NOT 您通过运行配置脚本生成的 qmake)与 qtconnectivity.pro 一起使用。这样,您可以通过蓝牙功能测试并为 qtconnectivity 模块生成 Makefile。

    修改Makefile,改变QMAKE参数。就我而言,结果如下:

    - QMAKE = /usr/lib/x86_64-linux-gnu/qt5/bin/qmake
    + QMAKE = /opt/qt-everywhere-opensource-src-5.7.0/qtbase/bin/qmake 
    

    然后,您可以通过 make && make install 交叉编译整个 Qt 源代码。

    我已经测试了解决方法,示例应用程序(heartRate 服务器)现在可以正常工作。烦人的消息“qt.bluetooth: Dummy backend running. Qt Bluetooth module is non-functional”消失了:)

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题。 当我尝试为我的硬件交叉编译 Qt 框架时,蓝牙相关库显示相同的日志:

      “qt.bluetooth:虚拟后端正在运行。Qt 蓝牙模块不起作用。”

      在我的案例中,这个问题的根本原因在于 sysroot。它没有蓝牙包含和库。这就是 Qt 蓝牙测试未能通过的原因。

      在这种情况下,我建议添加-v 标志,以便它显示完整的日志,并且您可以检查 Qt 测试失败的确切问题。

      当我从设备下载必要的文件夹以及所有库并包含并将其用作-sysroot 参数时,我的问题得到了解决。测试成功通过,无需使用@colin 建议的解决方法。

      【讨论】:

        猜你喜欢
        • 2019-05-14
        • 2012-10-06
        • 2017-11-25
        • 2013-03-22
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多