关于CAN总线,牛喀 曾发布过一篇热文:,文中介绍了CAN总线架构的简史及其安全性。本篇文章,将通过CAN总线,告诉大家如何通过编程控制汽车。
另外,您还可以关注牛喀学城本月24日的,在三天的培训中,您将学习CAN,CAN-FD总线,以太 等通信技术,以及他们的攻击面和防护手段。并有机会获得“汽车信息安全高级工程师”认证证书。
CAN-Bus简介
CAN-Bus全称为“控制器局域 总线技术(Controller Area Network-Bus)”,是ISO国际标准化的串行通信协议,最早由德国BOSCH公司1983年开发,并最终成为国际标准(ISO 11898),是全球应用最广泛的现场总线之一。在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制 络的标准协议。
如今的智能 联汽车拥有大量控制系统,这些控制系统基于Web技术开发并在多种微服务处理中发挥作用,如安全气囊、刹车、巡航控制、电动助力转向、音响系统、电动车窗、门、后视镜调整按钮、电池和充电系统等。这些系统需要相互通信和状态读取,因此技术人员开发了CAN-Bus协议,并被应用于汽车制造行业。有了CAN-Bus的汽车,就好比是汽车拥有了神经系统。
可以把CAN-Bus认为是汽车用来进行传感器数据传递的简单 络,它完美地集成了各种复杂部件,使智能 联汽车可以实现各种新型的功能,满足了我们对汽车更加智能化的憧憬。以下为1988年款的宝马8系,这是全球第一台采用CAN总线的汽车:
自动驾驶汽车与CAN-Bus
随着自动驾驶技术的的飞速发展,CAN-Bus的应用概念也变得非常普及。为什么呢?因为很多自动驾驶公司并不会大规模地从硬件方面开始制造无人驾驶汽车,而是把研发重点直接先放在了软件控制车辆方面。而通过汽车CAN-Bus协议的逆向工程分析(参加24日牛喀学城”汽车信息安全培训“掌握逆向工程技术),无人驾驶汽车工程师可以利用软件方式实现对汽车的命令发送控制,如转向、加速和刹车等。
通过使用类似激光雷达、毫米波雷达等传感器,无人汽车就具备了超凡的“感知”世界的能力,车内微型计算机可以就引导、加速、刹车等动作做出决定。因为自动驾驶技术的要求非常高,于是我们选择了福特Fusion电子线控方式(drive-by-wire!)来传递汽车控制讯 。
破解福特Fusion的CAN-Bus
开始破解福特Fusion温度控制系统时,《汽车黑客大曝光》成了笔者的研究首选参考书目。该书同样可以在牛喀 免费获取电子版,只需在牛喀学城后台回复【汽车黑客大曝光】即可。
在深入讲解之前,让我们来看看三个重要概念:总线协议、CAN总线协议、CAN帧。
1. CAN-Bus
A raw CAN signal, as seen by an oscilloscope
也就是说,通过CAN-Bus传输的数据包不是标准的,每个CAN-Bus数据包包括四个主要部分:
· Arbitration ID :用于标识发起通信请求的设备ID广播消息,并且任何一个设备组件都能发起多个Arbitration ID,如果两个CAN数据包同一时间在总线Bus内传输,则Arbitration ID较小的数据包先获得总线使用权,先被传输。
· Identifier extension(标识符扩展,IDE) :对标准CAN协议来说,这个数据位总是为0;
· Data length code (数据长度代码,DLC):代表数据的大小,从0到8字节不等;
· Data(数据):传输数据本身,标准CAN总线可以承载最大数据包为8字节,但有些系统也强制使用8字节进行数据包填充。
2. 标准CAN数据包
3. CAN帧
一辆车内有多种CAN总线,为了实现A/C系统的打开和关闭,我们需要找到正确的CAN运行总线,以福特Fusion来说,其中至少标记有4个总线,其中3个为运行500kbps的高速率CAN总线HS1、HS2、HS3,1个为运行125kbps的中速CAN总线MS。
OBD-II接口具备两种这类型CAN总线:HS1和HS2,但为了防止一些恶意命令,它们都是被隔断状态的。但在笔者与其团队的努力下,彻底把OBD-II这个限制问题解决了,并发现了直接访问HS1、HS2、HS3和MS的方式。关键在于OBD-II接口背后,一个所有总线汇总的 关模块(Gateway Module)上。以下为一辆无人驾驶出租车Homer后座控制接口概览:
由于A/C系统可以通过汽车的媒体界面(SYNC)进行更改,所以只需直奔MS中速总线而去。但是如何才能让电脑可以读写CAN数据包呢?答案就是SocketCAN,这是一个由大众公司向Linux内核基金会研发的开源CAN驱动和 络协议栈集。
把车辆的GND、MSCANH、MSCANL3条线连接到Kvaser Leaf Light HSv2和CANable设备中,然后在另一端,使用安装有较新版本Linux内核的电脑连接,把CAN总线作为 络设备识别加载:
modprobe can
modprobe kvaser_usb
ip link setcan0 typecan bitrate 1250000
ifconfig can0 up
(Kvaser Leaf Light HSv2亚马逊售价300美金,CANable在Tindie售价25美金。在牛喀学城的中,会介绍这些工具的应用方法)
加载之后,尝试使用candump can0命令,分析其中的流量情况:
但是,很难从中发现动作和行为模式,如同观察声音信 波形。在此,需要使用工具cansniffer对频率进行等效化分析,cansniffer显示的一串数据包ID ,可以帮助团队研究在CAN帧数据区变化时进行准确定位。有了这个功能,就能分辨出哪些数据包是应该丢弃的,而哪些又是息息相关的。
以下是cansniffer在MS中速总线的抓包示例,正在对所有通过串口的数据包进行过滤,只需要CAN id为355、356和358的数据包。同时,通过按下汽车空气调节按钮后观察数据包变化情况,发现001C00000000代表了该按钮的开关作用。
控制汽车空调系统(A/C系统)
接下来就是把A/C系统功能连接到我们运行于我们的微型计算机,该计算机为机器人操作系统(ROS),而幸运的是,利用前述提及的SocketCAN和ROS中的一个模块,就能很容易实现连接和操作。而且用socketcan_bridge方式可以将CAN数据帧转换成ROS可接收的消息格式。
Perfect!
ifframe.id == 0x356:
raw_data = unpack( ‘BBBBBBBB’, frame.data)
fan_speed = raw_data[ 1] / 4
driver_temp = parse_temperature(raw_data[ 2: 4])
passenger_temp = parse_temperature(raw_data[ 4: 6])
由此生成的数据被存储在名为CelsiusReport.msg的文件中:
boolauto
bool system_on
bool unit_on
bool dual
bool max_cool
bool max_defrost
bool recirculation
bool head_fan
bool feet_fan
bool front_defrost
bool rear_defrost
stringdriver_temp
stringpassenger_temp
在按下汽车A/C系统相关功能的按钮之后,将得到以下这个对应的代码清单:
CONTROL_CODES= {
‘ac_toggle’: 0x5C,
‘ac_unit_toggle’: 0x14,
‘max_ac_toggle’: 0x38,
‘recirculation_toggle’: 0x3C,
‘dual_temperature_toggle’: 0x18,
‘passenger_temp_up’: 0x24,
‘passenger_temp_down’: 0x28,
‘driver_temp_up’: 0x1C,
‘driver_temp_down’: 0x20,
‘auto’: 0x34,
‘wheel_heat_toggle’: 0x78,
‘defrost_max_toggle’: 0x64,
‘defrost_toggle’: 0x4C,
‘rear_defrost_toggle’: 0x58,
‘body_fan_toggle’: 0x04,
‘feet_fan_toggle’: 0x0C,
‘fan_up’: 0x2C,
‘fan_down’: 0x30,
}
现在,可以直接将以上字符串对应的数据代码发往ROS节点,由它将这些数据信息转换成汽车可以识别的特殊代码:
rostopicpub /celsius_control celsius/CelsiusControl ac_toggle
结果
好了,可以向CAN总线发送相应的CAN代码了,这种代码控制方式与调节汽车空调A/C系统的外置按钮是一样的效果。这也意味着,在无人驾驶汽车的后座,你可以使用手机APP方式远程控制改变汽车的车内温度了。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!