canterbury-air-patrol/flight-safety-system
GitHub: canterbury-air-patrol/flight-safety-system
用于无人机集群安全监控与控制的飞行安全系统
Stars: 0 | Forks: 1
# 飞行安全系统
[](https://github.com/canterbury-air-patrol/flight-safety-system/actions/workflows/c-cpp.yml)
[](https://codecov.io/gh/canterbury-air-patrol/flight-safety-system)
飞行安全系统是一个用于维护无人机的控制系统。
FSS提供了一种向飞机发送基本命令(返回原点、暂停、恢复等)并在监控位置、电池状态和任务进度的同时的方法。
查看[CHANGELOG.md](CHANGELOG.md)以获取变更的完整历史记录。
## 基本设置
### 依赖项
依赖项包括jsoncpp(加载/读取配置)、gnutls/gnutlsxx(用于安全连接)、ecpg(用于服务器)和catch2(用于测试)。
从源代码构建还需要autoconf、automake和libtool来生成构建系统。
在Debian/Ubuntu上:
```
apt install autoconf automake libtool libjsoncpp-dev libgnutls28-dev libecpg-dev catch2
```
### 构建/安装
您可以从源代码构建此软件包:
```
git clone https://github.com/canterbury-air-patrol/flight-safety-system.git
cd flight-safety-system
./autogen.sh
./configure --enable-server
make
make install
```
### 运行服务器
飞行安全系统服务器使用[postgresql](https://www.postgresql.org/)+[postgis](https://postgis.net/)数据库来存储配置、命令和记录历史数据。
[web前端](https://github.com/canterbury-air-patrol/flight-safety-system-web/)是单独的项目,在运行服务器之前需要设置并连接到数据库。
创建一个[server.json](examples/server.json)文件,包含正确的端口和数据库设置。
然后启动服务器:
```
fss-server server.json
```
#### 信号处理
| 信号 | 影响 |
|---------|--------|
| SIGTERM | 优雅关闭 — 停止接受连接,清空写入队列,并干净地退出。与 `systemctl stop` 和 `docker stop` 兼容。 |
| SIGINT | 与SIGTERM相同。 |
| SIGHUP | 重新加载CRL文件(如果已配置)并断开任何当前连接的客户端,这些客户端的证书出现在更新的CRL上。无需重启。 |
### 客户端
飞行安全系统没有附带完整的客户端实现,但是有一个[库](src/fss-client-ssl.hpp)可以使用,以及一个[示例客户端](examples/fake_client.cpp)可以作为起点。
## 冗余
可以通过运行多个独立的服务器来实现冗余;正常的客户端配置允许指定多个要连接的服务器。
每个服务器也可以配置为包含所有已知服务器的列表,并且这些信息定期提供给客户端,以便它们可以自动发现并连接到所有服务器。
## SSL支持
TLS是保护客户端和服务器之间连接所必需的。需要一个共享的CA,以便客户端和服务器可以通过证书相互验证。服务器使用客户端证书的通用名称作为资产标识。
### 生成证书
在`certs`目录中提供了脚本,以帮助生成和签名证书。
生成CA证书:
```
cd certs
./generate-ca.sh
```
将`ca.private.pem`保存在安全的地方 — 它用于签名所有服务器和客户端证书。如果由该CA签名的证书被泄露,您需要撤销它(见下文)或重新创建CA并重新生成所有证书。
为每个服务器生成证书:
```
cd certs
./generate-server.sh server1.my.domain
```
使用客户端将连接到的IP地址或DNS名称。客户端验证服务器是否受信任,并且它们是否连接到了正确的主机。
为每个客户端生成证书:
```
cd certs
./generate-client.sh client-name
```
使用在数据库中注册的客户端名称。服务器将证书CN与资产注册表匹配以验证客户端。
### 证书撤销(CRL)
要撤销证书而不替换CA,请将`crl_file`条目添加到`server.json`:
```
"ssl": {
"ca_public_key": "certs/ca.public.pem",
"server_private_key": "certs/server.private.pem",
"server_public_key": "certs/server.public.pem",
"crl_file": "certs/revoked.crl"
}
```
向正在运行的服务器发送`SIGHUP`以重新加载CRL并立即断开任何证书出现在其上的客户端的连接。无需重启。
## 其他软件
主要设计飞行安全系统与[搜索管理地图](https://github.com/canterbury-air-patrol/search-management-map/)一起运行。
[Canterbury Air Patrol](http://www.canterburyairpatrol.org)有一个[客户端](https://github.com/canterbury-air-patrol/fss-smm-mav),它将飞行安全系统和搜索管理地图集成在一起,以控制运行[ArduPilot](https://www.ardupilot.org)的飞机。
有一个[ADS-B集成](https://github.com/canterbury-air-patrol/fss-adsb/),允许从ADS-B Out飞机转发位置报告到FSS客户端。
## 发布策略
稳定版本是从长期存在的`release/X.Y`分支中切出的。`develop`分支承载着持续的工作,并在准备发布时合并到`release/X.Y`分支。首先将错误修复应用到`develop`分支,然后将其挑选到相关的`release/X.Y`分支,从而产生补丁版本(`X.Y.1`、`X.Y.2`等)。`master`分支始终指向最新的稳定版本。
简而言之:
- `master` — 最新稳定版本
- `release/X.Y` — X.Y线的维护分支;所有X.Y.Z标签的来源
- `develop` — 下一个发布的集成分支
## 许可证
本项目采用GNU GPLv2许可 — 请参阅[LICENSE](LICENSE.md)文件以获取详细信息。
标签:Catch2, C/C++, ECPG, GNUTLS, JSON, PostGIS, PostgreSQL, SIEM, UML, 事务性I/O, 信号处理, 地理信息系统, 安全可观测性, 安全通信, 客户端/服务器系统, 数据记录, 无人机安全, 测试用例, 版本控制, 自动化构建, 飞行控制系统