Ardupliot飞控PID等参数加密屏蔽方法(针对Mission Planner的刷新参数等功能)

当辛辛苦苦调试OK的参数,被别人连上飞地面站后轻松获取,是不是有点难受?本文针对四旋翼Copter4.0.7和(4.1.5)最新版本调试了两个加密方法。

4.0.7固件

在对4.0.7版本的加密过程中,主要参考了MAVLINK消息在Ardupilot中的接收和发送过程并结合MAVLINK协议定位了源码的位置。

调试原理:通过飞控与地面站之间的MAVLINK传输协议中的msgid进行代码的定位。
调试方法:通过在源码中添加send_text函数在Mission Planner对关键信息进行打印。

通过解析,有两种思路对参数进行屏蔽:

  • 1.改飞控的接受参数:在GCS_Param.cpp中,改存数据(handle_common_message()(GCS_Common.cpp)->handle_common_param_message() -> handle_param_request_list()函数中)
  • 2.改飞控的发送参数:在GCS_Common.cpp文件中,try_send_message()函数中通过对message_id进行switch-case判断跳转至在GCS_Param.cpp中的queued_param_send()函数中对改好的数据结构进行发送
  • 在源码中,飞控的接受函数的msg.msgid(MAVLINK_MSG_ID_PARAM_REQUEST_LIST)是通过memcpy函数将参数列表进行复制,如下图所示。
    在这里插入图片描述
    而飞控的发送函数中,根据调试打印的messageId(MSG_NEXT_PARAM)定位到GCS_Param.cpp中的GCS_MAVLINK::queued_param_send()函数
    在这里插入图片描述
    关键的发送参数信息定位到71~91行
    在这里插入图片描述
    内联函数mavlink_msg_param_value_send()中的
    param_name
    即为MP中的参数名字;
    _queued_parameter->cast_to_float(_queued_parameter_type)为将参数强转为浮点型后输出。如果屏蔽所有参数只需将该参数改为float(0)即可,如下图所示。
    在这里插入图片描述
    效果如下图所示。
    在这里插入图片描述
    如果对参数进行部分屏蔽,可以通过if-else分支判断结构对param_name进行字符串对比(strcmp)后执行。

----------------------------------------------------------------------分割线------------------------------------------------------------------------------

4.1.5固件

在4.1.5中使用4.0.7同样的方法修改后却不能奏效。

观察发现,新版本的固件在MP中表现之一为刷新参数速度跟之前版本比快很多,不需要挨个参数进行读取。
交流后得知,不同版本的MP会对该修改有不同的表现,如1.3.74的表现为第一次连接飞控后可读出参数,点击“刷新参数”后所有参数变为0;1.3.76版本则一直可读出参数。因此作者选择将MP更新至最新版本后统一查找问题原因。毕竟最新版飞控固件应该是和最新版上位机MP配套使用的~

Latest版本在按下“刷新参数”按键后,弹出的对话框中的内容如下图所示,出现了一个@PARAM/param.pck,意思是表示从该文件中获取参数。
在这里插入图片描述
在VSCode中对该工程中进行搜索该参数,如下图所示。
在这里插入图片描述
可以知道,新版固件文件系统提供了一个@PARAM.pck文件。是完整参数列表的压缩,通过该接口下载完整的参数列表比使用传统的MAVLINK参数消息快得多。
在这里插入图片描述
屏蔽掉"param.pck"文件的查找,直接返回false,程序会随即去调用4.0.7版本中的queued_param_send()函数去逐个读取参数,如上图所示。
如下图所示,屏蔽其他有效传输参数的代码同样可以实现效果。

在这里插入图片描述

如果想保持快速读取参数的同时屏蔽参数,需要在具体的文件写入或参数读取时对数组(replay.data等)进行字节分辨,改变具体的参数所在字节。

猜你喜欢

转载自blog.csdn.net/Sky777wdnmd/article/details/124615669
今日推荐