DCS-WORLD 数据获取
任务:
获取DCS-World的姿态数据,发送到6自由度平台。
过程:
1.获取dcs-bios
https://github.com/DCSFlightpanels/dcs-bios
2.复制DCS-BIOS文件夹和Export.lua放到游戏指定位置:
用户/保存的游戏/DCS/Scripts/
3.根据数据输出协议获取数据。
以下部分翻译自 https://github.com/DCSFlightpanels/dcs-bios/blob/master/Scripts/DCS-BIOS/doc/developerguide.adoc
1.数据输出
驾驶舱当前状态使用二进制协议从 DCS 导出(参见下方 DCS-BIOS 导出协议)。此数据通过 UDP 发送到多播地址 239.255.50.10,环回接口 (127.0.0.1) 上的端口 5010。
如果不能或不想处理多播 UDP,您也可以通过编辑 BIOSConfig.lua 使 DCS-BIOS 将导出数据流的副本发送到单播地址。
还可以使用 socat 程序将串行端口连接到 DCS-BIOS 导入和导出流。
另一种方法是打开到端口 7778 的 TCP 连接。可以使用此连接向 DCS-BIOS 发送命令并接收导出数据。
2.DCS-BIOS 导出协议
每个驾驶舱状态都被编码为整数或字符串,并在 16 位地址空间内分配一个地址。
(1)整数值
整数值的位置由一个 16 位字地址定义,该地址指定数据所在的 16 位字的开始,一个 16 位掩码指定该字中的哪些位属于该值,以及一个移位值(也可以从掩码中推导出来)。
给定起始地址、掩码和移位值,以下伪 C 代码解码一个值:
char[] state;
unsigned int value = (((uint16_t*)state)[start_address/2] & mask) >> shift
对状态数据的更改被编码为对该地址空间的写访问,并以下列格式写入导出数据流:
<起始地址(16位)> <数据长度(16位)>数据
起始地址和数据长度总是偶数(在内部,DCS-BIOS 将数据视为 16 位整数列表)。这确保没有写访问部分更新整数值(整数可能占用不超过 16 位)。
所有整数值都以 litte-endian 字节顺序写入。
以下字节序列是从地址 0x1000 开始的四个字节的写访问示例:
0x00 0x10 0x04 0x00 0x41 0x2d 0x31 0x30
(2)字符串值
字符串的位置由它的 16 位起始地址和以字节为单位的长度定义(所有字符串值都有一个固定的最大长度,并且从 16 位对齐的地址开始)。
可以部分更新最大长度大于两个字符的字符串值。为避免不一致的中间状态,接收 DCS-BIOS 导出数据的应用程序应在下一个帧同步序列中应用对字符串值的更改(参见下一节)。
(3)同步顺序
DCS-BIOS 尝试每秒发送 30 次更新。
DCS-BIOS 将在每次更新开始时发送四个字节 0x55 0x55 0x55 0x55。如果字节序列 0x55 0x55 0x55 0x55 出现在单个写入访问中,DCS-BIOS 将通过将其分成两个单独的写入来避免这种情况。
3. 添加新的飞机模块
DCS-BIOS 中的导出模块。DCS-BIOS 包含几个导出模块,每个导出模块分配给一架或多架飞机,可以同时激活多个导出模块。
MetadataStart 和 MetadataEnd 模块始终处于活动状态,即使没有活动的飞机(例如,多人游戏中的旁观者模式)。
当 AircraftList.lua 中的任何飞机处于活动状态时,CommonData 模块始终处于活动状态。它导出高度、位置和航向等通用信息。
每个导出模块都在 lib 子目录中自己的文件中定义。
每个导出模块都由 BIOS.lua 中的 dofile(...) 行加载。
每个导出模块都需要 control-reference.html 中的 <script> 标记以显示在控件参考文档中。