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将这些应用程序投影到车辆中。

USB连接


Android Auto连接时,车机的usb需要作为host。
车机端需要尝试AOAP初始化,为了正确的检测和协商USB模式的切换车机和手机需要以下流程:
1.车机尝试用AOAP连接手机并且把自己作为AOAP accessory。
2.如果手机支持AOAP,它会重枚举为AOAP模式;如果手机不支持AOAP,它会忽略AOAP握手,允许车机协商其他USB模式或者充电模式。
连接流程如下:

手机切换AOA模式成功之后,车机需要开始AAP连接,使用ssl进行验证,车机需要识手机能否支持AAP协议。

MD和HU使用SSL证书建立信任

蓝牙连接

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

1.5版GAL流程如下:

如果手机之前已连接车机,则会进行如下的配对过程

注:

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;其他返回值如下:



PCTS蓝牙测试项中把配对方式改成BLUETOOTH_PAIRING_NUMERIC_COMPARISON是可以通过的。

无线连接流程

有线连接成功后,无线连接就变得很简单了,只是多加了几条协议,加了个socket连接。

无线投影需要在MD和HU之间建立多个通信链路。无线连接过程包括以下步骤:

  1. 蓝牙服务发现
  2. 蓝牙配对
  3. 蓝牙HFP连接
  4. 蓝牙RFCOMM连接
  5. 蓝牙RFCOMM版本协商
    此时,无线投影可以从MD或HU启动都可以。无线投影会话由HU或MD发送一个WifiStartRequest。然后,连接过程继续执行以下步骤:
  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

**

未完待续。。。

**

AndroidAuto连接流程及代码实现相关推荐

  1. Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程

    Android的WiFi 我们通常看到WiFi的守护进程wpa_supplicant在我们的ps的进程列表中,这个就是我们的wifi守护进程.wpa_supplicant在external/wpa_s ...

  2. 【Go API 开发实战 3】API 流程和代码结构

    API 流程和代码结构 为了使读者在开始实战之前对 API 开发有个整体的了解,这里选择了两个流程来介绍: HTTP API 服务器启动流程 HTTP 请求处理流程 本小节也提前给出了程序代码结构图, ...

  3. 蓝牙遥控器连接流程分析

    背景 最近在一个Linux系统的ARM板子上移植一款蓝牙芯片,因为我们做的是机顶盒,所以首要功能就是能连接上蓝牙遥控器,并且能正常的接收按键.之前在安卓平台,连接上蓝牙遥控器后,会自动创建/dev/i ...

  4. Task01:熟悉新闻推荐系统的基本流程(代码复现)

    Task01:熟悉新闻推荐系统的基本流程 0.代码版本 1.系统信息 2.`python`环境 3.`MySQL`数据库 4.`MongoDB` 5.`Redis` 6.`Node.js` 7. 复现 ...

  5. iOS 蓝牙开发(二)iOS 连接外设的代码实现

    上一篇文章介绍了蓝牙的技术知识,这里我们具体说明一下中心模式的应用场景.主设备(手机去扫描连接外设,发现外设服务和属性,操作服务和属性的应用.一般来说,外设(蓝牙设备,比如智能手环之类的东西),会由硬 ...

  6. 全流程低代码物联网平台IoT-Fast教你对接labVIEW

    导读:IoT-Fast是一款全流程低代码物联网平台,提供了丰富的设备采集控制协议(Modbus RTU 串口.Modbus TCP 网口.通用 OpcUa 通讯协议.西门子 S7 通讯协议.三菱 Fx ...

  7. 经典蓝牙 蓝牙连接 - 从AIR LOG和HCI LOG分别分析蓝牙连接流程

    1.目录 文章目录 1.目录 2.LMP连接 3.从HCI LOG分析蓝牙连接流程 1.HCI_Inquiry 1.1 命令参数解析 1.1.1 LAP IAC 1.1.2 Inquiry_Lengt ...

  8. RDP协议概述、协议栈以及连接流程

    从本文开始,我们将介绍一系列RDP协议的相关实现技术. 一.RDP协议的诞生 网络上存在着大量关于RDP协议是如何产生的话题和历史论述,有人说RDP协议是微软自家自研的协议,有人说这是微软从国际电信联 ...

  9. WiFi Direct详解(p2p使能,扫描,连接流程)基于Android8.1.0

    如果你也是年轻的程序员,关注我一起学习探讨 简介:Wi-Fi Direct技术的目的是在没有Wi-Fi AP的情况下由两个或者多个Wi-Fi设备互相之间进行高速的数据通信.通信完全基于TCP/IP 协 ...

最新文章

  1. Windows Phone开发:常用控件(上)
  2. 图解命令行手动编译构建一个win32汇编程序
  3. Object.wait()与Object.notify()的用法
  4. Qt Creator指定运行设置
  5. 使用 Label 类在 XNA 中显示文本,WPXNA(七)
  6. chrome调试工具高级不完整使用指南(基础篇)
  7. VLC简介及使用说明
  8. MyEclipse10下开发第一个Hibernate小程序
  9. sql 触发器未触发_SQL触发器–综合指南
  10. PHP设计模式——建造者模式
  11. 席位分配:惯例Q值法,dhondt法matlab实现
  12. MySQL数据库企业级应用实践(主从复制)
  13. Zalo电脑版多开软件
  14. 简单好用的每日任务管理小工具-sticker桌面便签
  15. Inpaint 强大的去水印、改图软体,轻鬆把不要的物件从相片中移除
  16. 谷歌账号--手机号无法验证的问题
  17. 无线桥接后如何进入副路由器的页面?
  18. 虚拟机与物理主机设置为同一ip字段
  19. Creo AFX钢结构设计视频教程
  20. Debian 7.x 安装教程、网络配置、软件源配置、磁盘分区、LVM、U盘安装、网络安装...

热门文章

  1. 震撼低音演绎 这款索爱桌面电脑音响就是不一样
  2. 最详细python安装库的方法(以安装pygame库为例)
  3. 数据库取到blob对象转换成String对象
  4. 中国女性对男士的外表性感有多看重?
  5. ACS 802.1x网络接入认证
  6. Java Map.forEach 用法示例
  7. Expression 类
  8. Linux必会100个命令(四十三)useradd和userdel
  9. 这些图让你看懂分布式追踪系统原理及实践
  10. 复现fastreid学到的Linux指令等知识