# drone-message
**Repository Path**: kunker/drone-message
## Basic Information
- **Project Name**: drone-message
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-12-05
- **Last Updated**: 2025-12-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 无人机通信框架 (Drone Message Framework)
一个可扩展的无人机通信框架,支持多平台级联、无人机信息推送与远程控制。框架采用SPI机制设计,使用者通过实现接口来完成具体业务逻辑。
## 核心特性
- 🔌 **SPI扩展机制**:通过实现接口来扩展功能
- 🌐 **多协议支持**:HTTP、WebSocket、TCP、UDP
- 🔗 **多平台级联**:同时连接多个上级平台
- 📤 **灵活推送**:可配置推送周期和推送内容
- 🎮 **远程控制**:接收并执行上级平台的控制指令
- 📡 **事件驱动**:基于Spring Event的事件机制
## 快速开始
### 1. 添加依赖
```xml
com.drone
drone-message
1.0.0-SNAPSHOT
```
### 2. 实现核心接口
#### 2.1 实现无人机数据提供者
```java
@Component
public class MyDroneDataProvider implements DroneDataProvider {
@Autowired
private DroneRepository droneRepository;
@Override
public List getAllDrones() {
return droneRepository.findAll().stream()
.map(this::convertToInfo)
.collect(Collectors.toList());
}
@Override
public Optional getDrone(String droneId) {
return droneRepository.findByDroneId(droneId)
.map(this::convertToInfo);
}
// ... 其他方法
}
```
#### 2.2 实现控制指令执行器
```java
@Component
public class TakeOffExecutor implements CommandExecutor {
@Autowired
private DroneSDK droneSDK;
@Override
public CommandType supportedType() {
return CommandType.TAKE_OFF;
}
@Override
public CommandResult execute(CommandContext context) {
// 调用你的无人机SDK执行起飞
droneSDK.takeOff(context.getDroneId());
return CommandResult.success("起飞成功");
}
@Override
public boolean validate(CommandContext context) {
// 校验无人机是否可以起飞
return context.getDroneInfo().getStatus().getState() == State.IDLE;
}
}
```
### 3. 使用框架API
```java
@Service
public class MyService {
@Autowired
private DroneMessageClient client;
public void setup() {
// 添加上级平台
client.addPlatform(PlatformConfig.builder()
.platformId("command-center")
.name("指挥中心")
.host("192.168.1.100")
.port(8080)
.protocol(ProtocolType.HTTP)
.pushInterval(30) // 30秒推送一次
.build());
// 绑定无人机(选择要推送哪些无人机)
client.bindDrone("command-center", "DRONE-001");
client.bindDrone("command-center", "DRONE-002");
// 连接平台
client.connect("command-center");
}
}
```
## 核心接口说明
### SPI接口
| 接口 | 说明 | 必须实现 |
|------|------|---------|
| `DroneDataProvider` | 无人机数据提供者,框架通过此接口获取无人机信息 | ✅ 是 |
| `CommandExecutor` | 控制指令执行器,实现具体的控制逻辑 | ✅ 是 |
| `MessageHandler` | 消息处理器,处理从上级平台接收的消息 | 否 |
| `ConnectionListener` | 连接监听器,监听平台连接状态变化 | 否 |
| `PlatformAuthenticator` | 平台认证器,自定义认证逻辑 | 否 |
| `DataSerializer` | 数据序列化器,自定义序列化方式 | 否 |
### 支持的指令类型
```java
// 飞行控制
TAKE_OFF, LAND, RETURN_HOME, HOVER, EMERGENCY_STOP
// 航线任务
START_MISSION, PAUSE_MISSION, RESUME_MISSION, CANCEL_MISSION, UPLOAD_WAYPOINTS
// 相机控制
TAKE_PHOTO, START_RECORDING, STOP_RECORDING, GIMBAL_CONTROL, CAMERA_ZOOM
// 参数设置
SET_ALTITUDE, SET_SPEED, SET_HEADING, GO_TO_LOCATION
// 系统
GET_STATUS, GET_LOCATION, REBOOT, CALIBRATE
```
## 事件机制
框架基于Spring Event提供了丰富的事件,可以监听:
```java
@Component
public class MyEventListener {
@EventListener
public void onCommandReceived(CommandReceivedEvent event) {
log.info("收到指令: {} -> {}", event.getCommandId(), event.getDroneId());
}
@EventListener
public void onCommandExecuted(CommandExecutedEvent event) {
log.info("指令执行完成: {}, 结果: {}",
event.getCommandContext().getCommandId(),
event.isSuccess() ? "成功" : "失败");
}
@EventListener
public void onPlatformConnected(PlatformConnectedEvent event) {
log.info("平台连接成功: {}", event.getPlatformId());
}
@EventListener
public void onPlatformDisconnected(PlatformDisconnectedEvent event) {
log.warn("平台断开连接: {}", event.getPlatformId());
}
}
```
## 配置说明
```yaml
drone:
framework:
# 本平台ID
platform-id: my-drone-platform
# 本平台名称
platform-name: 我的无人机平台
# 默认推送间隔(秒)
default-push-interval: 30
# 默认心跳间隔(秒)
default-heartbeat-interval: 60
# 心跳超时时间(秒)
heartbeat-timeout: 120
# 是否启用自动连接
auto-connect: true
# 是否启用自动推送
auto-push: true
# UDP服务端配置
udp:
server:
enabled: true # 启用UDP服务端
port: 9999 # 监听端口
buffer-size: 1048576 # 缓冲区大小
```
## UDP协议使用
### 配置UDP上级平台
```java
// 添加使用UDP协议的上级平台
PlatformConfig udpPlatform = PlatformConfig.builder()
.platformId("udp-command-center")
.name("UDP指挥中心")
.host("192.168.1.100") // 上级平台IP
.port(9999) // 上级平台端口
.protocol(ProtocolType.UDP) // 使用UDP协议
.pushInterval(10) // 10秒推送一次
.build();
client.addPlatform(udpPlatform);
client.bindDrone("udp-command-center", "DRONE-001");
client.connect("udp-command-center");
```
### UDP消息格式
框架使用JSON格式封装UDP消息,消息结构:
```json
{
"messageId": "uuid",
"type": "DRONE_STATUS",
"payload": [...],
"timestamp": "2024-01-01T12:00:00"
}
```
### 上级平台发送控制指令
上级平台可以通过UDP向本平台的9999端口发送控制指令:
```json
{
"messageId": "cmd-001",
"type": "COMMAND",
"payload": {
"commandId": "take-off-001",
"droneId": "DRONE-001",
"commandType": "TAKE_OFF",
"parameters": {}
}
}
```
### UDP状态查询
```bash
curl http://localhost:8080/api/v1/udp/status
```
## 项目结构
```
src/main/java/com/drone/framework/
├── api/ # 对外API
│ ├── DroneMessageClient.java # 主要API入口
│ └── CommandApi.java # REST API
├── core/ # 核心组件
│ ├── CommandDispatcher.java # 指令分发器
│ ├── MessageDispatcher.java # 消息分发器
│ ├── PlatformManager.java # 平台管理器
│ └── PushScheduler.java # 推送调度器
├── model/ # 数据模型
│ ├── DroneInfo.java
│ ├── CommandContext.java
│ ├── CommandResult.java
│ ├── Message.java
│ └── PlatformConfig.java
├── protocol/ # 通信协议实现
│ ├── PlatformConnection.java
│ ├── HttpPlatformConnection.java
│ ├── WebSocketPlatformConnection.java
│ ├── TcpPlatformConnection.java
│ └── UdpPlatformConnection.java
├── spi/ # SPI接口定义
│ ├── CommandExecutor.java
│ ├── DroneDataProvider.java
│ ├── MessageHandler.java
│ ├── ConnectionListener.java
│ └── DataSerializer.java
├── event/ # 事件定义
│ ├── CommandReceivedEvent.java
│ ├── CommandExecutedEvent.java
│ └── PlatformConnectedEvent.java
└── config/ # 自动配置
└── DroneFrameworkAutoConfiguration.java
```
## 扩展开发
### 添加新的通信协议
```java
public class MqttPlatformConnection extends AbstractPlatformConnection {
@Override
public boolean connect() {
// MQTT连接实现
}
@Override
public boolean send(Message message) {
// MQTT发送实现
}
}
```
### 自定义序列化方式
```java
@Component
public class ProtobufSerializer implements DataSerializer {
@Override
public byte[] serialize(Object obj) {
// Protobuf序列化
}
@Override
public T deserialize(byte[] data, Class clazz) {
// Protobuf反序列化
}
@Override
public String contentType() {
return "application/x-protobuf";
}
}
```
## 运行示例
```bash
mvn spring-boot:run
```
启动后,框架会自动注册示例中的指令执行器。你可以通过API测试:
```bash
# 发送起飞指令
curl -X POST http://localhost:8080/api/v1/commands \
-H "Content-Type: application/json" \
-d '{
"droneId": "DRONE-001",
"commandType": "TAKE_OFF"
}'
# 查看支持的指令类型
curl http://localhost:8080/api/v1/commands/types
```
## 许可证
MIT License
## 参考
本项目参考了 [wvp-GB28181-pro](https://github.com/648540858/wvp-GB28181-pro) 的架构设计理念。