简介
大疆云平台二次开发本地部署踩坑实录,完美解决:EMQX 安装失败、前端 npm 报错、nlark 源失效、后端启动报错、JWT401 登录失败、路径拼接错误等所有疑难问题,新手多次翻车后部署成功。
DEMO 前端源码: github.com/dji-sdk/Clo…
DEMO 后端源码: github.com/dji-sdk/DJI…
访问不了可能需要科学上网
Docker 快速部署(无环境可选)
terra-sz-hc1pro-cloudapi.oss-cn-shenzhen.aliyuncs.com/c0af9fe0d7e…
直接下载官方 Docker 包,一键部署,无需手动装依赖。
适用人群:大疆无人机云开发、毕业设计、项目实训、后端 / 全栈新手
运行环境:Ubuntu20.04 + MySQL8.0 + Redis + Mosquitto (MQTT) + Vue 前端 + Java 后端
标签:后端 无人机 大疆开发 踩坑记录 mqtt vue java
一、前言
最近在做大疆 Cloud API 云平台二次开发,遇到的坑极多:
- 官方 EMQX Docker 镜像拉取超时、源失效、GPG 密钥报错,根本装不上
- 前端高版本 Node 直接安装失败、nlark 镜像源过期
- 后端大量占位符导致启动崩溃
- 登录报 401、JWT 解码异常、拦截器误拦截
全程踩坑,最终替换 Mosquitto 双协议 MQTT + 修复所有兼容问题 + 解决前后端联调 401,成功部署并登录后台。
二、全套环境配置(避坑版)
| 软件 | 版本推荐 | 避坑重点 |
|---|---|---|
| 操作系统 | Ubuntu20.04 | 桥接网络,与主机同网段 |
| JDK | 11/17 | 不要 21/24 高版本 |
| Maven | 3.6+ | 配置阿里云源 |
| MySQL | 8.0 | 新建 cloud_sample 库、djDb 用户 |
| Redis | 6.x | 设置密码 xxxxx |
| Node.js | 18.x LTS | 禁止使用 24.x |
| MQTT | Mosquitto | 放弃 EMQX,零报错 |
验证后端启动成功
访问 Swagger 接口文档:http://localhost:6789/swagger-ui/index.html能打开并看到设备管理、航线任务、媒体管理等接口,说明后端正常。
三、服务端核心部署:Mosquitto 替代 EMQX(终极方案)
用Ubuntu 自带源里的轻量级 MQTT Broker(mosquitto) ,一键安装就能跑起 1883 端口,完全能满足大疆 Demo 的需求。
✅ 方案:用 mosquitto 替代 EMQX,快速跑起 1883 端口
mosquitto 是一个轻量级、稳定的 MQTT 服务器,Ubuntu 官方源直接提供,无需配置源、不用翻墙,一条命令就能安装完成,完美适配需求。
3.1 为什么放弃 EMQX
- Docker 镜像拉取超时
- 官方源 406、密钥验证失败
- 国内网络完全无法部署
3.2 一键安装 Mosquitto
bash
运行
sudo apt update
sudo apt install -y mosquitto mosquitto-clients
3.3 配置账号密码(和项目 yml 完全一致)
bash
运行
sudo mosquitto_passwd -b /etc/mosquitto/pwfile 账号 密码
本地 MQTT 连通性测试(关键验证步骤)
在Windows 主机上测试与 Ubuntu 虚拟机的 MQTT 连接,确保网络和认证正常。
安装 MQTT 客户端工具(可选,推荐)
-
方案 A:使用 mosquitto-clients(Ubuntu 端)
bash
运行
# 已安装,直接使用 mosquitto_sub -h 100.8.11.148 -p 1883 -u admin -P public -t "test/#" # 订阅测试主题 mosquitto_pub -h 100.8.11.148 -p 1883 -u admin -P public -t "test/hello" -m "大疆Demo测试" # 发布消息 -
方案 B:使用 MQTT X(Windows 图形化工具)
-
下载安装:mqttx.app/
-
新建连接:
- 名称:大疆 Demo 测试
- 服务器:localhost:1883
- 用户名:xxxxx
- 密码:xxxxx
-
点击连接,成功后订阅 / 发布消息测试
-
3.4 双协议配置文件(1883 普通 MQTT + 8083 WebSocket DRC)
编辑配置文件:
bash
运行
sudo nano /etc/mosquitto/mosquitto.conf
全覆盖写入:
ini
# 基础MQTT 1883端口
listener 1883 0.0.0.0
protocol mqtt
allow_anonymous false
password_file /etc/mosquitto/pwfile
# DRC远程控制 WebSocket 8083端口
listener 8083 0.0.0.0
protocol websockets
allow_anonymous false
password_file /etc/mosquitto/pwfile
log_dest file /var/log/mosquitto/mosquitto.log
log_type all
3.5 启动放行端口
bash
运行
sudo systemctl start mosquitto
sudo systemctl enable mosquitto
sudo ufw allow 1883/tcp
sudo ufw allow 8083/tcp
sudo ufw reload
3.6 验证
bash
运行
sudo netstat -tulpn | grep mosquitto
同时监听 1883 8083 即为成功
四、后端 SpringBoot 完整配置(解决启动崩溃)
4.1 核心报错原因
官方 yml 大量占位符字符串,SpringBoot 无法转数字,直接启动崩溃。
4.2 最终可直接运行 application.yml
已修复:MQTT、数据库、Redis、直播占位符、启动报错 yaml
server:
port: 6789
spring:
main:
allow-bean-definition-overriding: true
application:
name: cloud-api-sample
datasource:
druid:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/cloud_sample?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: djDb
password: '密码'
initial-size: 10
min-idle: 10
max-active: 20
max-wait: 60000
redis:
host: localhost
port: 6379
database: 0
username:
password: xxxxx
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
#password,为redis密码
servlet:
multipart:
max-file-size: 2GB
max-request-size: 2GB
web:
cors:
allowed-origins: http://localhost:8080
allowed-methods: GET,POST,PUT,DELETE,OPTIONS
allowed-headers: "*"
allow-credentials: true
jwt:
issuer: DJI
subject: CloudApiSample
secret: CloudApiSample
age: 86400
mqtt:
BASIC:
protocol: MQTT
host: localhost
port: 1883
username: xxxxx
password: xxxxx
client-id: mqttx_226a154f
path:
DRC:
protocol: WS
host: localhost
port: 8083
path: /mqtt
username: xxxxx
password: xxxxx
#xxxxx为mqtt的账号密码
cloud-sdk:
mqtt:
inbound-topic: sys/product/+/status,thing/product/+/requests
url:
manage:
prefix: manage
version: /api/v1
map:
prefix: map
version: /api/v1
media:
prefix: media
version: /api/v1
wayline:
prefix: wayline
version: /api/v1
storage:
prefix: storage
version: /api/v1
control:
prefix: control
version: /api/v1
oss:
enable: false
logging:
level:
com.dji: debug
file:
name: logs/cloud-api-sample.log
ntp:
server:
host: Google.mzr.me
cloud-api:
app:
id: test
key: test
license: test
livestream:
url:
agora:
channel: test
token: test
uid: 654321
rtmp:
url: rtmp://127.0.0.1:1935/live/
rtsp:
username: admin
password: 123456
port: 8554
gb28181:
serverIP: localhost
serverPort: 5060
serverID: 34020000002000000001
agentID: 34020000001100000001
agentPassword: 123456
localPort: 5060
channel: test
whip:
url: http://127.0.0.1:1985/rtc/v1/whip/?app=live&stream=
4.3 后端致命报错修复(核心)
报错 1:数字转换异常启动崩溃
原因:官方大量占位符文本无法转数字解决:全部填充测试合法值
报错 2:JWT Token 1 段解析失败 / 登录 401
根本原因前端 baseURL 多加了 /api/v1导致接口路径重复拼接:错误:/api/v1/manage/api/v1/login正确:/manage/api/v1/login
解决方案拦截器放行登录接口 + 前端修正地址
五、前端终极报错解决方案(全网唯一有效)
5.1 前端报错汇总
Exit handler never called!registry.nlark.com 解析失败- 高版本 node 完全装不上依赖
- vite 不是内部命令
5.2 根治方案
- 删除项目失效配置
powershell
rd /s /q node_modules
del package-lock.json
del .npmrc
del yarn.lock
- 强制切换淘宝源
powershell
npm config set registry https://registry.npmmirror.com/
- 使用兼容低版本 npm 安装(唯一能成功的命令)
powershell
npx npm@9 install --legacy-peer-deps --registry=https://registry.npmmirror.com/
5.3 前端.env 核心配置(解决 401)
env
# 必须不能带 /api/v1
VITE_API_BASE_URL = http://localhost:6789
5.4 启动前端
powershell
npm run serve
六、前后端联调 401 问题终极解决
错误现象
- 前端登录 401
- 后端提示:
The token was expected to have 3 parts, but got 1
真实原因
- 路径拼接错误,登录接口被当成需要 token 的接口
- 拦截器没有放行登录接口
- 前端 baseURL 配置错误
最终修复
- 前端去掉 baseURL 多余路径
- 后端添加跨域
- 拦截器放行
/login
修复后:登录成功、后台正常进入
七、全网最全踩坑总结表
表格
| 报错现象 | 原因 | 解决方案 |
|---|---|---|
| EMQX 镜像拉取失败 | 网络 + 官方源失效 | 改用 Mosquitto |
| 后端启动数字转换报错 | 占位符未替换 | 全部填充合法测试值 |
| npm Exit handler 报错 | node24 过高不兼容 | 使用 npx npm@9 安装 |
| nlark.com失效 | 项目硬编码旧源 | 删除.npmrc + 换淘宝镜像 |
| vite 不是内部命令 | 依赖安装失败 | 清理重装 |
| 登录 401 JWT 解析错误 | 路径重复拼接 | 修正前端 baseURL |
八、结语
大疆官方 Demo 部署坑非常多,网上几乎没有完整踩坑教程。本文从零解决:MQTT 部署、后端启动、前端依赖、联调 401 全部问题,可直接用于毕业设计、项目开发、学习记录。
后续我会继续更新:
- 大疆 Pilot2 设备对接教程
- 无人机状态上报
- 航点任务下发
- 实时视频流拉取