# react-drone-platform
**Repository Path**: dongqifei/react-drone-platform
## Basic Information
- **Project Name**: react-drone-platform
- **Description**: react版无人机接入平台
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2025-02-24
- **Last Updated**: 2025-09-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### 无人机接入平台
#### 1. 概述
无人机接入平台是一个基于Java + react开发的开源项目,旨在提供一套完整的无人机接入平台。
#### 2. 前端可视化平台
基于 antd、react、deck.gl、maplibre-gl开发的前端可视化平台,用户可以实时查看所管理区域中无人机的位置、速度、高度、角度等数据,并进行控制。
1. 安装依赖包:
```
npm install
```
2. 运行前端可视化平台:
```
npm run dev
```
3. 访问前端可视化平台:
http://localhost:5173
#### 3. 后端管理平台
基于 Java + Spring Boot + Redis + MySQL + WebSocket + Mavlink + MQTT + KAFKA等技术开发的后端管理平台,用户可以管理无人机、区域、任务等数据,并进行控制。
1. 安装依赖包:
```
maven clean install
```
2. 运行后端管理平台:
```
maven spring-boot:run
```
3. 访问后端管理平台:
http://localhost:8080
#### 4. 常见问题
##### 如何使用Java和Mavlink协议实现无人机的通信和控制?
###### 一、环境准备
1. 安装依赖库
```xml
org.mavlink
mavlink
1.12.0
com.fazecast
jSerialComm
2.10.3
org.java-websocket
Java-WebSocket
1.5.3
```
2. MAVLink代码生成
MAVLink协议是开源的,可以参考开源项目实现MAVLink协议。
```bash
python3 -m pymavlink.tools.mavgen --lang=Java --output=generated \
message_definitions/v1.0/common.xml
```
###### 二、通信层实现
1. 串口通信
```java
import com.fazecast.jSerialComm.*;
public class SerialConnector {
private SerialPort serialPort;
public boolean connect(String portName, int baudRate) {
serialPort = SerialPort.getCommPort(portName);
serialPort.setBaudRate(baudRate);
serialPort.setNumDataBits(8);
serialPort.setParity(SerialPort.NO_PARITY);
return serialPort.openPort();
}
public void sendPacket(byte[] data) {
serialPort.writeBytes(data, data.length);
}
public byte[] readPacket() {
byte[] buffer = new byte[1024];
int len = serialPort.readBytes(buffer, buffer.length);
return Arrays.copyOf(buffer, len);
}
}
```
2. UDP通信
```java
import java.net.*;
import java.nio.ByteBuffer;
public class UDPConnector {
private DatagramSocket socket;
private InetAddress droneAddress;
private int dronePort;
public void connect(String ip, int port) throws Exception {
droneAddress = InetAddress.getByName(ip);
dronePort = port;
socket = new DatagramSocket();
}
public void sendPacket(byte[] data) throws Exception {
DatagramPacket packet = new DatagramPacket(
data, data.length, droneAddress, dronePort
);
socket.send(packet);
}
public byte[] receivePacket() throws Exception {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
return Arrays.copyOf(packet.getData(), packet.getLength());
}
}
```
##### 三、MAVLink消息处理
1. 消息解析
```java
import io.dronefleet.mavlink.MavlinkConnection;
import io.dronefleet.mavlink.MavlinkMessage;
public class MavlinkParser {
private final MavlinkConnection connection;
public MavlinkParser(InputStream in, OutputStream out) {
this.connection = MavlinkConnection.create(in, out);
}
public MavlinkMessage> readMessage() throws IOException {
return connection.next();
}
public void sendMessage(MavlinkMessage> message) throws IOException {
connection.send1(message.getSystemId(), message.getComponentId(), message);
}
}
```
2. 心跳包维护
```java
// 发送心跳
public void sendHeartbeat(int systemId) throws IOException {
Heartbeat heartbeat = Heartbeat.builder()
.type(MavType.MAV_TYPE_GCS)
.autopilot(MavAutopilot.MAV_AUTOPILOT_INVALID)
.systemStatus(MavState.MAV_STATE_ACTIVE)
.build();
parser.sendMessage(MavlinkMessage.create(
systemId,
MavComponent.MAV_COMP_ID_MISSIONPLANNER,
heartbeat
));
}
// 接收心跳
public void handleHeartbeat(Heartbeat heartbeat) {
System.out.printf("Drone Status: %s, Mode: %s%n",
heartbeat.systemStatus(),
heartbeat.customMode());
}
```
##### 四、无人机控制指令
1. 起飞:
```java
public void armDrone(int systemId) throws IOException {
CommandLong cmd = CommandLong.builder()
.command(MavCmd.MAV_CMD_COMPONENT_ARM_DISARM)
.param1(1) // 1=解锁
.targetSystem(systemId)
.targetComponent(MavComponent.MAV_COMP_ID_AUTOPILOT1)
.build();
parser.sendMessage(MavlinkMessage.create(
GCS_SYSTEM_ID,
MavComponent.MAV_COMP_ID_MISSIONPLANNER,
cmd
));
}
```
2. 位置控制(示例:飞往指定GPS点)
```java
public void flyTo(int systemId, double lat, double lon, float alt) throws IOException {
MissionItemInt mission = MissionItemInt.builder()
.targetSystem(systemId)
.seq(0)
.frame(MavFrame.MAV_FRAME_GLOBAL_RELATIVE_ALT)
.command(MavCmd.MAV_CMD_NAV_WAYPOINT)
.x((int)(lat * 1e7))
.y((int)(lon * 1e7))
.z(alt)
.build();
parser.sendMessage(MavlinkMessage.create(
GCS_SYSTEM_ID,
MavComponent.MAV_COMP_ID_MISSIONPLANNER,
mission
));
}
```
##### 五、遥测数据处理
1. 姿态数据解析
```java
public void handleAttitude(Attitude attitude) {
System.out.printf("Roll: %.2f°, Pitch: %.2f°, Yaw: %.2f°%n",
Math.toDegrees(attitude.roll()),
Math.toDegrees(attitude.pitch()),
Math.toDegrees(attitude.yaw()));
}
```
2. 位置数据解析
```java
public void handleGlobalPositionInt(GlobalPositionInt gps) {
double lat = gps.lat() / 1e7D;
double lon = gps.lon() / 1e7D;
float alt = gps.alt() / 1000f;
System.out.printf("Position: Lat=%.6f, Lon=%.6f, Alt=%.1fm%n",
lat, lon, alt);
}
```
##### 六、完整控制流程
```java
public class DroneController {
private static final int GCS_SYSTEM_ID = 255;
private MavlinkParser parser;
private Thread receiveThread;
public void start() {
// 1. 建立通信连接
SerialConnector serial = new SerialConnector();
if (!serial.connect("/dev/ttyUSB0", 57600)) {
throw new RuntimeException("Connection failed");
}
// 2. 初始化MAVLink解析器
parser = new MavlinkParser(
new SerialInputStream(serial),
new SerialOutputStream(serial)
);
// 3. 启动接收线程
receiveThread = new Thread(this::receiveLoop);
receiveThread.start();
// 4. 控制流程
armDrone(1); // 解锁无人机
takeOff(1, 10); // 起飞至10米高度
flyTo(1, 31.2304, 121.4737, 30); // 飞往指定坐标
}
private void receiveLoop() {
try {
while (true) {
MavlinkMessage> msg = parser.readMessage();
if (msg != null) {
handleMessage(msg.getPayload());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void handleMessage(Object payload) {
if (payload instanceof Heartbeat) {
handleHeartbeat((Heartbeat) payload);
} else if (payload instanceof Attitude) {
handleAttitude((Attitude) payload);
}
// 添加其他消息处理...
}
}
```
##### 七、安全注意事项
1. 校验和验证:确保所有MAVLink消息的校验和正确
2. 超时处理:实现心跳超时检测(>5秒无心跳断开连接)
3. 应急机制:
```java
public void emergencyStop(int systemId) throws IOException {
CommandLong cmd = CommandLong.builder()
.command(MavCmd.MAV_CMD_OVERRIDE_GOTO)
.param1(1) // 立即停止
.targetSystem(systemId)
.build();
parser.sendMessage(MavlinkMessage.create(
GCS_SYSTEM_ID,
MavComponent.MAV_COMP_ID_MISSIONPLANNER,
cmd
));
}
```