4个版本
0.1.21 | 2024年2月1日 |
---|---|
0.1.20 | 2023年11月29日 |
0.1.18 | 2023年11月23日 |
0.1.17 | 2023年8月25日 |
#405 in 网络编程
每月21次下载
145KB
3.5K SLoC
FSD消息
什么是FSD?
FSD(飞行模拟守护进程)协议用于通过TCP连接在飞行员/ATC客户端软件和FSD服务器之间进行通信。它自90年代以来一直存在,至今仍在广泛使用。
在线可用的最早版本的FSD服务器是这个,由Marty Bochane编写。它是开源的,有些人私下编译并运行了这个软件的实例——通常是虚拟飞行小组。
VATSIM和IVAO也使用FSD协议,但他们各自与Marty Bochane服务器使用的协议版本有很大差异,以至于这三个“方言”彼此不兼容。尽管如此,有一些客户端,即EuroScope和Swift,实现了传统的FSD协议和现代的VATSIM版本,因此它们可以同时连接到VATSIM和私人FSD服务器。
FSD协议是什么样子?
每条消息都以一个前缀开始,用于标识消息类型,随后是冒号分隔的变量数量字段。例如
$CQEHAM_GND:@94835:WH:KLM167
&CQ
- 这表示消息是客户端查询。
EHAM_GND
- 发送消息的站的呼号。
@94835
- 这实际上是如何编码无线电频率的。这将代表194.835。你们当中的一些人可能会注意到这远远超出了空中频带的范围——这是一个“特殊”频率,由客户端用来传递有关飞机的信息。
WH
- 这表示这是一个“谁有”请求 - 控制器客户端向区域内的所有其他控制器客户端发送消息,询问他们是否假定拥有该飞机。
KLM123
- 这是控制器客户端询问的飞机。
这个软件包的作用是什么?
目前,这个软件包只支持VATSIM版本的FSD协议。将来,它还将支持旧版FSD数据包以及IVAΟ数据包。
- 识别字符串是否是有效的FSD协议消息,并识别其类型
- 将其反序列化为结构体,以便您可以处理其中的信息
- 将结构体序列化为有效、经过验证的FSD消息字符串
示例
// Imagine this is a message we have received from an FSD server
let message_text = String::from("$CQEHAM_GND:@94835:WH:KLM167");
// We can identify what type of message it is, deserialise it
let message_deserialised = fsd_messages::parse(&message_text).unwrap();
if let FsdMessage::ClientQueryMessage(client_query_message) = message_deserialised {
// And access its data
assert_eq!("EHAM_GND", client_query_message.from.as_str());
assert_eq!("@94835", client_query_message.to.as_str());
if let ClientQueryType::WhoHas(aircraft) = client_query_message.query_type {
assert_eq!("KLM367", aircraft.as_str());
}
// Plus, on the flip side, we can create our own messages and serialise them
let new_message = messages::ClientQuery::message::who_has("LIRF_TWR", "@94835", "ITA1561");
assert_eq!(String::from("$CQLIRF_TWR:@94835:WH:ITA1561"), new_message.to_string());
}
免责声明
尝试使用未经批准使用的客户端软件连接到VATSIM服务器违反了VATSIM的《行为准则》(Code of Conduct)和《用户协议》(User Agreement)。
当然,您完全有权使用这个软件包来编写连接到私人FSD服务器的客户端。
如果您确实从VATSIM获得了使用自己的客户端软件连接的许可并决定使用此软件包,您有责任检查它是否确实符合VATSIM FSD协议。
依赖关系
~0.7–1.6MB
~35K SLoC