【android bluetooth 案例分析 04】【Carplay 详解 3】【Carplay 连接之车机主动连手机】

1. 背景

在前面的文章中,我们已经介绍了 carplay 在车机中的角色划分, 并实际分析了 手机主动连接车机的案例。 感兴趣可以 查看如下文章介绍。
【android bluetooth 案例分析 04】【Carplay 详解 1】【CarPlay 在车机侧的蓝牙通信原理与角色划分详解】
【android bluetooth 案例分析 04】【Carplay 详解 2】【Carplay 连接之手机主动连车机】

本节 将详细分析 车机 主动 连接 iphone手机 carplay 这一过程。

先回顾一下 carplay 整个流程:

  1. EIR 广播识别

    • iPhone 开启 EIR 广播,包含 UUID_DEVICE_CARPLAY_EIR 2d8d2466-e14d-451c-88bc-7301abea291a
    • 车机通过蓝牙扫描识别支持 CarPlay 的 iPhone
  2. 蓝牙连接

    • 没有配对,需要先配对
    • iPhone 主动连接车机的 SPP Server UUID (UUID_IAP_ACCESSORY 00000000-deca-fade-deca-deafdecacaff)
      • 车机需要先 listenUsingRfcommWithServiceRecord
    • 车机作为 Client 主动连接 iPhone 暴露的 Server UUID
      • (需 iPhone 开启EIR 广播)
  3. IAP2 协议交互

    • 交换设备信息、认证令牌、能力参数(支持哪种 Wi-Fi 架构)
  4. Wi-Fi 建链

    • 手机连接车机热点,或车机连接手机热点,完成 IP 建立
  5. TCP & mDNS 发现 CarPlay 服务

    • 建立 TCP 通信,寻找 _carplay._tcp.local 服务,启动 CarPlay Session
  6. 启动投屏/音频/导航服务

上面总过分为 6 步: 但是涉及到蓝牙的只有 1 、 2、 3 步。 那我们就来分别来介绍一下 在当前 车机主动连手机的情形。这三步是如何具体实操的。

2. 车机 主动 连接 手机

1. EIR 广播

在 【android bluetooth 案例分析 04】【Carplay 详解 2】【Carplay 连接之手机主动连车机】 中已经详细介绍了:

  • 手机 广播 EIR , 车机扫描 的过程。
  • 车机 广播 EIR, 手机扫描 的过程。

这里不再介绍。

2. 蓝牙连接 iap 并通信

没有配对,需要先配对 : 这个是常规操作, 这里不分享了。

这里主要分析一下。 车机 主动连接 手机 iap 的过程:

当我们在车机 carplay app 连接界面 中 点击 连接 手机时:

车机将执行如下 代码:

c 复制代码
public static final UUID CLINET_SPP_UUID = UUID.fromString("00000000-deca-fade-deca-deafdecacafe");


BluetoothSocket mClientSocket = device.createRfcommSocketToServiceRecord(CLINET_SPP_UUID);

mClientSocket.connect();

// 之后就可以拿着 mClientSocket 来进行 iap 通信了

1. createRfcommSocketToServiceRecord 介绍

java 复制代码
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID uuid);
  • 该函数通过指定的 UUID,创建一个指向远端设备某个特定服务的蓝牙 Socket。

  • 实质上,它是通过 SDP (Service Discovery Protocol) 发现对方设备是否注册了这个 UUID 所代表的服务,并建立一个 RFCOMM 连接(类似串口通信)。

  • createRfcommSocketToServiceRecord 并不会立即建立连接,它只是创建了一个蓝牙 Socket 实例 ,需要再调用 .connect() 才真正开始连接。

  • 该函数只适用于已配对设备之间的通信,未配对时会抛出异常或被拒绝连接。

  • UUID 必须与对方设备注册的一致,否则 SDP 查询失败,连接将报错。

2. btsnoop 日志分析

  • 车机 向 手机 发起 SDP 请求 ,查询 00000000-deca-fade-deca-deafdecacafe 服务。
  • 手机回复 当前 服务的 rfcomm 通道为 1
  • 车机拿到 手机对应的 rfcomm channel=1 后, 主动发起连接。
  • 连接成功后, 就开始对应 iap 通信。 通过 RFCOMM 通道传输配对、身份认证、Wi-Fi 架构协商、热点信息等数据。
  • 之后手机就可以 将 画面 通过wifi 投屏到车机中。

3. 总结

一般情况下 createRfcommSocketToServiceRecord 函数都是 手机侧主动连接车机 使用的,此时:

功能 Server 端 Client 端
方法 listenUsingRfcommWithServiceRecord(UUID) createRfcommSocketToServiceRecord(UUID)
主体 车机 iPhone(或其他 Bluetooth Client)
作用 注册服务监听连接 查找服务并尝试连接
CarPlay 中用途 车机开放 IAP2 服务 iPhone 主动发起连接

但是 在车机 侧如果 调用 createRfcommSocketToServiceRecord 去连手机时, 正好和上述反了。此时手机侧 是 服务段。 所以猜测手机 使用了 listenUsingRfcommWithServiceRecord 作为服务端了。

  • 本文就是对 该场景的分享。

对应 createRfcommSocketToServiceRecord 函数的分析,我将单独 一篇文章分析。

相关推荐
海水冷却8 小时前
Android 群组聊天怎么实现:基于 ZIM 的完整落地指南(附可运行 Demo)
android
三少爷的鞋11 小时前
现代 Android 架构指南:不要再主动设计 Callback 接口
android
TimeFine17 小时前
AI 编码工作流的设计
android·ai编程
骑着蜗牛撵大象32717 小时前
C++20 协程 × 屏障:手写一个 co_await 版 Barrier,让等待不再钉死线程
android·c++20·协程·并发编程·co_await·屏障同步
山东孙燕姿19 小时前
设备台账重构:从一张表到三层模型
android·java·网络·低代码·重构·rxjava
蒸鱼Yuzheng20 小时前
移动端 CPU 调度分析:线程亲和性、大小核迁移与卡顿
android·perfetto·性能分析·线程优化·cpu调度
booboosui20 小时前
安卓唤醒词:12 维 MFCC 加 DTW,阈值 1.8
android
传奇开心果20 小时前
Compose Multiplatform 共享边界实战:架构契约、互操作同步与可回退设计
android·kotlin
事圆则缓21 小时前
从开机到首帧:Android 系统与应用启动流程源码分析
android
AI吃大瓜21 小时前
指针压力表读数4:Android实现指针压力表读数(可实时检测)
android·指针读数·指针压力表·压力表·压力表读数