如何获取DJI无人机MQTT订阅主题?适配SDK兼容无人机
问题
我在一个用于无人机飞行规划与拍照的开源项目中,用JavaScript的Mosquitto库连接DJI Phantom 4 Pro无人机,代码片段如下:
// Drone Position var drone_general_longtitute = 0; var drone_general_latitude = 0; var points_two = []; client.on('connect', function() { console.log('MQTT SERVER SUCCESSFULLY CONNECTED'); jQuery('#communication_server').removeClass('offline'); jQuery('#communication_server').addClass('online'); client.subscribe('telemetry/dji.phantom.4.pro.hawk.1', function(err) { if (!err) { client.publish('presence', 'Hello mqtt') } else { console.log(err); } }) client.subscribe('camera/dji.phantom.4.pro.hawk.1', function(err) { if (!err) { client.publish('presence', 'Hello mqtt') } }) client.subscribe('missionStatus/dji.phantom.4.pro.hawk.1', function(err) { if (!err) { client.publish('presence', 'Hello mqtt') } }) client.subscribe('missionStart/dji.phantom.4.pro.hawk.1', function(err) { if (!err) { client.publish('presence', 'Hello mqtt') } })
我想知道怎么找到client.subscribe需要的特定主题(比如示例里的'camera/dji.phantom.4.pro.hawk.1'),查过DJI SDK文档没找到相关信息,最终目标是让功能适配任意支持SDK的无人机。
解决方法
优先查看开源项目的配置与文档
这类主题格式大概率是项目自定义规则,并非DJI SDK原生定义。先找项目内的config.js、settings.json等配置文件,或者项目的README、本地文档,里面通常会明确主题的命名逻辑,比如[功能类型]/[厂商].[机型].[自定义设备标识]这类格式。抓包监听MQTT全量流量
用MQTT客户端工具(比如MQTTX、Mosquitto自带的mosquitto_sub命令)连接同一MQTT服务器,订阅通配符主题#,然后操作无人机(比如触发拍照、发送飞行指令),就能捕获到无人机或项目服务端发布的所有主题,从中筛选出camera、telemetry等你需要的目标主题。直接查看项目的MQTT服务端代码
如果这个开源项目配套有后端服务,直接找服务端代码里的client.publish调用逻辑,就能明确每个功能对应的主题格式——前端需要订阅的,就是服务端主动发布数据的那些主题。适配任意机型的通用实现思路
不要硬编码机型标识,改成动态生成主题:- 通过DJI SDK获取当前连接无人机的机型信息(比如调用SDK的
getProduct()方法拿到机型名称); - 按照项目的主题规则,动态拼接主题字符串,比如
const cameraTopic =camera/dji.${modelName.toLowerCase().replace(/\s+/g, '.')}.${deviceId}``; - 将设备标识(示例中的
hawk.1)设为可配置项,让用户手动输入或自动获取无人机SN码作为唯一标识。
- 通过DJI SDK获取当前连接无人机的机型信息(比如调用SDK的
内容的提问来源于stack exchange,提问作者Fnechz
相关产品推荐
相关产品推荐

