C

暖通空调控制

"QtAA HVAC Control"

构建和部署示例

请参阅有关构建和部署 Qt for Android Automotive 示例的具体步骤

概述

此示例应用程序利用了 Android Automotive 的 Qt IF 生成器扩展。它使用 Qt 接口框架 和 Qt for Android Automotive 来处理 Android 特定的数据类型以及 Android Automotive 后端。

该解决方案基于后端和前端组件的生成代码,接口定义在用 QFace 定义的接口定义语言 (IDL) 中,并使用 YAML 文件进行注释。UI 在 Qt Design Studio 项目中定义,并通过插件(基于生成代码)与前端通信。

不同通信模型的子项目

后端与服务之间有几种通信选项

  • Java 原生接口 (JNI):通过在 Android 环境中使用基本通信选项,后端通过 JNI 直接从本地代码调用 Vehicle Properties Java API
  • Qt 远程对象 (QtRO):通过使用 Qt 的跨域通信框架(默认使用 QtRORegistry 的抽象 Unix 域套接字配置),后端调用另一个 Android 服务(在本例中称为 hvac_service),该服务从服务自己的独立进程中调用 Android Automotive Vehicle Properties API

两种配置使用相同的接口定义(.qface 和 .yaml 文件)以及 UI 定义(Qt Design Studio 项目)。

使用后端 API

暖通空调后端是由 Qt 接口框架生成器 生成的,基于 QFace API 定义(ifvehiclefunctions.qface)。为了使应用程序能够访问此后端,需要在 QML 应用程序和 C++ 实现中添加某些代码。

可以通过 ClimateControl 插件访问暖通空调后端。该插件基于 imports 子项目构建,作为一个 ClimateControl 组件导出到 QtIf.Android.VehicleFunctions 模块中。需要将模块导入到 QML 文档中,然后实例化插件组件,如下所示

import QtIf.Android.VehicleFunctions

在 Qt 远程对象目标的情况下,需要在后端服务的 main() 函数中启用远程对象连接,如下所示

    QAndroidService app(argc, argv);
    QIfRemoteObjectsConfig config;
    config.enableRemoting(u"QtIfAndroidVehicleFunctions"_s,
                          u"QIfClimateControl"_s,
                          QUrl("localabstract:hvac_qtro"),
                          QIfClimateControlBackend::instance());
    return app.exec();

上述设置允许使用后端安卓服务(本例中称为hvac_service)与QML应用程序之间的连接。

注意:在本例中,后端连接定义在独立的QML文件中,即ClimateControlFacade.qml,这将用户界面实现和与后端服务的通信分离。这种方法便于为Qt Design Studio创建ClimateControl占位符实现。

我们首先声明ClimateControl组件。

    ClimateControl {
        id: climateControl
    }

现在,我们可以利用QFace API定义中定义的属性。

    Connections {
        target: climateControl
        function onPowerOnChanged(powerOn) { facade.powerOn = powerOn }
        function onAcOnChanged(acOn) { facade.acOn = acOn }
        function onMaxAcOnChanged(maxAcOn) { facade.maxAcOn = maxAcOn }
        function onAutoOnChanged(autoOn) { facade.autoOn = autoOn }
        function onFanSpeedChanged(fanSpeed) { facade.fanSpeed = fanSpeed }

将值传递到后端的方式类似。

    Connections {
        target: facade
        function onPowerOnChanged() { climateControl.powerOn = facade.powerOn }
        function onAcOnChanged() { climateControl.acOn = facade.acOn }
        function onMaxAcOnChanged() { climateControl.maxAcOn = facade.maxAcOn }
        function onAutoOnChanged() { climateControl.autoOn = facade.autoOn }

然后,我们在QML文件中使用定义的ClimateControlFacade

    ClimateControlFacade {
        id: climateControl
    }

并将UI元素连接到外观。

        AirKnob {
            id: airKnob
            x: 0
            y: 0
            value: climateControl.fanSpeed
            onValueChanged: climateControl.fanSpeed = value
            automode: climateControl.autoOn
            active: climateControl.powerOn
            Connections {
                target: climateControl
                onFanSpeedChanged: airKnob.value = climateControl.fanSpeed
            }
        }

重要:由于QML绑定是单向的,我们必须使用信号处理机制。否则,每次用户交互都会断开绑定。

与HVAC控制应用进行交互

  • 在模拟器中打开应用。
  • 在模拟器的扩展控制>汽车数据中,选择VHal属性选项卡。
  • 选择要更改的属性。例如:风扇速度
  • 在应用的UI侧进行更改,并观察汽车数据窗口中选定属性的状态。

    注意:属性的状态也可以在应用的日志中观察,无论是使用相关Qt IDE的日志选项卡,还是直接使用ADB日志器工具。

另请参阅Qt for AndroidQt界面框架Qt IF生成器扩展

在某些Qt许可下可用。
了解更多信息。