该文档概述了我经历的过程来逆转我的Cobra IRAD 900雷达检测器的蓝牙协议。我的最初目标是通过蓝牙与设备的Raspberry Pi 3接口进行处理,以处理警报,而无需使用iOS/Android应用程序,最终将其用作与我的Raspberry Pi“ Carputer”的不错的接口。
重要的是要注意,我在蓝牙协议上没有最初的经验,但总体而言,这是一种非常有趣的学习经验。
当我第一次开始这个项目时,我不知道从哪里开始,但是从Google开始。我知道如何嗅探常规的网络流量,但是蓝牙对我来说是一个黑匣子。通过一些快速搜索,我找到了毕色的库以及有关通过RFCOMM进行交流的示例。我还发现了一些不错的资源,包括Travis Goodspeed的一篇有趣的博客文章。
但是,对这个主题的指导很少,我还花了很多时间在这样的资源上,认为蓝牙LE是我想要的。
与我的旧越狱iPhone 5一起玩,我能够使用BTServer记录我iPhone发送和接收的蓝牙流量。日志文件被多个蓝牙设备所包围,尽管这不是问题,但日志文件迅速增长。值得庆幸的是,日志被输出为.pklg文件,从而轻松地过滤Wireshark中的相关数据包。
使用数据包滤波器bluetooth.src == B8:92:1D:00:3F:61 ,我可以看到iOS应用程序发送给雷达检测器的原始数据包。我对手机和雷达检测器之间的通信进行了一些示例录音,其中一些带有警报,有些则没有。
蓝牙数据通过RFCOMM协议传输。当设备首次连接时,他们来回发送一些信息,可能只是同步设置(稍后再详细介绍)。之后,两个设备彼此之间遵循可预测的模式。雷达检测器将以常规的1/2秒间隔通过蓝牙发送RFCOMM数据包。有了一段时间和耐心,我能够解读从雷达检测器发送到iPhone的有效载荷结构。
有效载荷结构:雷达检测器→iPhone
| 物品 | 价值(十六进制) | 尺寸 |
|---|---|---|
| 前言 | 55 | 1字节 |
| 有效载荷大小 | xx xx | 2个字节 |
| 行动 | xx | 1字节 |
| 预订的 | 00 | 1字节 |
| seq | xx | 1字节 |
| 预订的 | xx xx xx xx xx xx | 6个字节 |
| 警报 | xx | 1字节 |
| 警报类型 | xx | 1字节 |
| ... | ... | ... |
随着雷达检测器的运行,它将以上述格式发送数据包。尽管计算机网络不是我的专业知识领域,但我会尽力解释。
发送的序列字节始终以值0x55发送。这说明这是从设备开始新的有效载荷消息的开始,而不是从以前的数据包中继续。之后是一个2字节值,其中包含消息的其余部分的大小(前3个字节之后的所有内容)。操作值指定数据包发送的信息类型。
SEQ编号是事物开始变得有趣的地方。如果您参加了网络上的课程,或者对TCP有所了解,那么您可能已经知道它的用途。雷达检测器将向iPhone发送1个字节值,iOS应用程序必须以相同值的ACK响应。否则,雷达探测器将意识到某些事情是错误的并断开了自己的连接。
Alert字节指定是否正在触发警报。如果是这样,它是一个值0x41的集合,并且使用以下字节来指定正在发送警报的类型。由于我没有实际的雷达枪,所以我找不到太多关于这些值的信息。不过,一个使用Arduino的人用Arduino制作了LiDAR枪模拟器。这在分析数据包方面有很大帮助。
为了使iOS应用程序维护与设备的连接,它需要以正确格式发送响应。值得庆幸的是,对雷达检测器的响应要简单得多,只有9个字节。
响应: iPhone→雷达检测器
| 物品 | 价值(十六进制) | 尺寸 |
|---|---|---|
| 前言 | 55 | 1字节 |
| 有效载荷大小 | xx xx | 2个字节 |
| 行动 | 02 | 1字节 |
| 预订的 | 00 | 1字节 |
| ACK | xx | 1字节 |
| 预订的 | 00 42 | 2个字节 |
| 柜台 | xx | 1字节 |
如前所述,ACK值必须与先前接收到的SEQ值相同,否则将断开连接。这很容易。其他一些协议可能具有不太明显的客户端检查方法;值得庆幸的是,情况并非如此。有趣的是,还有另一个使用的counter变量。我从来没有真正弄清楚字节的目的,但是每个响应对设备的响应都会减少1个。这两个值都很容易将编码编写成Python脚本,并且根本没有进行太多的工作。
正如我之前提到的,当iOS应用首先连接到雷达检测器时,某些设置和数据来回同步。弄清楚并分解这些数据包并不是我的优先事项,我不想花太多时间在此上。我以XML文件(data.xml)导出了Wireshark中的整个数据包日志,然后使用python脚本(parsedata.py)来处理和存储信息以备后用。
加载后,Radar.py将在PacketData.dat文件中打开预处理的数据。然后,它通过蓝牙扫描雷达检测器并尝试连接到它。连接后,雷达检测器将向连接的设备发送一些数据包。值得庆幸的是,它们每次都是相同的精确数据包。 Python脚本将浏览来自PacketData.dat文件的数据,以获取收到的数据包。一旦主要的Python脚本找到了一个机械包,它就会向雷达检测器发送相应的先前录制响应。
令人惊讶的是,它的效果很好。不过,我想如果我更改了iOS应用程序中的任何设置,我需要更新数据文件。这不是太多的问题,因为我只需要一次配置该设备,并且可能再也不会使用该应用了。
鉴于我发现的所有信息,我能够编写一个模拟iPhone连接的Python脚本。如果在记录的响应的数据库中找不到数据包,它将构造一个响应数据包,上面i先前详细介绍了结构。
回顾过去,这是一个非常有趣的项目,做一些我从未真正拥有过经验的事情。作为计算机科学专业的专业,一旦使用硬件或多或少是异常的事情,这很有趣。
Brandon Asuncion // [email protected]
任何评论/反馈都将不胜感激!