24 位消息 ID - 在方言中允许超过 1600 万个唯一消息定义(MAVLink 1 限制为 256)
数据包签名 - 验证消息是由可信系统发送的。
消息扩展 - 将新字段添加到现有 MAVLink 消息定义中,而不会破坏尚未更新的接收器的二进制兼容性。
空字节有效载荷截断 - 序列化有效载荷末尾的空(零填充)字节必须在发送前删除(所有字节都在 MAVLink 1 中发送,无论内容如何)。
兼容性标志 / 不兼容标志 - 通过指示必须以特殊 / 非标准方式处理的帧(具有兼容性标志的数据包仍然可以以标准方式处理,而具有不兼容标志的数据包必须如果不支持标志则丢弃)。
MAVLink2.0 报文格式为:
STX: 表示 MAVLink 帧开头的符号,在 mavlink2.0 中为 0xfd
LEN: 消息长度,编码为 1 字节
INC FLAGS: 此标志位会影响报文的结构,该标志指示数据包是否包含一些特殊功能。例如标志等于 0x01 表示该数据包已签名,并且在数据包的末尾附加了签名
CMP FLAGS: 不影响报文的结构,即使无法解释标志,也不会阻止解析器处理消息;
SEQ: 消息顺序号,编码为 1 字节,取值范围为 0 至 255
SYS ID: SYS 表示系统 ID,每个无人系统应该有一个唯一的系统 ID,通常将系统 ID 255 分配给地面站
COMP ID: COMPONENT ID 标识发送消息的系统组件,MAVLink 1.0 中有 27 种硬件类型可供选择。
MSG ID: MSGID 指定了载荷中嵌入的消息类型。消息 ID 在旧协议中是 8 位编码,而在新协议中是 24 位编码。这允许 MAVLink 2.0 协议中有更多的消息类型,最多达到 16777215 种可能性。
PAYLOAD: 位于 MSG ID 后面,载荷字段可以容纳多达 255 个字节的数据,具体取决于消息类型。
CHECKSUM: 最后两个字节是用于校验的循环冗余检查(CRC)值。整个过程可以保证消息传输过程中没有被更改,并确保发送方和接收方都具有相同的消息。
SIGNATURE: 签名。它是由 6 个字节编码的消息签名,根据完整的消息、时间戳和秘密密钥计算而来。
我们将 MAVLink 消息分为两类:状态消息和命令消息。状态消息是从无人系统发送到地面站的消息,包含有关系统状态的信息,例如其 ID、位置、速度和高度。命令消息是由地面站(或用户程序)发送给无人系统以执行某些操作或由自动驾驶执行某些任务。例如,地面站可以向无人机发送命令以起飞、降落、前往航点甚至执行带有多个航点的任务。
MAVLink 2.0 使用一个可选的 13 个字节的签名字段来确保链接是防篡改的,从而显着提高了协议的安全性。如果不兼容性标志设置为 0x01,则会附加消息的签名,以确保数据源可信。
signature 包含三部分:
LinkID,它表示用于发送数据包的链接(通道)的 ID。链接或通道可以是 WiFi 或遥测,并且可以组合使用。每个用于发送数据的通道都应该有自己的 LinkID,它提供了一种使用 MAVLink 2.0 进行多通道无人系统控制的手段。
时间戳(timestamp),它是以 10 微秒为单位编码的 6 个字节,表示自 2015 年 1 月 1 日 GMT 以来的时间。每发送一条消息,时间戳就会增加。对于每个流,时间戳被应用于元组(SystemID、ComponentID、LinkID)来定义,其中流指的是通过同一个通道传输的消息序列。时间戳用于防止重复播放攻击。
签名字段(signature),它是由 6 个字节编码的消息签名,根据完整的消息、时间戳和秘密密钥计算而来。签名包括应用于 MAVLink 2.0 消息(不包括签名,但包括时间戳)的 SHA-256 哈希的前 6 个字节(48 位)。秘密密钥是一个 32 字节的共享对称密钥,存储在自动驾驶仪、地面站或 MAVLink API 的两端。通过这种方式,可以确保消息的完整性,以及它来自于受信任的来源。
MAVLink 2.0 消息的签名对如何处理传入的 MAVLink 消息产生的影响。
如果消息已经签名,那么会出现以下情况:
(i) 接收到的消息的时间戳比之前从相同流(由(SystemID、ComponentID、LinkID)元组标识)接收到的包要旧,则被丢弃;
(ii) 接收时计算得到的签名与附加在消息上的签名不同,则可能暗示着消息中的数据被篡改;
(iii) 与本地系统时间戳相比,时间戳超过一分钟。如果消息未签名,则接受 / 拒绝数据包的决定是实现特定的。
本文主要记录问题,快速配置建议直接转到《Ardupilot 环境配置 (二)》
Ardpilot 介绍:ArduPilot 通过多种传感器的数据(GPS、加速度计、气压计、磁场计)等来估计飞行器的姿态,从而使飞行器能够保持稳定。被称为 APM 的飞控硬件,其实全称就是 Ardu Pilot Mega,但是 2013 年后,这个系列的飞控硬件改名为 Pixhawk,ArduPilot 只用来指特定的飞控软件,但是约定俗称地也可以用 APM 来指 ArduPilot。ArduPilot 含有超过七十万条代码,所以很幸运我们不用自己去写飞控代码,直接用就可以了,大大降低了入门门槛。
因为需要 git 等命令,本次配置在 clash 的 TUN 模式下进行 (使虚拟机能访问外网)
本文参考的文章为 https://zhuanlan.zhihu.com/p/61616055 但是文章中部分问题笔者没有遇到,笔者同样遇到了文章中没有提到的问题,详细内容见下文所述。
git clone https://github.com/ArduPilot/ardupilot
cd ardupilot
git submodule update --init --recursive
通过
git clone https://github.com/ArduPilot/ardupilot
下载好的 ardupilot 文件最好手动找一下目录
2. 没啥说的,直接运行
3. 笔者在此处安装的时候出现了各种报错,以及安装不完全的情况,之后经过乱七八糟的搜索和运行乱七八糟的命令莫名其妙安装好了。
此部分需要运行 install-prereqs-ubuntu.sh 文件,笔者为手动运行 (和参考文章不同)。
笔者遇到的问题:
笔者试过了 chattr 方法,不奏效,原因未知,最后解决办法如下:
笔者 Ubuntu (20.04) 的 install-prereqs-ubuntu.sh 环境安装目录为 /ardupilot/Tools/environment_install,手动找到改文件运行即可。
收到进入 environment 目录,打开终端,输入
./install-prereqs-ubuntu.sh -y
成功,正确回显如下:
经验证可用:
此部分需要等很多个小时,可以在本机下载:https://github.com/ilg-archived/arm-none-eabi-gcc
然后拖入虚拟机的 /opt 目录下,会节省很多时间。
同样需要看当前目录在哪
ardupilot/Tools/environment_install/install-prereqs-ubuntu.sh -y
. ~/.profile
到此 Ardupilot 环境已经搭配好。
正确回显如下:
全程需要保持 clash 的 TUN 模式下!!!!!!
只需要命令行即可完成:
git clone https://github.com/ArduPilot/ardupilot
cd ardupilot
git submodule update --init --recursive
Tools/environment_install/install-prereqs-ubuntu.sh -y
. ~/.profile
cd ~/ardupilot/ArduCopter
../Tools/autotest/sim_vehicle.py --map --console
耐心等待,出现下图即为成功标志:
启动界面:
全程截图如下:
ls 打错了,忽略 lls:
启动:
cd ~/ardupilot/ArduCopter
../Tools/autotest/sim_vehicle.py --map --console
慢慢等,启动仿真环境,整体如图所示:
1.使用默认参数文件../Tools/autotest/default_params/copter.parm,启动ArduCopter模拟器,并记录启动日志;
2.启动MavProxy,将通信输出到127.0.0.1:14550端口,同时使用tcp:127.0.0.1:5760作为主机连接地址进行通信;
3.当前程序连接到主机的5760端口,并等待来自主机的心跳信号;
4.检测到连接的无人机编号为1,连通性正常;
5.接收到1339个参数设置信息,并将这些信息保存到mav.parm文件中。
可以观察到无人机的实时位置
控制台,可以看到无人机的实时状态
是ArduCopter程序的启动日志。根据日志内容,可以看到程序将模拟速度设置为1.0,并提示推荐的EK3_DRAG_BCOEF和EK3_DRAG_MCOEF参数值。接着,程序启动了sketch 'ArduCopter',开始初始化SITL输入,并使用端口号9005连接Irlock。然后程序绑定了三个端口:5760、5762和5763,分别用于串行通信和TCP/IP通信。程序从../Tools/autotest/default_params/copter.parm读取默认参数文件,并输出无人机的起飞位置和朝向信息。最后,程序验证了结构体的有效性。
虚拟机首先应为桥接模式。
关闭 winodws 主机和 ubuntu 虚拟机的防火墙,保证两者能 ping 通
查询 windows 主机 ip 地址:
查询仿真无人机 ip 地址:
192.168.56.139
再确认能够相互 ping 通。
关键一步:
在虚拟无人机终端加入
output add 主机ip:14552
然后在地面站 (笔者用的 mission planner) 的连接配置中,添加连接类行为 UDP, 目标主机地址为虚拟机中有线网络地址 192.168.xx.xx, 填写和刚刚对应的端口号,我这里是 14552 。然后创建连接
连接成功,笔者这边显示有些问题,但是是连接成功的。
可以看到,mission planner 设定的路径和 map 上显示相对应
https://zhuanlan.zhihu.com/p/368471044
简要过程如图,最后对无人机右键 Take off,之后进行想要的操作就可以啦。
注意第一步里面要先设置 'Guide' 模式
注意,无人机起飞状态下会电池耗尽,在状态栏里面可以看到电量剩余,电量耗尽落地重新起飞就好。
mission planner 官方文档
https://ardupilot.org/planner/docs/mission-planner-overview.html
今天先到这,明天将给大家带来基于mavlink协议的无人机进行攻击,另外我们还在纳新,有意向的请看这篇文章:纳新