【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 函数的分析,我将单独 一篇文章分析。

相关推荐
呆呆小孩1 天前
零基础学 MySQL(上):从建库建表到增删改查,一篇搭好 SQL 基础
android·sql·mysql
catchadmin1 天前
NativePHP v4 让 Blade 构建原生 iOS 与 Android 界面
android·ios·ai·php
FfHUCisI1 天前
Golang 数据库连接池深度调优
android·数据库·golang
古法安卓1 天前
Android-epoll原理详解
android·java·android studio
字节暗面1 天前
四款 APP 加固强度测评:让 AI 拆了四个包,结果有点出乎意料
android·逆向工程·加固
网安蟹佬霸1 天前
蓝队防御实战:SIEM与SOAR构建安全运营中心(万字详解+实战配置)
android·安全·web安全·网络安全·网安
敢敢のwings1 天前
世界模型与FlashWorld:从“在梦中学习“到秒级3D场景生成
android·学习·3d
Dovis(誓平步青云)1 天前
牛奶不能减成负数:冰箱库存的筛选、去重与不可变更新
android·java·开发语言
Awna1 天前
MySQL 存储空间与索引运维实战:从空间排查到在线扩容
android·运维·mysql
智购科技无人售货机工厂1 天前
2026自动售货机触摸屏驱动开发:从I2C协议到多点触控校准的工程实践~YH
android·驱动开发·python·单片机·云原生·django