关于mavlink协议及环境配置

新闻资讯   2023-07-21 08:39   119   0  


MAVLink2.0 协议介绍

MAVLink 2 的主要新特性是:
  • 24 位消息 ID - 在方言中允许超过 1600 万个唯一消息定义(MAVLink 1 限制为 256)

  • 数据包签名 - 验证消息是由可信系统发送的。

  • 消息扩展 - 将新字段添加到现有 MAVLink 消息定义中,而不会破坏尚未更新的接收器的二进制兼容性。

  • 空字节有效载荷截断 - 序列化有效载荷末尾的空(零填充)字节必须在发送前删除(所有字节都在 MAVLink 1 中发送,无论内容如何)。

  • 兼容性标志 / 不兼容标志 - 通过指示必须以特殊 / 非标准方式处理的帧(具有兼容性标志的数据包仍然可以以标准方式处理,而具有不兼容标志的数据包必须如果不支持标志则丢弃)。


MAVLink2.0 报文格式为:

STX: 表示 MAVLink 帧开头的符号,在 mavlink2.0 中为 0xfdLEN: 消息长度,编码为 1 字节INC FLAGS: 此标志位会影响报文的结构,该标志指示数据包是否包含一些特殊功能。例如标志等于 0x01 表示该数据包已签名,并且在数据包的末尾附加了签名CMP FLAGS: 不影响报文的结构,即使无法解释标志,也不会阻止解析器处理消息;SEQ: 消息顺序号,编码为 1 字节,取值范围为 0 至 255SYS 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、位置、速度和高度。命令消息是由地面站(或用户程序)发送给无人系统以执行某些操作或由自动驾驶执行某些任务。例如,地面站可以向无人机发送命令以起飞、降落、前往航点甚至执行带有多个航点的任务。

SIGNATURE:

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) 与本地系统时间戳相比,时间戳超过一分钟。如果消息未签名,则接受 / 拒绝数据包的决定是实现特定的。


Reference:

https://mavlink.io/en/guide/mavlink_2.html MAVLink 2
Micro Air Vehicle Link (MAVlink) in aNutshell: A Survey
https://mavlink.io/en/ MAVLink 开发者指南


Ardupilot 环境配置 (一)


本文主要记录问题,快速配置建议直接转到《Ardupilot 环境配置 (二)》

Ardpilot 介绍:ArduPilot 通过多种传感器的数据(GPS、加速度计、气压计、磁场计)等来估计飞行器的姿态,从而使飞行器能够保持稳定。被称为 APM 的飞控硬件,其实全称就是 Ardu Pilot Mega,但是 2013 年后,这个系列的飞控硬件改名为 Pixhawk,ArduPilot 只用来指特定的飞控软件,但是约定俗称地也可以用 APM 来指 ArduPilot。ArduPilot 含有超过七十万条代码,所以很幸运我们不用自己去写飞控代码,直接用就可以了,大大降低了入门门槛。
  • 因为需要 git 等命令,本次配置在 clash 的 TUN 模式下进行 (使虚拟机能访问外网)

  • 本文参考的文章为 https://zhuanlan.zhihu.com/p/61616055 但是文章中部分问题笔者没有遇到,笔者同样遇到了文章中没有提到的问题,详细内容见下文所述。

安装:

  1. 安装 ardupilot 文件


git clone https://github.com/ArduPilot/ardupilot

cd ardupilot

git submodule update --init --recursive
  1. 通过

git clone https://github.com/ArduPilot/ardupilot

载好的 ardupilot 文件最好手动找一下目录

2. 没啥说的,直接运行

3. 笔者在此处安装的时候出现了各种报错,以及安装不完全的情况,之后经过乱七八糟的搜索和运行乱七八糟的命令莫名其妙安装好了。

2. 运行.sh 文件

此部分需要运行 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 目录下,会节省很多时间。

3. 配置路径

同样需要看当前目录在哪


ardupilot/Tools/environment_install/install-prereqs-ubuntu.sh -y

. ~/.profile

到此 Ardupilot 环境已经搭配好。

正确回显如下:

Reference

https://zhuanlan.zhihu.com/p/61616055
https://blog.csdn.net/weixin_44747240/article/details/104497893
https://www.cnblogs.com/wind-under-the-wing/p/14122985.html


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:

Ardupilot 仿真环境说明


参考
https://blog.csdn.net/weixin_44747240/article/details/104497893


启动:


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。然后程序绑定了三个端口:576057625763,分别用于串行通信和TCP/IP通信。程序从../Tools/autotest/default_params/copter.parm读取默认参数文件,并输出无人机的起飞位置和朝向信息。最后,程序验证了结构体的有效性。

mission planner 与 ardupilot 连接教程

虚拟机首先应为桥接模式。

关闭 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 上显示相对应

Reference

https://zhuanlan.zhihu.com/p/368471044

mission planner 控制 ardupilot

简要过程如图,最后对无人机右键 Take off,之后进行想要的操作就可以啦。

注意第一步里面要先设置 'Guide' 模式

注意,无人机起飞状态下会电池耗尽,在状态栏里面可以看到电量剩余,电量耗尽落地重新起飞就好。

附:

mission planner 官方文档

https://ardupilot.org/planner/docs/mission-planner-overview.html


今天先到这,明天将给大家带来基于mavlink协议的无人机进行攻击,另外我们还在纳新,有意向的请看这篇文章:纳新



文章引用微信公众号"白帽100安全攻防实验室",如有侵权,请联系管理员删除!

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。