AndroidAuto第5章节翻译

31 阅读27分钟

5. 无线连接

为确保无缝的 Android Auto 连接体验,主机单元必须支持无线投影,允许通过 Wi-Fi 使用 Android Auto,并将主机单元作为接入点。本节描述了符合 PDK 4.3.4 标准的无线实施方案的要求。

5.1. 无线硬件

支持无线投影的主机单元称为无线主机单元。无线主机单元:

  • 必须支持 5 GHz 802.11ac 协议,并且必须尝试在同一频段上与移动设备连接,以最大限度减少对蓝牙和其他 Wi-Fi 网络的干扰。
  • 必须支持符合当地车载使用法规的 5 GHz Wi-Fi,以确保与预装了 Android Auto 客户端软件的 Google 认证移动设备兼容。

无线主机单元必须提供一个无线局域网,其中主机单元作为接入点。由主机单元提供的 Wi-Fi 网络:

  • 必须在主机单元重启后保持接入点凭证的持久性。

  • 即使主机单元重启后,每个 SSID 对应的 MAC 地址或 BSSID 也必须被持久保存。 虽然用户可以选择更改接入点凭证设置,但主机单元必须显示一个持久的警告,说明可能导致的连接中断问题,包括可能需要重新配对 Android Auto。此警告必须持续显示,直到用户主动选择"继续"或"取消"。

  • 不应使用具有相同 SSID 的双接入点,因为这样做可能会导致运行旧版 Android 的移动设备自发漫游到运行在 2.4GHz 的网络,从而中断活跃的投影会话。

  • 可以使用频段引导技术,如果使用了双频接入点,以确保移动设备连接到 5GHz 网络。

  • 必须采用 WPA3-Personal 过渡模式作为安全协议。

  • 应在接入点首次初始化时,使用加密安全的伪随机数生成器随机生成密码进行保护。生成的密钥长度必须至少为 12 个字符,并由大写字母、小写字母和数字组成,并且可以包含其他 ASCII 字符。

  • 如果该接入点可以访问互联网,则必须在接入点的 DHCP 配置中,通过供应商特定选项 43 将其通告为 'ANDROID_METERED'。这是为了让移动设备在 Android Auto 无线会话处于活动状态时,能够抑制消耗大量数据的活动。

  • 必须通过在 Wi-Fi 接口上运行 DHCP 服务器,为连接的设备动态分配 IP 地址。

  • 对于无线投影,必须仅分配 IPv4 地址。目前不支持 IPv6。

  • 在无线投影会话期间,不得应用动态频率选择

  • 必须在主机启动完成和从睡眠状态唤醒后,准备好接受客户端连接。具体做法是:首先启动 Wi-Fi 接入点,随后一旦车载屏幕上显示出主机用户界面元素且用户可进行操作时,立即启动蓝牙寻呼和/或页面扫描模式。

无线硬件法规限制

设备在利用 Wi-Fi 时必须满足的法规限制不在本文档的讨论范围之内。

5.1.2 无线延迟要求

无线主机单元必须确保为无线投影分配的带宽能够维持往返时间小于 200ms,同时为 5 GHz 投影的每个视频流分配至少 32 Mbps 的带宽。

为明确起见,如果一款主机单元满足本章节 5.1 的所有前述要求并提供任何无线投影技术,则它也必须支持 Android Auto 无线连接

5.2. 无线连接流程概述

无线投影需要在移动设备和主机单元之间建立多个通信链路。

为了减少对多种无线技术的依赖,并提高主机单元 OEM 厂商集成过程的确定性,当前版本的接收器库反映了 Android Auto 连接架构的演进,如下所述。

5.2.1. 定义:触发信号 vs WPP vs GAL

在 PDK 4.2 中,Android Auto 明确区分了以下三者:(1) 触发移动设备感知其在车辆中的信号;(2) 使主机单元能够辅助该移动设备进行投影的控制通道;(3) 投影会话本身。

  1. 存在触发信号:用于确定支持 Android Auto 的移动设备已在车内。历史上,USB 插入事件直接表明了这一点。对于无线连接,则使用经典蓝牙作为代理。
  2. 无线投影协议:使主机单元能够将移动设备作为可用源提供,并通过 OEM 的 HMI 启动投影。蓝牙 RFCOMM 历来作为 WPP 的传输层;PDK 4.2 引入了 Wi-Fi (TCP) 作为 WPP 的传输层,适用于网络凭证已已知的回头用户。
  3. Google Automotive Link:投影通道本身。

5.2.2. 封装的业务逻辑

从 PDK 4.2 开始,许多原本需要主机单元 OEM 厂商作为接收器接口实现的无线控制通道业务逻辑,现在已被封装在接收器库本身的 WifiProjectionProtocol 类中。这使得主机单元可以将输入/输出流的抽象委托给接收器库,并使用 Google 提供的 C++/Java 接口与移动设备交互。以下部分描述了接收器库所依赖的集成点,旨在为最终用户提供高质量的连接体验。对于当前架构与早期 Android Auto 版本(要求主机单元使用接收器库内定义的底层 Protocol Buffer 消息与移动设备交互)有何不同感兴趣的合作伙伴,可以参考附录 A:发布说明以获取相关更改的列表。

5.2.3. 连接原则

秉承连接管理的现代方法,Google 期望主机单元体现以下设计原则:

  • 促进在尽可能多的接入设备上建立 WPP,不受传输方式的限制,但需符合本文档中的要求;
  • 主动与最后一个进行过投影的移动设备建立 GAL 连接,无论其当前的视频焦点状态如何,以实现无缝的跨设备媒体消费;
  • 如果该移动设备在上一次驾驶会话结束时拥有视频焦点,则主动授予其视频焦点;否则,应通过 HMI 在一个 UX 步骤内提供视频焦点选择。

本文档及随附的《用户体验集成指南》中详细阐述了这些原则及相关要求。

5.2.4 首次用户通过蓝牙连接的流程

为促成移动设备与主机单元之间通过蓝牙建立初始的无线 Android Auto 连接,需遵循以下步骤:

  1. 蓝牙服务发现:通过经典蓝牙配对引导完成;或者,对于身处支持无线连接的车辆中、首次使用有线连接的用户,则通过第 6 节所述的、由 Android Auto 程序化发起的带外配对完成。
  2. WPP 控制通道(蓝牙):由移动设备发起,通过蓝牙 RFCOMM 传输,以交换 Wi-Fi 凭证。
  3. WPP 控制通道(Wi-Fi):由移动设备发起,通过 Wi-Fi (TCP) 传输。
  4. GAL 连接:由主机单元发起,通过 WPP 控制通道建立。

image.png

5.2.5 回头用户通过存在触发信号重连的流程

对于移动设备和主机单元已经配对,且移动设备已知晓 Wi-Fi 凭证的后续无线连接,其连接过程包含以下步骤:

  1. 存在触发:通过建立蓝牙链路实现;
  2. WPP 控制通道:由移动设备发起,使用 Wi-Fi (TCP) 传输;
  3. GAL 连接:由主机单元发起,使用 WPP 控制通道。

image.png 5.3. 无线连接流程:用户体验

注意:有关本文所述要求所基于的 UX 设计原则的进一步解释,请参阅 Android Auto 主机单元用户体验指南 (UXIG) (docs.partner.android.com/auto/resour…

5.3.1. 首次运行体验

一台无线主机单元:

  • 为添加、管理和切换已连接的移动设备,实施统一的"已连接设备"交互设计模式。原生菜单结构不应将特定协议名称(如蓝牙、Wi-Fi、WLAN 等)用作副标题。
  • 必须 在 Android Auto 未激活且用户长按方向盘上专用于 ASR 的按钮时,启动蓝牙配对流程。
  • 必须 在通过蓝牙添加新手机的交互设计中,提示用户启动 Android Auto。该提示可以提供推迟启动 Android Auto 的选项。例如,弹窗可以提供"启动 Android Auto"和"稍后"选项。但推迟选项不得将该移动设备添加到阻止列表,以致用户无法在后续时间点启动 Android Auto。
  • 就本文中关于 Android Auto 无线版入门用户体验流程的要求而言,必须 以处理经典蓝牙配对的同等方式来处理快速配对。
  • 必须 将 Android Auto 呈现为与特定已连接移动设备的蓝牙免提配置文件配置同级的选项,而非其下属选项,以便用户能像选择免提通话一样轻松地选择 Android Auto。

5.3.2 切换投影源

如果有多台移动设备可以启动或启用投影(包括任何当前正在投影的移动设备,以及任何当前通过蓝牙连接、且用户之前曾拒绝其使用 Android Auto 但具备投影能力的移动设备),则主机单元:

  • 不得 支持多个并发的投影会话。
  • 必须 提供一个原生屏幕(原生连接管理器),使用户能够管理已记忆的移动设备并在它们之间切换作为投影源。此原生屏幕必须显示所有已记忆的、支持 Android Auto 的手机,无论运行时车辆的蓝牙系统是否可用、与任何特定移动设备的主动连接状态如何,亦或用户在配对时是否最初拒绝了该手机使用 Android Auto。
  • 必须 确保在 Android Auto 活跃会话中,通过不超过两次点击即可访问原生连接管理器。这两次点击是指在按下 OEM 图标切换回原生用户界面之后开始计算。
  • 必须 在用户通过原生连接管理器选择其中一台设备时,启动投影(必要时启用蓝牙)并将视频焦点授予 Android Auto。
  • 必须 在用户通过原生连接管理器"取消配对"某个支持 Android Auto 的设备时,将该设备从车辆提供的 Android Auto 设备列表中移除。
  • 必须允许用户通过从原生连接管理器到 Android Auto 用户界面不超过两个弹窗即可将投影源从一台设备切换到另一台设备;第一个弹窗用于终止旧会话,第二个弹窗用于提供与第二台设备的新会话。
  • 必须提供能够直接从主机单元的连接管理器启动 Android Auto 的功能。
  • 必须保留 Android Auto 图标与当前投影会话之间的关联。
  • 在原生主屏幕上提供一个设备切换器小组件。

当另一个 Android Auto 会话已处于活动状态时,若有第二台设备通过 USB、蓝牙或 WPP 连接到主机单元,则主机单元:

  • 不得显示超过一个非侵入式原生提示,向用户提供切换到第二台设备或保持连接到当前设备的选择。
  • 可以在首次运行体验的情况下,显示一个额外的提示以启动 Android Auto。
  • 不得在没有用户明确确认的情况下,自动将投影切换到新设备。

无线连接流程:WPP 控制通道

5.4.1 WPP 对蓝牙的依赖

为表明其支持无线投影,无线主机单元在参与蓝牙服务发现时,必须始终通告 Android Auto UUID 4de17a00-52cb-11e6-bdf4-080208c9a66

无线主机单元不得在服务发现阶段通告超过 21 个服务,因为这是 Android 设备一次可以解析的 UUID 最大数量。

无线主机单元必须能够处理来自同一移动设备的多个并发或连续的服务发现请求,而不会阻塞或拒绝这些请求。

无线主机单元必须至少支持版本 1.0 的蓝牙射频通信协议,并实现一个蓝牙 RFCOMM 服务器。Android Auto 协议规范记录了该协议。 无线主机单元必须 在每条活跃的蓝牙连接上都支持 RFCOMM 连接。

支持无线投影的移动设备可能在蓝牙 HFP 连接建立之前或之后,发起与无线主机单元的 RFCOMM 连接。无线主机单元必须能够处理这两种情况。

5.4.2 基于 TCP 和 RFCOMM 的 WPP

Wi-Fi 投影协议充当建立无线 GAL 会话的控制通道。主机单元必须同时实现基于蓝牙 RFCOMM 和 Wi-Fi 传输的 WPP,正如接收器库中的 WifiProjectionProtocol 类所封装的那样。一旦在运行时建立了 WPP,主机单元就将输入/输出流的抽象处理移交给接收器库,并使用 C++/Java 回调函数与移动设备交互。因此,主机单元必须创建一个 WifiProjectionProtocol 类及其在接收器库中包含的依赖项的实例,并提供以下必需信息:

  • Wi-Fi 信道类型:该类型必须等于 CHANNELS_5GHZ_ONLY,即使接入点广播多个频段(即,双频 AP)。
  • Wi-Fi 信道频率:主机单元接入点在 5 GHz 频段广播所使用的信道频率(以 MHz 为单位),以单元素列表形式提供。
  • HeadUnitInfo 对象:该对象包含关于主机单元的信息,并且必须与通过 GAL 提供的 ServiceDiscoveryResponse 中的 HeadUnitInfo 包含相同的信息。
  • wifiProjectionProtocolCallback:一个回调实例,用于接收连接事件的通知。
  • wifiProjectionInfoProvider:用于提供有关 Wi-Fi 凭证和 GAL 连接的信息。
  • WPP TCP 服务器的固定 IP 地址和端口号;这些值必须保持不变,即使在主机单元恢复出厂设置的情况下。如果底层主机单元操作系统要求 WPP TCP 服务器的 IP 地址是动态分配且与网络 DHCP 服务器的地址匹配,则主机单元可以报告 0.0.0.0 作为满足前述要求的替代方式。

此外,主机单元:

  • 必须 在接入点开启时、以及在启动任何蓝牙寻呼和/或页面扫描事件之前,就使 WPP TCP 服务器处于活动状态并准备好接受传入的连接请求。
  • 必须 支持通过 RFCOMM 和 TCP 的多种组合实现多个并发的活跃 WPP 连接,此支持除受特定要求约束外没有其他限制。
  • 必须 接受所有 WPP TCP 连接并将其移交至 WiFiProjectionProtocol 类处理,即使已有来自同一远程 IP 地址的客户端连接存在。
  • 必须 使用 TLS 证书创建 SsITransportFactory 以保护 WPP TCP 连接的安全。
  • 在移动设备已知晓 Wi-Fi 凭证的情况下,必须 允许移动设备在后续连接时直接连接至 Wi-Fi。

5.4.3 版本协商

无论已配对到无线主机单元的手机数量及其当前状态如何,当移动设备通过 RFCOMM 或 TCP 连接到 WPP 服务器套接字时,无线主机单元必须调用 WiFiProjectionProtocol::ClientConnected()

此后,ReceiverLib 将处理版本协商,并通过调用 WiFiProjectionProtocolCallback 接口的以下方法之一来通知结果:

  • OnWiFiVersionResponseFailure():在协商失败时调用。如果连接尝试失败,主机单元不得将移动设备添加到永久排除列表中。可能收到的状态包括:
    • STATUS_NO_SUPPORTED_WIFI_CHANNELS:如果移动设备无法在提供的信道上运行。此种情况下,主机单元可以尝试重新创建 WiFiProjectionProtocol,并使用不同的 Wi-Fi 信道重启接入点,同时关闭所有活跃的 WPP 连接。
    • STATUS_NO_COMPATIBLE_VERSION:如果移动设备上的 Android Auto 应用版本不兼容。
  • OnReadyForProjection():在版本协商成功时调用。有关该移动设备的信息将通过 client_info 参数传递给此调用。

如果版本协商成功,client_info 参数将包含 phone_info 对象。该 phone_info 对象也包含在 GAL 的 ServiceDiscoveryRequest 消息中,可用于在不同的通信信道之间映射同一台移动设备。phone_info 包含重要的移动设备可识别信息:

  • phone_info.instance_id 是一个唯一标识符,但未必具有持久性;如果用户清除了 Android Auto 数据或在移动设备上重新安装了该应用,此 ID 可能会改变。因此,主机单元不得在投影会话之间,将此 ID 与 USB 序列号、蓝牙 MAC 地址或 Wi-Fi MAC 地址进行映射并持久化存储。

  • phone_info.device_name 是投影源的友好设备名称,可用于向用户显示(例如投影源列表),它通常是移动设备的蓝牙别名。此名称不得被依赖作唯一标识符,因为它可能发生变化。

  • phone_info.bluetooth_address 包含移动设备的蓝牙 MAC 地址。主机单元必须使用此蓝牙地址将设备与已知的投影源关联起来。

5.4.4 启动无线投影

5.4.4.1 从主机单元启动

为了初始化 GAL 并启动无线投影,主机单元应在收到 WifiProjectionProtocolCallback::OnReadyForProjection() 回调后调用 WifiProjectionProtocol::StartProjection()。用于该 GAL 连接的 IP 地址和端口必须通过回调函数 WifiProjectionInfoProvider::GetProjectionPortInfo() 来提供。

在调用 WifiProjectionProtocol::StartProjection() 或在收到 WifiProjectionProtocolCallback::CanStartProjection() 回调后返回 STATUS_SUCCESS 之后,主机单元不得再次调用 WifiProjectionProtocol::StartProjection(),直到移动设备连接到 GAL TCP 套接字,或者超过了规定的超时时间。

如果无线投影会话是由主机单元响应用户通过 HMI 的输入(例如,用户点击了原生菜单中的 Android Auto 图标)而发起的,则必须USER_REQUEST 传递给 WifiProjectionProtocol::StartProjection()

如果现有无线投影会话是因 GAL 意外丢失(即,GAL 套接字丢失但未收到 ByeByeRequest 且 WPP 仍处于活动状态)而由主机单元重新发起的,则必须AUTOMATIC_RESTART 传递给 WifiProjectionProtocol::StartProjection()

如果无线投影会话是由主机单元出于上述 USER_REQUESTAUTOMATIC_RESTART 之外的任何原因发起的,则必须AUTO_LAUNCH 传递给 WifiProjectionProtocol::StartProjection()

在调用 WifiProjectionProtocol::StartProjection() 之前,主机单元用于 GAL 连接的 TCP 服务器必须已准备就绪,可以接受连接。 5.4.4.2 从移动设备启动

移动设备也可能请求启动投影。在这种情况下,主机单元将通过 WifiProjectionProtocolCallback::CanStartProjection() 回调收到通知,而无线主机单元必须因此尝试启动无线投影。具体来说,WifiProjectionProtocolCallback::CanStartProjection() 方法必须在一千毫秒内返回以下值之一:

  • STATUS_SUCCESS:如果主机单元用于 GAL 连接的 TCP 服务器已准备就绪,可以接受连接。
  • STATUS_WIFI_NOT_YET_STARTED:如果主机单元用于 GAL 连接的 TCP 服务器正在初始化以接受连接;在这种情况下,移动设备将继续尝试以指数退避方式启动投影,直到收到不同的状态。
  • STATUS_PROJECTION_STARTED_ALREADY:如果 GAL 正在与任何移动设备主动连接或处于连接过程中,或者如果任何其他投影技术已在从某个移动设备进行投影。
  • STATUS_WIFI_DISABLED:如果主机单元上的 Wi-Fi 已禁用且无法自动启用。

Wi-Fi 投影协议不包含停止投影的消息,因为这是通过 GAL 协议中定义的 ByeBye 消息来处理的。

5.4.4.3 如果接入点不可用

Google 强烈建议主机单元不要提供允许用户禁用用于投影的 Wi-Fi 接入点的控件。尽管如此,如果 Wi-Fi 接入点因任何原因不可用,则主机单元应该显示一个持久的图标或持久的消息,指示无线 Android Auto 不可用(且不影响第 1.1 节中描述的 Android Auto 图标),并必须在运行时向用户提供关于如何重新启用所述用于投影的 Wi-Fi 接入点的明确指导。此操作应在根据本文所述要求本应调用 WifiProjectionProtocol::StartProjection() 之前进行。在这种情况下,主机单元不得调用 WifiProjectionProtocol::StartProjection(),直到所述用于投影的 Wi-Fi 接入点及相关的 TCP 服务器再次变为可用。

5.4.4.4. 如果移动设备连接 GAL TCP 套接字失败

在调用 WiFiProjectionProtocol::StartProjection()(如果从主机单元启动)或在收到 WiFiProjectionProtocolCallback::CanStartProjection() 回调后返回 STATUS_SUCCESS(如果从移动设备启动)之后,主机单元必须允许有 30 秒的时间来接收来自移动设备的 GAL TCP 连接请求或 WiFiConnectStatus 失败消息。在上述 30 秒超时窗口期间,源自同一或另一移动设备的任何额外启动投影请求,都将根据前述规定,按 STATUS_PROJECTION_STARTED_ALREADY 处理。

如果是从主机单元启动并且超过了上述超时时间,主机单元必须立即通过再次调用 WiFiProjectionProtocol::StartProjection() 并指定原因为 AUTOMATIC_RESTART 来尝试重新连接。

5.4.5. Wi-Fi 凭证交换

无线主机单元必须支持通过蓝牙 RFCOMM 通信交换 Wi-Fi 凭证,且提供的凭证在移动设备请求时必须是准确的。

当移动设备通过 RFCOMM 连接时,它可能会向主机单元请求 Wi-Fi 凭证。主机单元的实现将通过 WiFiProjectionInfoProvider 接口接收相应的回调。

  • WiFiProjectionInfoProvider::GetSsid()必须返回一个 ASCII 字符串。
  • WiFiProjectionInfoProvider::GetPassword()必须返回一个 UTF-8 字符串。
  • WiFiProjectionInfoProvider::GetBssid()必须返回以太网 MAC 地址格式。
  • 如果无线主机单元有两个在不同频段上具有相同 SSID 的接入点,则必须使用 5 GHz 接入点的 BSSID。

WiFiProjectionInfoProvider 接口中的所有方法都必须在被调用后立即(在极短时间内)返回。

移动设备会保存 Wi-Fi 凭证,并在未来连接到同一主机单元(基于主机单元的蓝牙 MAC 地址)时使用它们。保存的凭证不再有效的错误情况由移动设备处理,移动设备将在需要时通过蓝牙 RFCOMM 进行连接以接收更新的凭证。

5.4.6. Wi-Fi 连接状态

当移动设备尝试通过 Wi-Fi 连接到主机单元时,主机单元的实现将通过 WiFiProjectionProtocolCallback::OnWiFiConnectStatus() 回调获知 Wi-Fi 连接状态,该回调带有以下参数:

  • client_info:标识移动设备。
  • message_status:来自 MessageStatus 枚举的预定义状态类型之一。
  • error_hint:一个自定义字符串,在错误情况下传递,用于说明现有 MessageStatus 无法描述失败原因的情况。

关于 error_hint

  • 它已根据移动设备的系统语言进行了本地化。
  • 它将被发布到 Android Auto 合作伙伴帮助中心。

主机单元必须遵循以下规则:

  • 如果主机单元无法识别 message_status 枚举中的错误代码,并且 error_hint 非空,则必须显示提供的 error_hint 字符串,或者一个合理等效的、由 OEM 自行编写的替代提示。
  • 如果 message_status 中的消息是 STATUS_INSTRUCT_USER_TO_CHECK_THE_PHONE,则必须指示用户检查移动设备。
  • 如果主机单元能够识别 message_status 中的错误代码,则必须显示相应的错误信息。
  • 如果主机单元无法识别 message_status 中的错误,并且 error_hint 为空,则必须以静默方式忽略该错误。

5.4.7. 错误处理

如果在主机单元的 RFCOMM 或 TCP WPP 套接字上发生 I/O 错误,主机单元将通过 WifiProjectionProtocolCallback::OnClientLost() 回调收到通知。除此之外,接收器库包含业务逻辑,会主动监控 WPP(RFCOMM 和 TCP)连接状态,通过在移动设备和主机单元之间定期发送和接收特殊消息(ping)来实现。如果往返时间超过十秒,接收器库将关闭底层传输并调用 WifiProjectionProtocolCallback::OnClientLost() 回调。在这种情况下,移动设备将重新连接 WPP;在此类重新连接时,主机单元必须调用 WifiProjectionProtocol::ClientConnected() 以再次启动版本协商序列。

5.4.8. 设备认证

当通过蓝牙 RFCOMM(而非 Wi-Fi / TCP)上的 WPP 接收到 WifiProjectionProtocolCallback::OnReadyForProjection 回调时,主机单元必须将该移动设备的蓝牙 MAC 地址与通过回调接收到的 phone_info.instance_id 关联(或更新现有关联),并将此关联存储到持久化存储中。

当移动设备通过 Wi-Fi / TCP(而非蓝牙 RFCOMM)连接到 WPP 时,主机单元会收到一个 WifiProjectionProtocolCallback::IsKnownDevice() 回调,参数中包含该移动设备的 instance_id。如果存在给定 instance_id 的关联,主机单元必须返回 true,否则返回 false。当此类关联不存在时,接收器库将关闭连接并通知移动设备该主机单元不再与该移动设备关联。

如果用户从主机单元的原生连接管理器中移除了某个移动设备,则主机单元必须移除该移动设备的蓝牙 MAC 地址与 phone_info.instance_id 之间的关联。

5.4.9. 在原生日连接管理器中为移动设备命名

一个移动设备将关联以下名称(按优先级顺序排列):

  1. 设备名称:由移动设备发送,主机单元实现可通过 WifiProjectionProtocolCallback::OnReadyForProjection 回调获取(参见 client_info.phone_info.device_name)。此字符串可由用户编辑,例如,"Alice's Pixel"。
  2. 蓝牙设备名称:由移动设备作为蓝牙服务发现的一部分进行广播,可由用户编辑。
  3. AAP 设备名称:由移动设备在其 AAP 服务发现期间,在 ServiceDiscoveryRequest 消息中发送,不可由用户编辑,例如,"Google Pixel 7"。
  4. USB 设备制造商和产品信息:在设备通过 USB 枚举自身后可用。不可由用户编辑,例如,"Google Pixel 2"。

当在原生日屏幕上显示设备时,主机单元使用可用的、优先级最高的名称(基于上述顺序)。

5.5. 无线连接流程:GAL 投影通道

在 Android Auto 无线连接过程中,移动设备报告的 WifiConnectStatus 并非旨在作为 GAL TCP 连接请求的闸门。因此,主机单元必须接受传入的 GAL TCP 套接字连接请求并启动投影会话,无论是否收到 WifiProjectionProtocolCallback::OnWifiConnectStatus() 回调。

TCP 服务器必须设置以下默认的连接套接字设置:

  • 读取超时:5 秒
  • 接收缓冲区大小:16-128 KB(推荐的接收缓冲区大小为 64 KB)。
  • Nagle 选项TCP_NODELAY(禁用 Nagle 算法)。
  • 处于已建立状态的 TCP 套接字:正常关闭。

VersionResponse 消息将包含一个 options 字段,该字段可能包含一组连接配置。这将在主机单元发送 GAL 版本之后、SSL 握手之前进行。主机单元:

  • 必须在移动设备提供不同配置时,覆盖默认配置集。
  • 必须ServiceDiscoveryResponse 消息中发送配置响应。
  • 不得 在连接断开时持久化保存所使用的配置。

在 TCP 连接建立之后,主机单元必须 通过使用 ReceiverLib 函数 AapReceiver::start() 向移动设备发送 VersionRequest 来启动 AAP 连接协商。有关 AAP 连接过程的详细信息,请参阅 Connect AAP 部分。

5.5.1 GAL TCP 连接监控

ReceiverLib 包含业务逻辑,通过定期在移动设备和主机单元之间发送和接收特殊消息来主动监控 TCP GAL 连接状态。如果 GAL 连接的往返时间超过三秒,主机单元实现将收到带有 STATUS_PING_TIMEOUT 状态的 IControllerCallbacks::unrecoverableErrorCallback() 回调。在这种情况下,主机单元:

  • 必须 断开活跃的 GAL 会话。
  • 必须 调用 WifiProjectionProtocol::StartProjection() 并指定原因为 AUTOMATIC_RESTART

如果主机单元未通过 GAL 与移动设备发送或接收 ByeByeRequest,并检测到 TCP 套接字读取超时或收到重置数据包,则 TCP 服务器必须 关闭其打开的套接字。

5.5.2. 结束 TCP 连接

  • 如果主机单元从移动设备收到 ByeByeRequest,则主机单元上的 TCP 服务器必须在发送完 ByeByeResponse 消息后,才能关闭其打开的套接字。

  • 如果主机单元发送了 ByeByeRequest,则主机单元必须等待来自移动设备的 ByeByeResponse 至少两秒钟,然后才能关闭套接字。

  • 如果主机单元收到的 ByeByeRequest 中的原因为 USER_SELECTIONDEVICE_SWITCH,则主机单元必须返回到原生屏幕,并且能够在不断开与移动设备的 Wi-Fi 连接或蓝牙连接的情况下重新启动无线投影。

  • 如果 WPP 连接意外丢失,主机单元不得因此终止任何关联的 GAL 连接。

  • 如果 GAL 连接意外丢失,但其对应的 WPP 连接仍处于活动状态,则主机单元不得终止该 WPP 连接,因为移动设备将使用它来重新启动 GAL。

5.6 无线连接流程:启动边缘情况

有关主机单元必须如何处理用户操作原生日屏幕上显示的 Android Auto 启动图标的详细信息,请参阅启动图标操作部分。此外,主机单元:

  • 在以下情况下,不得调用 WifiProjectionProtocol::StartProjection():在任何移动设备上,有线投影已激活;或正在切换到配件模式;或有线投影被中断或终止。除非用户已表示意图启动无线投影,例如,通过点击主机单元上的 Android Auto 图标。
  • 当无线投影已激活,或已为同一移动设备调用了 WifiProjectionProtocol::StartProjection() 时,不得尝试将移动设备的 USB 连接切换到配件模式。
  • 当任何移动设备正在进行无线投影时,不得尝试将任何移动设备切换到 AOA 模式。
  • 如果主机单元和移动设备通过蓝牙连接,则必须在后续连接时通过调用 WifiProjectionProtocol::StartProjection() 自动启动无线投影,即使另一台移动设备已连接到主机单元并处于活跃的 HFP 通话中。
  • 如果主机单元和移动设备通过 USB 连接(而非蓝牙),则必须在后续连接时自动启动有线投影。
  • 不得在每次重新连接会话之前都提示用户启动 Android Auto。
  • 必须保持通过 Wi-Fi 进行投影,即使同一台移动设备(通过 Android 序列号或其他方式匹配)通过 USB 连接,无论其视频焦点状态如何。
  • 必须保持通过 Wi-Fi 进行投影,即使当第一台移动设备正在投影时,另一台插入支持数据的 USB 端口的移动设备被拔下。

如果用户在与某移动设备进行蓝牙配对后显示的原生提示中,拒绝了为该设备启动 Android Auto,则在后续的蓝牙连接中,主机单元:

  • 必须如第 5.4.1 节所述,接受并与该移动设备完成 WPP 版本协商。
  • 必须在用户从主机单元的原生连接管理器中手动选择该移动设备的 Android Auto 功能时,为该移动设备调用 WifiProjectionProtocol::StartProjection(),否则不得调用。