Android车载应用开发与分析(10)- 车载空调系统(HVAC)

本文详细解读了Android12中HVAC在车载空调系统中的关键功能、源码结构,包括双区温度调节、空调开关、内外循环控制等,并深入解析了HVAC的核心组件和Car API的交互。

1. HVAC 功能介绍

HVAC 全称:供暖通风与空气调节(Heating Ventilation and Air Conditioning)。用户可以通过他来控制整个汽车的空调系统,是汽车中非常重要的一个功能。

汽车的空调HMI虽然并不复杂,但是大多都是用符号来表示功能,对于还没有实际用过汽车空调系统的开发者来说,理解空调的各个符号表示的含义也是非常有必要。
下面就以Android 12中的HVAC来介绍空调系统中包含的最基础的功能。

1.1 双区温度调节

空调的温度调节功能,默认是华氏度,可以在系统设置修改温度单位。可调节范围是61 - 82华氏度,对应16 - 28 摄氏度。
左侧按钮用来调节主驾,右侧按钮用来调节副驾。在以往都是只有高配车型才有双区空调,现在的车上双区空调几乎已经是标配了。

1.2 空调开关


开启关闭空调的开关

1.3 内/外循环


内循环是汽车空气调节系统的一种状态。这种状态下,车内外的换气通道关闭,风机关闭时车内气流不循环,风机开启时,吸入的气流也仅来自车内,形成车辆内部的气流循环。
外循环则相反,风机开启时,吸入的气流也仅来自车外,可以更新车内的空气质量,代价是会更耗电。

1.4 风量调节


用于增大或减小空调的风量。

1.5 风向调节


从左到右分别是吹脸、吹脸+吹脚、吹脚、吹脚+吹挡风玻璃

1.6 A/C开关


A/C按键,它就是制冷开关,按下A/C按键,也就启动了压缩机,通俗地说就是开冷气。

1.7 主副驾座椅加热


左边的按钮用于调节主驾座椅加热,右边的按钮用于调节副驾座椅加热

1.8 除霜


左边的按钮是开启/关闭 前挡风玻璃加热,开启后用来除去前挡风玻璃上的雾气。右边的按钮是开启/关闭后挡风玻璃加热,开启后用来除去后挡风玻璃上的雾气。

1.9 自动模式


自动空调其实就是省略了风速、风向等调节功能,自动空调是全自动调节,只需要选择风向和设定温度。AUTO按键按下后,就会根据车内传感器来控制出风的温度,冬天热风,夏天冷风。会保持车内有较适宜的温度,如果温度过高或过低,空调也会自动改变出风口的温度及风速,调整车内温度。
以上就是车载空调系统中最基础的功能了,实际开发中我们还会遇到如座椅通风、座椅按摩、智能新风、负离子等等一些近几年才出现的空调新功能,在应用开发上无非就是多几个界面或按钮。

2. HVAC 源码结构

本文中的源码基于Android 12下HVAC APP,源码请见:https://github.com/linux-link/CarHvac
原生的Hvac App中不存在Activity、Fragment等传统意义上用来显示HMI的组件,取而代之是使用Service来显示一个Window。主要原因在于Hvac的界面层级比一般的HMI的层级要高,呼出Hvac时需要部分或全部覆盖其他的应用上(当然IVI中还是有应用比Hvac的层级要高的),这时候使用Activity就显不合适了。

需要注意的是,Havc在Android 12中虽然有一个独立的app,但是上图中Hvac其实并不是使用这个独立的app,它的HMI和相关其实都是写在SystemUI中的。
通过使用adb发送一个广播,可以调出真正的Hvac。

adb shell am broadcast -a android.car.intent.action.TOGGLE_HVAC_CONTROLS


以下是Hvac App的关键部分的源码结构图

3. HVAC 核心源码分析

3.1 AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.car.hvac">

    <uses-sdk
        android:minSdkVersion="22"
        android:targetSdkVersion="29" />

    <uses-permission android:name="android.car.permission.CONTROL_CAR_CLIMATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!-- Required to use the TYPE_DISPLAY_OVERLAY layout param for the overlay hvac ui-->
    <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
    <!-- Allow Hvac to go across all users-->
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />

    <protected-broadcast android:name="android.car.intent.action.TOGGLE_HVAC_CONTROLS" />

    <application
        android:icon="@drawable/ic_launcher_hvac"
        android:label="@string/hvac_label"
        android:persistent="true">

        <!--用于控制空调功能的Service-->
        <service
            android:name=".HvacController"
            android:exported="false"
            android:singleUser="true" />
        <!-- 用于显示UI的Service-->
        <service
            android:name=".HvacUiService"
            android:exported="false"
            android:singleUser="true" />

        <!-- 监听开机广播 -->
        <receiver
            android:name=".BootCompleteReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

3.2 BootCompleteReceiver

用于监听开机的广播

### ### 实现车载系统通过 CAN 总线发送空调控制指令的方法 在车载系统中,通过 CAN 总线实现空调控制指令的发送,需要对 CAN 总线通信协议、车辆空调控制逻辑以及 ECU 之间的数据交互有深入理解。以下是一个完整的实现方法。 #### 1. 理解 CAN 总线通信机制 CAN 总线是一种广泛应用于车辆中的串行通信协议,允许设备在高数据速率和低带宽条件下可靠地交换数据。空调控制指令通常通过特定的 CAN 报文 ID 和数据字段进行定义和传输。每条 CAN 报文包含一个标识符(ID)以及最多 8 个字节的数据,其中 ID 用于标识报文类型,数据字段用于传递控制参数[^1]。 #### 2. 确定空调控制报文格式 在发送空调控制指令之前,需要明确车辆空调相关的 CAN 报文格式。通常,空调控制指令可能包括温度设定、风速调节、模式切换(如制冷、制热、除霜)等参数。这些参数通过特定的 CAN ID 传输,并以字节形式编码。例如,某车型可能定义如下格式: ```c // 空调控制报文定义 struct CanMsg { uint32_t id = 0x2A5; // 空调控制报文ID uint8_t dlc = 8; // 8字节数据 uint8_t data[8]; // 数据字段 }; // 假设 data[0] 表示目标温度,data[1] 表示风速等级 void sendACControl(uint8_t targetTemp, uint8_t fanSpeed) { CanMsg msg; msg.data[0] = targetTemp; // 目标温度(单位:摄氏度) msg.data[1] = fanSpeed; // 风速等级(如 1-5 级) CAN_send(msg); // 发送 CAN 报文 } ``` #### 3. 实现 CAN 报文发送流程 在硬件层面,需要通过 CAN 控制器和收发器模块将空调控制指令转换为 CAN 总线上的物理信号。软件层面,需要调用底层驱动接口(如 CAN_send)将构造好的 CAN 报文发送到总线上。发送流程通常包括以下步骤: - 构造 CAN 报文结构体,设置目标温度、风速等参数。 - 调用 CAN 发送函数,将报文写入 CAN 控制器缓冲区。 - CAN 控制器将报文通过 CAN 收发器发送到总线上,供空调 ECU 接收并执行。 #### 4. 空调 ECU 的响应反馈 空调 ECU 接收到控制指令后,会根据指令调整空调系统的运行状态。部分车辆系统可能通过另一个 CAN 报文返回空调状态(如当前温度、风速等)。例如,可以通过定义一个反馈报文来实现状态监控: ```c // 空调状态反馈报文定义 struct CanMsg { uint32_t id = 0x2A6; // 空调状态反馈报文ID uint8_t dlc = 4; // 4字节数据 uint8_t data[4]; // 数据字段 }; // 接收空调状态反馈 void receiveACStatus() { CanMsg msg = CAN_receive(); if (msg.id == 0x2A6) { uint8_t currentTemp = msg.data[0]; // 当前温度 uint8_t currentFanSpeed = msg.data[1]; // 当前风速 // 更新用户界面或进行状态判断 } } ``` #### 5. 安全权限管理 由于 CAN 总线直接车辆关键控制系统通信,因此在发送空调控制指令时,必须确保通信的安全性和权限控制。例如,只有授权的应用或系统服务才能访问 CAN 总线接口,防止恶意指令干扰空调系统运行。此外,应避免频繁发送控制指令,以免造成总线拥堵或系统异常。 #### 6. Android 车机系统的集成 在 Android Automotive 系统中,空调控制功能通常由系统级服务(如 HvacService)管理,并通过 Vehicle HAL 接口底层硬件通信。如果需要通过 Android 应用发送空调控制指令,可以通过以下方式实现: -Android 应用中调用系统 API,触发 HVAC 控制服务。 - HVAC 服务通过 Vehicle HAL 接口将控制指令转换为 CAN 报文。 - CAN 控制器将报文发送到 CAN 总线上,空调 ECU 接收并执行。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值