14、网络与连接:车载以太网(Ethernet),Wi-Fi 与蓝牙配置,Tethering 策略
各位同学,今天我们来聊聊车载系统里一个特别“接地气”但又极其关键的话题——网络与连接。说实话,在手机或者平板电脑上做网络开发,你基本不用太操心底层硬件,Wi-Fi 连不上?重启一下路由器。但在车机上,情况就完全不一样了。你想想看,一辆车要跑十几二十年,网络模块要是出了问题,用户可能连导航都用不了。
我个人习惯把车载网络分为三大块:车载以太网(负责车内骨干通信)、Wi-Fi 与蓝牙(负责短距无线连接)、以及Tethering 策略(负责网络共享)。这三者相互配合,构成了整车的信息高速公路。今天我就结合自己在项目里踩过的坑,跟大家好好拆解一下。
14.1 车载以太网:车内通信的“主动脉”
先说说以太网。你可能觉得奇怪,以太网不是电脑上用的吗?怎么车上也用?其实,随着智能座舱和自动驾驶的发展,传统的 CAN 总线已经扛不住了。CAN 总线最高也就 1 Mbps,而一个高清摄像头的数据流就能轻松吃掉几百 Mbps。所以,车载以太网应运而生。
核心要点:车载以太网通常使用 100BASE-T1 或 1000BASE-T1 标准,采用单对非屏蔽双绞线,比传统以太网更轻、更便宜、更抗干扰。
在 Android Automotive OS 里,以太网的管理是通过 EthernetManager 来完成的。系统会为每个以太网接口创建一个 NetworkInterface,然后通过 ConnectivityService 来评估网络质量。
我曾经在一个项目中遇到过这样的问题:车机启动后,以太网接口虽然 up 了,但系统始终不把它设为默认路由。查了半天,发现是 NetworkCapabilities 没有正确设置 NET_CAPABILITY_INTERNET 标志。嗯,这里要注意,车载以太网不一定总是连接互联网的,它可能只是连接域控制器。所以系统需要明确知道这个网络能不能上网。
// 示例:配置以太网请求
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET);
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
cm.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
// 网络可用,绑定到该网络
cm.bindProcessToNetwork(network);
}
});
避坑指南:我曾经在调试时发现,某些车规级以太网 PHY 芯片在休眠唤醒后,需要重新初始化 MDIO 总线。如果 Android 的驱动没有处理好,就会出现“网络看起来通了,但 ping 不通”的诡异现象。建议在 HAL 层增加链路状态检测机制。
14.2 Wi-Fi 配置:不仅仅是连个热点
车载 Wi-Fi 和手机 Wi-Fi 最大的区别在于:车是移动的。你开车经过不同的地方,会不断遇到新的 Wi-Fi 热点。系统需要智能地选择连接哪个,而不是像手机一样傻傻地连上一次连过的。
在 Android Automotive 里,Wi-Fi 的配置主要通过 WifiManager 和 WifiAwareManager 来实现。但这里有个关键点:车机 Wi-Fi 通常有两种模式——STA(客户端模式)和 AP(热点模式)。
| 模式 | 用途 | 典型场景 |
|---|---|---|
| STA | 连接外部 Wi-Fi 网络 | 连接家庭 Wi-Fi 进行 OTA 升级 |
| AP | 提供 Wi-Fi 热点 | 乘客手机连接车机热点上网 |
| P2P | 点对点直连 | 手机投屏到车机 |
我个人建议,在配置 Wi-Fi 时,一定要考虑漫游策略。比如,当车辆进入地下车库时,车机应该自动切换到车库的 Wi-Fi 网络。这需要系统维护一个可信网络列表,并且能根据信号强度动态切换。
注意:千万不要让车机在行驶过程中频繁扫描 Wi-Fi 网络。这会导致功耗增加,而且可能干扰其他无线模块。我见过一个项目,因为 Wi-Fi 扫描间隔设置得太短,导致蓝牙音频出现断断续续的问题。
14.3 蓝牙配置:配对与多设备管理
蓝牙在车机上的应用,说白了就是两件事:电话和媒体。但实际做起来,远比想象中复杂。你想想看,一辆车可能有五个人,每个人都要连蓝牙,系统怎么管理?
Android Automotive 使用 BluetoothAdapter 和 BluetoothProfile 来管理蓝牙连接。但车机有一个特殊需求:多设备同时连接。比如,驾驶员连蓝牙电话,副驾驶连蓝牙音乐,后排乘客连蓝牙游戏手柄。
我记得在做一个项目时,产品经理要求“所有乘客都能同时连接蓝牙耳机”。这听起来很美好,但实际上一台车机的蓝牙芯片通常只支持 5-7 个并发连接。而且,每个连接都会占用带宽和内存。最后我们妥协的方案是:只允许 3 个音频设备同时连接,其他设备只能用于数据传输。
// 示例:注册蓝牙配对请求广播
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// 自动配对,无需用户确认
device.setPairingConfirmation(true);
abortBroadcast(); // 阻止系统弹出配对对话框
}
}, filter);
避坑指南:我曾经在调试蓝牙免提时发现,某些手机在连接车机后,通话声音会从手机扬声器出来,而不是车机。原因是手机端的 BluetoothHeadset 服务没有正确切换到 SCO 链路。解决方案是在车机端强制设置 AudioManager.setBluetoothScoOn(true)。
14.4 Tethering 策略:谁给谁共享网络?
Tethering,也就是网络共享,在车机上有两种方向:
- 手机→车机:手机开热点,车机连接上网(用于 OTA 或在线服务)
- 车机→手机:车机开热点,手机连接上网(用于乘客娱乐)
在 Android Automotive 里,Tethering 是通过 ConnectivityManager 的 startTethering() 和 stopTethering() 方法来控制的。但这里有一个很头疼的问题:策略冲突。
举个例子:如果车机同时开启了 Wi-Fi 热点和 USB 网络共享,那么数据包应该走哪条路?系统默认会优先使用以太网,其次是 Wi-Fi,最后是蜂窝网络。但车载场景下,你可能希望优先使用蜂窝网络,因为车机自带的 4G/5G 模块通常比手机热点更稳定。
核心策略:我建议在实现 Tethering 时,遵循以下优先级:
1. 车载以太网(如果有)
2. 车载蜂窝网络(内置 SIM 卡)
3. 外部 Wi-Fi(如家庭或停车场 Wi-Fi)
4. 手机热点(通过蓝牙或 USB 共享)
另外,还要考虑流量计费的问题。如果车机使用的是按量计费的蜂窝网络,那么当用户开启热点时,系统应该弹出警告,提醒用户流量消耗。这个逻辑在 NetworkPolicyManager 里可以配置。
// 示例:检查是否允许 Tethering
TetheringManager tm = getSystemService(TetheringManager.class);
if (tm.getTetheringConfiguration().isTetheringAllowed()) {
tm.startTethering(TetheringManager.TETHERING_WIFI,
new Executor() { ... },
new TetheringManager.StartTetheringCallback() {
@Override
public void onTetheringStarted() {
// 热点开启成功
}
});
}
注意:在某些国家或地区,法规禁止车辆在行驶过程中开启 Wi-Fi 热点。所以,Tethering 策略必须与车辆的行驶状态绑定。我建议在 CarService 中监听 Car.POWER_PROPERTY 或 Car.SPEED_PROPERTY,当车速超过某个阈值时,自动关闭热点。
14.5 知识体系总览
好了,讲了这么多,我画了一张图来总结本章的核心逻辑。你可以看到,车载网络其实是一个分层结构:底层是物理链路(以太网、Wi-Fi、蓝牙),中间是连接管理(ConnectivityService),上层是应用策略(Tethering、漫游、计费)。
这张图从左到右,从上到下,基本覆盖了车载网络的核心模块。你如果能把这三层都吃透,那在车机网络开发这块,基本上就能独当一面了。