C
暖通空调控制
构建和部署示例
请参阅有关构建和部署 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 Android、Qt界面框架和Qt IF生成器扩展。
在某些Qt许可下可用。
了解更多信息。