🚁 保姆级|大疆 Cloud API Demo 本地部署全流程一(解决 100% 报错:MQTT / 前端依赖 / 401/JWT/ 启动崩溃)

2 阅读7分钟

简介

大疆云平台二次开发本地部署踩坑实录,完美解决: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 云平台二次开发,遇到的坑极多:

  1. 官方 EMQX Docker 镜像拉取超时、源失效、GPG 密钥报错,根本装不上
  2. 前端高版本 Node 直接安装失败、nlark 镜像源过期
  3. 后端大量占位符导致启动崩溃
  4. 登录报 401、JWT 解码异常、拦截器误拦截

全程踩坑,最终替换 Mosquitto 双协议 MQTT + 修复所有兼容问题 + 解决前后端联调 401,成功部署并登录后台。

二、全套环境配置(避坑版)

软件版本推荐避坑重点
操作系统Ubuntu20.04桥接网络,与主机同网段
JDK11/17不要 21/24 高版本
Maven3.6+配置阿里云源
MySQL8.0新建 cloud_sample 库、djDb 用户
Redis6.x设置密码 xxxxx
Node.js18.x LTS禁止使用 24.x
MQTTMosquitto放弃 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 图形化工具)

    1. 下载安装:mqttx.app/

    2. 新建连接:

      • 名称:大疆 Demo 测试
      • 服务器:localhost:1883
      • 用户名:xxxxx
      • 密码:xxxxx
    3. 点击连接,成功后订阅 / 发布消息测试

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 根治方案

  1. 删除项目失效配置

powershell

rd /s /q node_modules
del package-lock.json
del .npmrc
del yarn.lock
  1. 强制切换淘宝源

powershell

npm config set registry https://registry.npmmirror.com/
  1. 使用兼容低版本 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

真实原因

  1. 路径拼接错误,登录接口被当成需要 token 的接口
  2. 拦截器没有放行登录接口
  3. 前端 baseURL 配置错误

最终修复

  1. 前端去掉 baseURL 多余路径
  2. 后端添加跨域
  3. 拦截器放行 /login

修复后:登录成功、后台正常进入


七、全网最全踩坑总结表

表格

报错现象原因解决方案
EMQX 镜像拉取失败网络 + 官方源失效改用 Mosquitto
后端启动数字转换报错占位符未替换全部填充合法测试值
npm Exit handler 报错node24 过高不兼容使用 npx npm@9 安装
nlark.com失效项目硬编码旧源删除.npmrc + 换淘宝镜像
vite 不是内部命令依赖安装失败清理重装
登录 401 JWT 解析错误路径重复拼接修正前端 baseURL

八、结语

大疆官方 Demo 部署坑非常多,网上几乎没有完整踩坑教程。本文从零解决:MQTT 部署、后端启动、前端依赖、联调 401 全部问题,可直接用于毕业设计、项目开发、学习记录。

后续我会继续更新:

  • 大疆 Pilot2 设备对接教程
  • 无人机状态上报
  • 航点任务下发
  • 实时视频流拉取