该项目是 DJI 的 Drone-ID 协议的接收器。接收器可以使用 SDR 实时工作,也可以离线使用预先录制的捕获。
我们来自 NDSS'23 的论文解释了协议和接收器设计:Drone Security and the Mysterious Case of DJI's DroneID
如果您正在寻找模糊器,我们会尽快上传 :)
实时接收器经过以下测试:
我们的软件是一个概念验证接收器,我们用它来对未知协议进行逆向工程。因此,它并未针对恶劣的 RF 条件、性能或范围进行优化。
我们在文件夹中提供示例文件samples/
。
样本直接从实时接收器的第一阶段转储,该阶段 检测候选帧并且不执行其他数据处理;它通常将它们直接交给您可以离线测试的其余代码。
您可以使用inspectrum
可视化原始示例文件:
sudo apt install inspectrum
inspectrum -r 50e6 samples/mini2_sm
为 Python 创建一个虚拟环境并安装要求:
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt
您现在可以在示例文件上运行解码器:
./src/droneid_receiver_offline.py -i samples/mini2_sm
该脚本像实时接收器一样执行检测和解码。它打印每个 Drone-ID 帧的解码有效载荷:
## Drone-ID Payload ## { "pkt_len": 88, "unk": 16, "version": 2, "sequence_number": 878, "state_info": 8179, "serial_number": "SecureStorage?", "longitude": 7.267960786785307, "latitude": 51.446866781640146, "altitude": 39.32, "height": 5.49, "v_north": 0, "v_east": -7, "v_up": 0, "d_1_angle": 16900, "gps_time": 1650894901980, "app_lat": 43.26826445428658, "app_lon": 6.640125363111847, "longitude_home": 7.26794359805882, "latitude_home": 51.446883970366635, "device_type": "Mini 2", "uuid_len": 0, "uuid": "", "crc-packet": "c935", "crc-calculated": "c935" }
摘要包含解码统计数据和飞行路径。在mini2_sm
示例中,无人机尚未锁定 GPS 坐标,仅传输智能手机的位置:
$ ./src/droneid_receiver_offline.py -i samples/mini2_sm
… … …
Frame detection: 10 candidates
Decoder: 9 total, CRC OK: 7 (2 CRC errors)
Drone Coordinates:
App Coordinates:
(51.447176178716916, 7.266528392911369)
(51.447176178716916, 7.266528392911369)
…
(51.447176178716916, 7.266528392911369)
对于samples/mavic_air_2
两个位置都被传输:
$ ./src/droneid_receiver_offline.py -i samples/mavic_air_2
…
Decoder: 1 total, CRC OK: 1 (0 CRC errors)
Drone Coordinates:
(51.44633393111904, 7.26721594197086, 12.8)
App Coordinates:
(51.44620788045814, 7.267101350460944)
实时接收器还需要 UHD 驱动程序和功能强大的机器(用于在 50 MHz 带宽下捕获)。
环境:
首先,设置Python环境。由于 UHD 驱动程序,这不适用于虚拟环境。如果您之前激活了虚拟环境,请先退出该环境。安装 Python 要求:
pip3 install -r requirements.txt
安装超高清:
sudo apt install libuhd-dev uhd-host python3-uhd
运行接收器:
./src/droneid_receiver_live.py
接收器将跳转频率列表,如果检测到无人机,则锁定该频段。
如果您正在寻找更深入的处理步骤,我们建议使用调用离线解码器
--debug
。这将启用带有逐步解码的GUI 。
./src/droneid_receiver_offline.py -i samples/mini2_sm --debug
首先,该类SpectrumCapture
执行数据包检测并将捕获文件拆分为单独的帧:
Packet #0, start 0.000076, end 0.000721, length 0.000644, cfo -12207.031250
Packet #1, start 0.000811, end 0.001456, length 0.000644, cfo 0.000000
Packet #2, start 0.001546, end 0.002191, length 0.000644, cfo 0.000000
…
其中一些数据包是误报,我们预计解码不会成功。开始和结束以秒为单位,因此您可以使用 inspectrum 查看单个帧。
接下来,该类Packet
检测 Zadoff-Chu 序列并执行时间和频率偏移校正。它将帧拆分为单独的 OFDM 符号。
FFO: -6546.528614
Found ZC sequences: 600 147
ZC Offset: -2.867868
该类Decoder
获取 OFDM 符号并使用 QPSK 解调子载波。我们不知道这里的 QPSK 方向,因此,我们只是暴力破解方向。decoder.magic()
执行解扰和涡轮解码。
DroneIDPacket
将生成的比特流解压缩到 Drone-ID 结构中。此时消息可以解码,但可能已损坏(需要 CRC 检查)。
通过查看序列号很容易发现 CRC 校验失败(应该读作“SecureStorage?”):
"serial_number": "Sa#upeStore&q?\u0010\b",
…
"crc-packet": "d985",
"crc-calculated": "9b01"
}
CRC Check FAILED!
最后,我们打印一些统计数据:
Successfully decoded 14 / 34 packets
4 Packets with CRC error
所以我们总共解码了 18 个数据包,其中 14 个具有正确的 CRC。同样,这是预期的,因为示例文件包含质量差异很大的无人机 ID 帧。
DJI 的 Drone-ID 是否与基于蓝牙或 WiFi 的标准化“远程 ID”相同?
不可以。DJI 为其 Drone-ID 使用专用无线协议,因此需要实施接收器。
我可以用这个软件定位其他厂商的无人机吗?
不可以。此软件解码 DJI 特定协议。它不适用于 WiFi 或基于蓝牙的“远程 ID”。
没有这个软件能定位无人机吗?
或许。自 2022 年底以来,美国或欧盟开始要求无人机制造商实施“无人机远程 ID”——一种在 WiFi 或蓝牙之上运行的国际标准。您可以使用智能手机应用程序来定位支持该标准的无人机。新的无人机已经具备基于 WiFi/蓝牙的“远程 ID”功能,并且现有的无人机正在逐步改装(例如,通过固件更新)。
我在哪里可以找到有关基于 WiFi/蓝牙的远程 ID 的更多信息?
欧盟标准文件:EN 4709,美国:ASTM F3411。有关实用信息,请查看美国联邦航空局的此页面。如果您正在寻找开源实现(例如,Android 应用程序),我们建议您使用opendroneid.org及其Github 存储库。
您是要改进接收器、引入新功能还是移植到另一个 SDR?
我们目前不打算包含新功能。该工具在我们的学术论文中作为工件提供,使研究人员能够重现我们的结果,并帮助研究隐私影响。它不适用于高效、可靠的无人机定位。
您的接收器是唯一可用的接收器吗?
不是。proto17/dji_droneid中的代码是并行开发的。我们认为它很棒,如果您对细节感兴趣,您应该看看这两个实现。
如果您想引用我们的工作,请使用以下 BibTex 条目:
@inproceedings{schiller2023drone,
title={Drone Security and the Mysterious Case of DJI's DroneID},
author={Schiller, Nico and Chlosta, Merlin and Schloegel, Moritz and Bars, Nils and Eisenhofer, Thorsten and Scharnowski, Tobias and Domke, Felix and Sch{\"o}nherr, Lea and Holz, Thorsten},
booktitle={Network and Distributed System Security Symposium (NDSS)},
year={2023}
}