AndroidAuto连接流程及代码实现

AndroidAuto连接流程及代码实现

文章目录

  • AndroidAuto连接流程及代码实现
  • AndroidAuto介绍
  • 有线连接流程
    • AOA协议
    • AAP协议
    • USB连接
    • 蓝牙连接
  • 无线连接流程
  • 代码实现(TBD)
    • 数据收发(TBD)
      • 音频
      • 视频
    • 控制流程(TBD)
      • 音频
      • 视频
    • 未完待续。。。

AndroidAuto介绍

AndroidAuto是google开发用于安卓手机与车机互联的代码实现方案。AndroidAuto使用手机来渲染视频,然后投射到车机屏幕上以供用户使用,用户通过车机进行人机交互。
Android Auto provides a bridge between a mobile device and a vehicle that enables the driver to access the capabilities of a mobile device through the physical human machine interface (HMI) controls provided by the vehicle. The mobile device manages all user interface (UI), software logic, connectivity, and compute power for mobile device applications and projects these applications into the vehicle.

有线连接流程

AOA协议

AOA协议(Android开放配件协议AOA(Android Open Accessory Protocol))。AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。
车机端需要尝试AOAP初始化,为了正确的检测和协商USB模式的切换车机和手机需要以下流程:
a 车机尝试用AOAP连接手机并且把自己作为AOAP accessory。
b 如果手机支持AOAP,它会重枚举为AOAP模式;如果手机不支持AOAP,它会忽略AOAP握手,允许车机协商其他USB模式或者充电模式。

1、发送 51 控制请求(“获取协议”)以确定设备是否支持 Android 配件协议。如果设备支持协议,则返回一个非零数字,代表所支持的协议版本。该控制请求为端点 0 上的请求

参数类型:
requestType: USB_DIR_IN 、 USB_TYPE_VENDOR
value: 51
index: 0
value: 0
data: protocol version number (16 bits little endian sent from the device to the accessory)

2、如果设备返回所支持的协议版本,则向设备发送含标识字符串信息的控制请求。该信息让设备可以确定适合配件的应用(如果没有适合配件的应用,则向用户呈现一个网址)。该控制请求为端点 0 上的请求(适用每个字符串 ID),具有以下特征:

参数类型:
requestType: USB_DIR_OUT 、 USB_TYPE_VENDOR
value: 52
index: 0
value: string ID
data: zero terminated UTF8 string sent from accessory to device

支持以下字符串 ID,并且每个字符串的最大值为 256 个字节(必须以零结束,以 \0 结尾)。

manufacturer name: USB_DIR_OUT 、 USB_TYPE_VENDOR
model name: 1
description: 2
version: 3
URI: 4
serial number: 5

3、发送控制请求,要求设备以配件模式启动。该控制请求为端点 0 上的请求,具有以下特征:

参数类型:
requestType: USB_DIR_OUT 、 USB_TYPE_VENDOR
value: 53
index: 0
value: 0
data: none

AAP协议

AAP协议本身是与传输无关的,并且运行在任何具有足够带宽的传输上。该平台的实现支持USB2.0(自创建以来)和无线局域网(WI-Fi),其中车为接入点(自1.4版起)。

AAP连接移动设备和车辆,使司机能够通过车辆提供的物理人机接口(HMI)控制来访问设备的功能。MD管理所有用户界面(UI)、软件逻辑、连接性和应用程序的计算能力,并通过AAP将这些应用程序投影到车辆中。

AndroidAuto连接流程及代码实现_第1张图片

USB连接

AndroidAuto连接流程及代码实现_第2张图片
Android Auto连接时,车机的usb需要作为host。
车机端需要尝试AOAP初始化,为了正确的检测和协商USB模式的切换车机和手机需要以下流程:
1.车机尝试用AOAP连接手机并且把自己作为AOAP accessory。
2.如果手机支持AOAP,它会重枚举为AOAP模式;如果手机不支持AOAP,它会忽略AOAP握手,允许车机协商其他USB模式或者充电模式。
连接流程如下:
AndroidAuto连接流程及代码实现_第3张图片
手机切换AOA模式成功之后,车机需要开始AAP连接,使用ssl进行验证,车机需要识手机能否支持AAP协议。
AndroidAuto连接流程及代码实现_第4张图片

MD和HU使用SSL证书建立信任AndroidAuto连接流程及代码实现_第5张图片

蓝牙连接

为了在本地和投射的接口上提供一致性的免提电话体验,AAP使用蓝牙免提规范来进行电话语音通信。在建立AAP连接之后,手机会自动通过蓝牙与车机配对。如果手机与车机从未配对过,车机和手机会通过如下的过程进行配对连接。
1.5版之前流程如下:
AndroidAuto连接流程及代码实现_第6张图片

1.5版GAL流程如下:
AndroidAuto连接流程及代码实现_第7张图片

如果手机之前已连接车机,则会进行如下的配对过程
AndroidAuto连接流程及代码实现_第8张图片
注:

enum BluetoothPairingMethod {
  BLUETOOTH_PAIRING_UNAVAILABLE = -1,
  BLUETOOTH_PAIRING_OOB = 1,
  BLUETOOTH_PAIRING_NUMERIC_COMPARISON = 2,
  BLUETOOTH_PAIRING_PASSKEY_ENTRY = 3,
  BLUETOOTH_PAIRING_PIN = 4
};

最新1.5版本Gal增添了部分协议,蓝牙连接需要设置配对方式,且添加了void onAuthenticationResult(int status){};方法,成功连接会返回0;其他返回值如下:
AndroidAuto连接流程及代码实现_第9张图片
AndroidAuto连接流程及代码实现_第10张图片
AndroidAuto连接流程及代码实现_第11张图片
PCTS蓝牙测试项中把配对方式改成BLUETOOTH_PAIRING_NUMERIC_COMPARISON是可以通过的。

无线连接流程

有线连接成功后,无线连接就变得很简单了,只是多加了几条协议,加了个socket连接。
AndroidAuto连接流程及代码实现_第12张图片
无线投影需要在MD和HU之间建立多个通信链路。无线连接过程包括以下步骤:

  1. 蓝牙服务发现
  2. 蓝牙配对
  3. 蓝牙HFP连接
  4. 蓝牙RFCOMM连接
  5. 蓝牙RFCOMM版本协商
    此时,无线投影可以从MD或HU启动都可以。无线投影会话由HU或MD发送一个WifiStartRequest。然后,连接过程继续执行以下步骤:
    AndroidAuto连接流程及代码实现_第13张图片
  6. 通过蓝牙RFCOMM进行Wi-Fi证书交换(如果需要)
  7. Wi-Fi网络连接
  8. 建立以车机为服务端,手机为客户端的TCP连接
  9. AAP服务发现过程
  10. Wi-Fi证书交换(作为AAP服务发现的一部分)
  11. AAP建立会话(AAP over TCP / IP over Wi-Fi)

代码实现(TBD)

ProtocolEndpointBase:所有服务类的基类,封装了消息分发的处理
MediaSinkBase:媒体流处理基类,封装了audio和video的状态处理
MessageRouter:消息分发类,把解析出来的数据包转发给对应的模块
Controller:制器类,用来管理内部状态
Channel:手机和车机间抽象的一个服务端点
ChannelManager:消息处理,解包封包
GalReceiver:对协议栈内部接口调用的封装

数据收发(TBD)

// 
int foo = 0;
std::string str = "0";

音频

视频

控制流程(TBD)

音频

Android auto的音频主要有导航、媒体、电话以及麦克风,支持PCM格式,可以采用alsa实现

视频

Android auto的视频格式为H.264
linux平台,可以用gstreamer

**

未完待续。。。

**

你可能感兴趣的:(车载)