协议引擎开发
注意
VOFA+ beta 使用Qt5.14.2开发,windows版本使用MSVC2017编译器,请使用同样的环境编译插件。
- Qt下载地址:Qt5.14.2
- 协议引擎开源地址:https://gitee.com/gutega/Vodka/tree/master/dataengines/
- 开发自己的协议引擎时,建议基于已开源代码的项目结构进行修改。
调试方法
- 运行DebugView之后,再运行VOFA+,可以在DebugView中查看到VOFA+打印的调试信息;
- 下载地址:DebugView
- 在协议代码中,运行qDebug("你的调试信息"),可以打印调试信息,也可以打印软件本身运行错误的信息。
协议引擎是如何工作的?
VOFA+使用协议引擎进行数据解析的流程如下:
接口的详细说明
DataEngineInterface接口类
所有协议引擎都继承自DataEngineInterface接口。
- 虚函数ProcessingDatas - VOFA+接收到字节数据时,会调用此函数;
- data - 所有未解析数据的缓冲区;
- count - 缓冲区字节数。
- frame_list_ - 记录每一帧协议数据的帧头、帧尾位置,从协议中解析出的采样数据等,调用ProcessingDatas函数之后,VOFA+通过调用frame_list()函数获取解析结果;
- image_channels_ - 记录协议中解析出的图片通道,调用ProcessingDatas函数之后,VOFA+通过调用image_channels()函数获取解析结果。
Frame结构体
DataEngineInterface接口中,维护着一个Frame链表。
Frame记录着一帧协议数据的信息,VOFA+依据这个信息,更新采样数据,更新缓冲区,打印文本。
- start_index_ - 帧头在缓冲区的偏移;
- end_index_ - 帧尾在缓冲区的偏移;
- image_size_ - 图片尺寸;
- 如果>0,这是一个图片数据包;
- 如果<=0,这是一个采样数据包或其他数据包。
- datas_ - 当前帧解析出的采样数据;
- is_valid_ - 是否是合法的数据包,这决定了文本区的对此帧的打印行为;
- 如果为true,文本区勾选隐藏采样数据包时,此帧不打印;
- 如果为false,文本区只有勾选隐藏所有数据时,此帧不打印。
RawImage类
DataEngineInterface接口中,维护着一个RawImage链表。
记录这图片的原始数据、格式、长宽等信息,VOFA+依据这个类,可以解码出一张图片。
- data_ - 图片数据;
- format_ - 图片格式;
- length_ - 图片尺寸;
- width_ - 图片宽度;
- height_ - 图片高度;
- updated_ - 是否已更新;
- 调用完ProcessingDatas,VOFA+会检查图片是否已更新,已更新的图片才会刷新到图片控件。
实例讲解
本章节只讲解RawData、FireWater,其他协议大同小异,源码中有详细注释。
RawData
协议特点:RawData
项目地址:https://gitee.com/gutega/Vodka/tree/master/dataengines/rawdata
- 头文件:rawdata.h
以下3行代码是必须的,因为协议名称为
RawData
,所以Q_PLUGIN_METADATA设置了IID为VOFA+.Plugin.RawData
。当你编写自己的协议引擎时吗,把RawData
修改成你的协议名字。Q_OBJECTQ_INTERFACES(DataEngineInterface)Q_PLUGIN_METADATA(IID "VOFA+.Plugin.RawData")
- 源码文件:rawdata.cpp
- 在构造函数中,给
frame_list_
(继承自DataEngineInterface的成员变量)添加一帧数据,并且将其指针赋予RawData的私有成员frame_
;- RawData协议中,每次都把整个缓冲区包裹成一帧,并且通过
frame_->is_valid_ = false;
,将其标记为其他协议包。
FireWater
协议特点:FireWater
项目地址:https://gitee.com/gutega/Vodka/tree/master/dataengines/firewater
- 头文件:firewater.h
以下3行代码是必须的,因为协议名称为
FireWater
,所以Q_PLUGIN_METADATA设置了IID为VOFA+.Plugin.FireWater
。当你编写自己的协议引擎时吗,把FireWater
修改成你的协议名字。Q_OBJECTQ_INTERFACES(DataEngineInterface)Q_PLUGIN_METADATA(IID "VOFA+.Plugin.RawData")
- 源码文件:firewater.cpp
- 每次调用
ProcessingDatas
,都先将帧链表清空:frame_list_.clear();
- 使用
\n
识别帧尾,使用:
分割数据,判断协议为采样数据包、图片数据包还是其他数据包;- 将每一帧解析出的采样数据,填入
frame.datas_
,将frame
的其他信息填写准确后,插到frame_list_
尾部;- 将解析出的图片刷新到
image_channels_
链表的第id个位置。
如何编译?
安装Qt5.13.2
Qt下载地址:Qt5.13.2
- 安装的时候需要一个登录Qt的账号和密码,直接上Qt官网注册即可;
- 只需要安装MSVC2017版本的Qt和QtCreator,其他组件不需要安装,这样能保证Qt安装体积最小;
- 根据你使用的软件版本,选择32位或者64位。
下载VOFA+协议引擎源码并编译
源码仓库:https://gitee.com/je0000/Vodka
协议引擎位于dataengines目录,每个协议为单独的qt项目。
用QtCreator打开.pro工程,选择Release构建模式。
点击构建即可生成动态链接文件,文件一般位于dataengines/build-xxxx...-release/release