10、网络与连接:车载以太网、Wi-Fi、蓝牙、蜂窝网络配置与管理
各位好,我是老张。今天我们来聊聊车载系统里最“隐形”却又最关键的部分——网络与连接。
你想想看,一辆车如果没有网络,导航没法实时更新,音乐只能听本地,OTA升级更是天方夜谭。说白了,网络就是智能座舱的“血管”。在Android Automotive OS里,这块的复杂度远超手机,因为车上同时跑着以太网、Wi-Fi、蓝牙和蜂窝网络,而且它们之间还要协同工作。
核心观点:车载网络不是简单的“能连上就行”,而是要在高速移动、温度剧烈变化、电磁干扰严重的环境下,保证多网络无缝切换和低延迟通信。
10.1 车载以太网:骨干网络的基石
我个人习惯把车载以太网比作汽车的“脊梁骨”。为什么这么说?因为现在一辆高端车上有上百个ECU(电子控制单元),它们之间需要高速、可靠的数据交换。传统的CAN总线带宽只有1Mbps左右,而车载以太网起步就是100Mbps,甚至1000Mbps。
在Android Automotive里,以太网通常用于连接IVI(车载信息娱乐系统)与T-Box(远程通信盒子)、ADAS(高级驾驶辅助系统)等核心模块。配置起来其实不复杂,但有几个坑要注意。
10.1.1 以太网配置示例
我记得第一次在车机上配以太网时,死活连不上。后来发现是IP分配方式没搞对。车载环境里,很多模块用的是静态IP,而不是DHCP。来看一个典型的配置:
<!-- /vendor/etc/ethernet.xml -->
<ethernet>
<interface name="eth0">
<mode>static</mode>
<ipaddress>192.168.1.100</ipaddress>
<netmask>255.255.255.0</netmask>
<gateway>192.168.1.1</gateway>
<dns>8.8.8.8</dns>
</interface>
</ethernet>
小提示:如果你用的是BroadR-Reach(一种车载以太网物理层标准),记得检查PHY芯片的驱动是否支持100BASE-T1。我曾经因为驱动版本不对,折腾了两天。
10.2 Wi-Fi:不只是连热点那么简单
Wi-Fi在车上的角色很特殊。它既要给乘客提供热点,又要用于OTA升级,甚至还要支持V2X(车路协同)通信。Android Automotive对Wi-Fi的管理比手机复杂得多,因为它要处理多个并发连接。
举个例子:车机可能同时连接着家里的Wi-Fi(用于OTA下载),又开着热点给后排乘客用。这两个功能不能冲突。Android里通过WifiManager和LocalOnlyHotspot来管理。
10.2.1 双Wi-Fi模式配置
嗯,这里要注意。Android Automotive支持双Wi-Fi,但需要硬件支持。配置时要在config.xml里开启:
<!-- frameworks/base/core/res/res/values/config.xml -->
<bool name="config_wifi_dual_band_support">true</bool>
<bool name="config_wifi_softap_dual_band">true</bool>
我曾经遇到过一个坑:开了双Wi-Fi后,车机频繁掉线。排查了半天,发现是天线隔离度不够,两个频段互相干扰。硬件上的问题,软件再怎么调也没用。
警告:车载Wi-Fi的发射功率要符合各国法规。中国要求2.4GHz频段不超过20dBm,5GHz频段不超过23dBm。别为了信号好就调高功率,小心过不了CCC认证。
10.3 蓝牙:配对与多设备管理
蓝牙这块,说白了就是“连接容易,稳定难”。车上蓝牙要同时处理电话、音乐、短信、甚至车钥匙功能。Android Automotive里用的是经典的BluetoothAdapter,但多了车载特有的Profile支持。
我建议你在做蓝牙开发时,重点关注两个场景:
- 多设备连接:主驾手机连电话,副驾手机连音乐。这需要实现
BluetoothDevice的优先级管理。 - 自动重连:车辆启动后,自动连接上次配对的设备。Android Automotive有
BluetoothHeadsetClient和BluetoothMapClient来管理。
10.3.1 蓝牙配对流程代码片段
// 启动蓝牙扫描
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.startDiscovery();
// 监听配对请求
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// 自动配对,避免用户手动输入PIN码
device.setPin("1234".getBytes());
device.createBond();
}
}
};
避坑指南:我曾经在自动配对时,直接调用了createBond(),结果有些手机弹出了PIN码输入框。后来发现,需要先调用setPin()设置固定PIN码,再创建绑定。不同手机厂商的蓝牙协议栈有差异,建议多测试几款主流机型。
10.4 蜂窝网络:4G/5G的配置与管理
蜂窝网络是车联网的“最后一公里”。没有它,远程控车、紧急呼叫、实时路况全都白搭。Android Automotive里,蜂窝网络由TelephonyManager管理,但车载场景下有几个特殊点。
你想想看,手机可以随时换SIM卡,但车机不行。车载SIM卡通常是eSIM(嵌入式SIM),或者焊接在板子上的。所以配置时,要特别注意APN(接入点名称)的设置。
10.4.1 APN配置示例
<!-- /vendor/etc/apns-conf.xml -->
<apn carrier="中国移动" mcc="460" mnc="00" apn="cmnet" type="default,supl" />
<apn carrier="中国联通" mcc="460" mnc="01" apn="3gnet" type="default,supl" />
<apn carrier="中国电信" mcc="460" mnc="11" apn="ctnet" type="default,supl" />
我记得有一次,客户反馈车机在某个地区无法联网。查了半天,发现是当地运营商的APN参数有变化。所以,我建议你在系统里预留一个APN更新接口,通过OTA随时调整。
关键点:车载蜂窝网络要支持多运营商。因为车辆可能跨省行驶,不同地区的信号覆盖不一样。最好在出厂时预置三大运营商的APN,并支持自动选择。
10.5 多网络协同与策略
好了,前面讲了单个网络怎么配。但实际项目中,这些网络是同时存在的。怎么让它们协同工作?这就涉及到网络评分与切换策略。
Android Automotive里有一个ConnectivityService,它会根据网络类型、信号强度、延迟等因素给每个网络打分。分数高的优先使用。比如:
- 以太网:100分(最稳定,优先用于ADAS数据)
- Wi-Fi:80分(适合大流量下载)
- 蜂窝网络:60分(作为备用)
- 蓝牙:40分(仅用于电话和音频)
你可以通过修改frameworks/base/core/res/res/values/config.xml里的config_networkAvoidBadWifi和config_wifi_framework_low_penalty_scan_interval来调整策略。
注意:不要把所有流量都丢给以太网。比如OTA下载可以用Wi-Fi或蜂窝网络,但ADAS的实时数据必须走以太网。优先级搞错了,轻则卡顿,重则影响行车安全。
10.6 知识体系总览
为了让你更直观地理解这些网络的关系,我画了一张图。它展示了Android Automotive里各网络模块的层级和交互方式。
从这张图你可以看到,从应用层到底层硬件,每一层都有明确的职责。实际开发中,你大部分时间会跟框架层打交道,但遇到性能问题时,往往要往下挖到硬件抽象层。
10.7 实战建议与总结
好了,聊了这么多,我最后给你几个实在的建议:
- 先做网络规划:别急着写代码。先搞清楚你的车上有哪些网络模块,它们的带宽、延迟要求是什么。画一张网络拓扑图,比什么都管用。
- 重视测试:车载网络的环境太复杂了。高温、低温、高速移动、隧道、地下车库……每个场景都要测。我曾经在实验室里跑得好好的,一上路就断连,后来发现是车辆震动导致以太网接口松动。
- 留好日志:在代码里多打日志,特别是网络切换和连接状态变化。出了问题,日志是你最好的朋友。
网络与连接这块,说白了就是“基础不牢,地动山摇”。希望今天的分享能帮你少走一些弯路。如果你在实际项目中遇到什么奇葩问题,欢迎随时交流。
一句话总结:车载网络不是简单的“连上就行”,而是要在多网络、多设备、多场景下,保证稳定、低延迟、高可靠的通信。这是Android Automotive开发中最考验功力的部分之一。