当前位置: 首页 > news >正文

[无人机sdk] Open Protocol | 协议包构造验证

第八章:开放协议(Open Protocol)

在第七章:链路器中,我们了解到链路器是连接应用与DJI无人机的关键信使

但信使需要一种特定的"语言"来沟通——这就是开放协议(Open Protocol),它是链路器与无人机飞控通信的标准化语言

什么是开放协议?(无人机的母语)

将DJI无人机视为使用独特语言的智能机器

开放协议就是这种飞控系统的原生语言,定义了信息打包与交换的精确规则:

为什么需要开放协议?

可靠的通信协议至关重要:

  • 准确性:确保无人机正确解析每条指令
  • 可靠性:提供错误检测与重传机制
  • 安全性:支持加密防止未授权访问
  • 模块化:标准化通信层使各模块无需了解彼此实现细节

协议数据包核心结构

在这里插入图片描述

每个开放协议数据包都遵循严格格式:

组件描述
帧头(SOF)固定字节0xAA标记数据包起始
包头(Header)包含数据包长度、协议版本、会话ID、ACK标志、加密标志和序列号等元数据
CRC16校验包头校验码,用于验证传输完整性
指令ID由指令集(如飞行控制)和具体指令(如起飞)组成的双字节编码
数据载荷指令相关参数,如起飞高度或航点坐标
加密/填充加密后的数据可能添加填充字节以满足加密块大小要求
CRC32校验完整数据载荷的校验码

相关设计-前文传送:Linux网络实验_lvy-的博客 这部分专栏下有讲到过许多协议的设计

& ProtoBuf | Json_lvy-的博客 这部分专栏 对于数据流协议的使用

如何使用开放协议(间接调用)

开发者通常无需直接操作协议层,SDK已封装所有底层细节。例如:

// 来自第二章:飞行控制
vehicle->flightController->startTakeoffSync(functionTimeout);// 来自第六章:数据订阅
auto gpsData = subscribe->getValue<DJI::OSDK::Telemetry::TOPIC_GPS_FUSED>();

高层API调用会被自动转换为开放协议数据包,经由链路器发送至无人机,响应数据也会被自动解析

底层原理:协议工作流程

通信流程示例(起飞指令)

在这里插入图片描述

核心代码

协议包构造(简化自dji_open_protocol.cpp
uint16_t OpenProtocol::encrypt(uint8_t* pdest, const uint8_t* psrc, uint16_t w_len) {OpenHeader* p_head = (OpenHeader*)pdest;p_head->sof = OpenProtocol::SOF; // 设置帧头p_head->length = data_len;       // 设置包长度p_head->enc = is_enc ? 1 : 0;    // 设置加密标志memcpy(pdest + sizeof(OpenHeader), psrc, w_len); // 填充数据载荷encodeData(p_head, aes256_encrypt_ecb);         // 加密数据calculateCRC(pdest);                            // 计算校验码return data_len;
}
数据包验证(简化自dji_open_protocol.cpp
bool OpenProtocol::verifyData() {OpenHeader* p_head = (OpenHeader*)(p_filter->recvBuf);if (crcTailCheck((uint8_t*)p_head, p_head->length) == 0) {encodeData(p_head, aes256_decrypt_ecb); // 解密数据return callApp(); // 调用应用层处理} else {reuseDataStream(); // 数据损坏时尝试恢复}return false;
}

结论

开放协议是Onboard-SDK与无人机通信的基石,虽然开发者无需直接操作协议层,但理解其帧结构、加密机制和校验流程有助于深入掌握SDK工作原理。

这种标准化协议确保了指令传输的可靠性与安全性

接下来我们将探索SDK如何高效管理协议数据包的内存使用


下一章:内存管理单元(MMU)

http://www.dtcms.com/a/544247.html

相关文章:

  • 【Vscode】解决ssh远程开发时Formatter失效的问题
  • TCP 如何保证传输的可靠性?
  • 亲子娱乐升级!Docker 电视盒子 ADB 安装助手,儿童 APP 一键装满电视
  • Microsoft 365 Copilot 扩展至应用和工作流构建功能
  • 【Latex】本地部署latex+vscode
  • 注册中心(环境隔离、分级模型、Eureka)、远程调用负载均衡、服务保护原理分析
  • 有没有专门做建筑造价的私单网站网站开发风险
  • LSTM模型做二分类(PyTorch实现)
  • Linux 文件变动监控工具:原理、设计与实用指南(C/C++代码实现)
  • 建站之星怎么用做视频解析网站犯法吗
  • LibreTV无广告观影实测:聚合全网资源,远程访问家庭影院新方案!
  • 仓颉中的 UTF-8 编码处理:从 DFA 解码、错误策略到流式与字素迭代的工程实战
  • 【React】打卡笔记,入门学习02:react-router
  • Latex 转 word 在线
  • 【OD刷题笔记】- 可以组成网络的服务器
  • 《算法闯关指南:优选算法--前缀和》--27.寻找数组的中心下标,28.除自身以外数组的乘积
  • linux arm64平台上协议栈发包报文长度溢出导致系统挂死举例
  • 深入理解 Rust `HashMap` 的哈希算法与冲突解决机制
  • 彩票网站开发做一个网站价格
  • 《C++ 继承》三大面向对象编程——继承:派生类构造、多继承、菱形虚拟继承概要
  • 医疗AI白箱编程:从理论到实践指南(代码部分)
  • Spring Cache 多级缓存中 hash 类型 Redis 缓存的自定义实现与核心功能
  • 福州建设人才市场网站山西网站推广
  • Spring Cache 多级缓存中 ZSet 类型 Redis 缓存的自定义实现与核心功能
  • 从开源到落地:SimpleBGC 三轴稳像平台全栈技术解析(上)
  • 51、STM32 与 ESP32 单片机全面对比:架构、性能与应用场景详解
  • NodeJs
  • 【面试题】缓存先删漏洞解决策略(示例代码)
  • 操作系统(7)虚拟内存-缓存工具-页命中和缺页(3)
  • 旧衣回收小程序的技术架构与商业落地:开发者视角的全链路解析