大疆机场3机探照灯开关流程
此功能只适用于大疆机场3(DJI DOCK3)和大疆四代飞机(M4T/M4TD)
大疆机场3探照灯的开关需要走DRC链路,具体文档在上云API的指令飞行和远程控制模块。
1、具体执行流程
-
开启探照灯
- 进入指令飞行控制模式。
- 每秒一次持续下发DRC心跳💓。
- 设置探照灯模式为 1 常亮。
- 即可打开探照灯。
-
关闭探照灯
- 设置探照灯模式为 0 关闭。
- 即可关闭探照灯。
- 停止发送心跳💓。
- 退出指令飞行控制模式。
2、准备工作
对应版本号:
大疆机场3需要升级到V01.00.0001版本。飞机也需要升级到相同V01.00.0001版本。
如果让可以联系到大疆人员,飞机也可以升级到V99.99.9275版本。
建议打开无人机、使用遥控器先进行探照灯功能的验证。查验此版本下探照灯是否可以正常开关
3、打开探照灯
3.1、进入指令飞行控制模式
文档:
Topic: thing/product/{gateway_sn}/services
Direction: down
Method: drc_mode_enter
Data:
Column | Name | Type | constraint | Description |
---|---|---|---|---|
mqtt_broker | Broker 连接信息 | struct | 获取 MQTT 中继服务的地址与认证信息 | |
»address | 服务器连接地址 | text | 服务器连接地址,例如:192.0.2.1:8883, mqtt.dji.com:8883 | |
»client_id | 客户端 ID | text | 可自定义的 MQTT 客户端 ID。建议使用设备的 SN 码,也可以与具有语义的前缀组合,例如,drc-4J4R101 | |
»username | 用户名 | text | 建立连接时使用的用户名 | |
»password | 密码 | text | 建立连接时认证所需要的密码 | |
»expire_time | 认证信息过期时间 | int | {“unit_name”:“秒 / s”} | 在有效期内认证信息可以重复使用,另外认证信息过期后,并不会影响已建立连接的设备 |
»enable_tls | 是否启用 TLS | bool | 启用 TLS 即对 MQTT 链路开启加密 | |
osd_frequency | OSD 频率 | int | {“max”:30,“min”:1,“unit_name”:“赫兹 / Hz”} | 设置 OSD 上报频率 |
hsi_frequency | HSI 频率 | int | {“max”:30,“min”:1,“unit_name”:“赫兹 / Hz”} | 设置 HSI 上报频率 |
Example:
{
"bid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"data": {
"hsi_frequency": 1,
"mqtt_broker": {
"address": "mqtt.dji.com:8883",
"client_id": "sn_a",
"enable_tls": true,
"expire_time": 1672744922,
"password": "jwt_token",
"username": "sn_a_username"
},
"osd_frequency": 10
},
"tid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"timestamp": 1654070968655,
"method": "drc_mode_enter"
}
Topic: thing/product/{gateway_sn}/services_reply
Direction: up
Method: drc_mode_enter
Data:
Column | Name | Type | constraint | Description |
---|---|---|---|---|
result | 返回码 | int | 非 0 代表错误 |
Example:
{
"bid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"data": {
"result": 0
},
"tid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"timestamp": 1654070968655,
"method": "drc_mode_enter"
}
说明:
- 下行指令可以直接粘过来使用
- client_id 建议使用 文档 Description 中的说明 使用
drc-机场编码
的形式。本人试验过,直接使用机场编码,无法进入指令飞行模式。 - enable_tls 建议使用 false 如果是启用 TLS,是需要其他配置才能链接mqtt的,目前还没找到怎么配置才能链接上mqtt。
使用false会有什么风险暂时没有发现,如果使用false出现任何风险,本人不负任何责任
。但是可以进入指令飞行模式。 - username和password 需要与 机场配置的 用户名和密码 一致,而且不要有其他的地方再次登录,多方登录的话可能会影响到DRC链路的心跳💓,导致无法打开探照灯。所以建议申请一个新的mqtt账号,专门来做此项功能。
- 下行指令发送后,机场会回复上行指令。监听到 drc_mode_enter 方法的 “result”: 0 表示已经进入指令飞行模式。
- 进入指令飞行模式之后,需要1s一次持续下发drc心跳💓,如果10s中之内没有心跳,就会自动退出指令飞行模式。
3.2、DRC-心跳💓
文档:
与 data 同级的 seq 是递增的序号,保证指令顺序执行
Topic: thing/product/{gateway_sn}/drc/down
Direction: down
Method: heart_beat
Data:
Column | Name | Type | constraint | Description |
---|---|---|---|---|
seq | 【废弃】命令序号 | int | 递增的序号,保证指令顺序执行 | |
timestamp | 心跳发送时间戳 | int | {“unit_name”:“毫秒 / ms”} | 业务方可以通过心跳协议判断 DRC 链路是否活跃,若一定期间未收到心跳回应可以判定 DRC 链路异常,对于 DRC 异常情况可以发起重试。若超过 1 分钟未收到业务方发送心跳协议,设备将会认为 DRC 链路处于空闲退出 DRC 链路。 |
Example:
{
"data": {
"timestamp": 1670415891013
},
"method": "heart_beat",
"seq": 1
}
Topic: thing/product/{gateway_sn}/drc/up
Direction: up
Method: heart_beat
Data:
Column | Name | Type | constraint | Description |
---|---|---|---|---|
seq | 【废弃】命令序号 | int | 递增的序号,保证指令顺序执行 | |
timestamp | 心跳发送时间戳 | int | {“unit_name”:“毫秒 / ms”} | 业务方可以通过心跳协议判断 DRC 链路是否活跃,若一定期间未收到心跳回应可以判定 DRC 链路异常,对于 DRC 异常情况可以发起重试。若超过 1 分钟未收到业务方发送心跳协议,设备将会认为 DRC 链路处于空闲退出 DRC 链路。 |
Example:
{
"data": {
"timestamp": 1670415891013
},
"method": "heart_beat",
"seq": 1
}
说明:
-
下行指令可以先粘贴使用,要求1s发一次心跳。
seq 的值是递增的,每次都要比上一次递增1
。 但是可能会出现无 DRC-高频 信息上报的情况。如果是无上报信息建议修改一下格式重试{ "method": "heart_beat", "data": { "seq": 0, "timestamp": 1743496244899 }, "seq": 0 }
-
我这边只要是写了 死循环来实现的 消息持续发送
-
进入 DRC链路的心跳💓之后需要验证DRC链路的链接状态 建议 参考文章 来确认链接状态。
-
我主要监听了下面的方法:
-
osd_info_push是有消息回复的。
-
events,method为drc_status_notify上报的状态是2(已连接)。osd_info_push也是可以正常回复的。
-
up主题的,drc_psdk_state_info也是有的。
// events 主题 if ("drc_psdk_state_info".equals(method)) { log.error("drc_psdk_state_info,events: {}", payload); redisService.setCacheObject("dji3drc:events:drc_psdk_state_info:" + System.currentTimeMillis(), payload, 10L, TimeUnit.MINUTES); } if ("drc_status_notify".equals(method)) { log.error("drc_status_notify,events: {}", payload); redisService.setCacheObject("dji3drc:events:drc_status_notify:" + System.currentTimeMillis(), payload, 10L, TimeUnit.MINUTES); } //up主题 @ServiceActivator(inputChannel = ChannelName.INBOUND_DRC_UP) public void drcUp(@Payload String payload, @Header(value = MqttHeaders.RECEIVED_TOPIC) String topic) throws IOException { if (payload.contains("drc_light_mode_set")) { log.error("drc_light_mode_set,up: {}", payload); redisService.setCacheObject("dji3drc:up:drc_light_mode_set:" + System.currentTimeMillis(), payload, 10L, TimeUnit.MINUTES); } if (payload.contains("heart_beat")) { log.error("heart_beat,up: {}", payload); redisService.setCacheObject("dji3drc:up:heart_beat:" + System.currentTimeMillis(), payload, 10L, TimeUnit.MINUTES); } if (payload.contains("osd_info_push")) { log.error("osd_info_push,up: {}", payload); redisService.setCacheObject("dji3drc:up:osd_info_push:" + System.currentTimeMillis(), payload, 10L, TimeUnit.MINUTES); } if (payload.contains("drc_psdk_state_info")) { log.error("drc_psdk_state_info,up: {}", payload); redisService.setCacheObject("dji3drc:up:drc_psdk_state_info:" + System.currentTimeMillis(), payload, 10L, TimeUnit.MINUTES); } if (payload.contains("drc_light_mode_set")) { log.error("drc_light_mode_set,up: {}", payload); redisService.setCacheObject("dji3drc:up:drc_light_mode_set:" + System.currentTimeMillis(), payload, 10L, TimeUnit.MINUTES); } }
-
-
监听下行主题的 drc_psdk_state_info 方法查看里面的 psdk_index 的值为多少。这个一定要监听到才行,这个 psdk_index 是开启探照灯需要使用的
- 如果这一步没有监听到,就要再检查一下DRC链路的链接状态,查看是否正确链接。或者在下一步的方法中 psdk_index 字段的值,逐个尝试,从0-9逐个尝试,如果打不开就要再排查DRC链路链接问题。DRC链路对网络的要求比较高,如果网络卡顿的话可能造成链路中断
3.3、探照灯—模式设置
文档:
seq是递增的序号,保证指令顺序执行,与data同级
Topic: thing/product/{gateway_sn}/drc/down
Direction: down
Method: drc_light_mode_set
Data:
Column | Name | Type | constraint | Description |
---|---|---|---|---|
psdk_index | psdk 负载设备索引 | int | 依据设备推送 | |
group | 类型 | enum_int | {“0”:“主探照灯”} | |
mode | 模式 | enum_int | { “0”: “关闭”, “1”: “常量”, “2”: “爆闪”, “3”: “快速爆闪”, “4”: “交替爆闪” } |
Example:
{
"data": {
"group": 0,
"mode": 1,
"psdk_index": 1
},
"method": "drc_light_mode_set",
"seq": 1
}
Topic: thing/product/{gateway_sn}/drc/up
Direction: up
Method: drc_light_mode_set
Data:
Column | Name | Type | constraint | Description |
---|---|---|---|---|
result | 结果返回码 | int |
Example:
{
"data": {
"result": 0
},
"method": "drc_light_mode_set",
"seq": 1
}
说明:
- 下行命令直接粘贴使用,但是指令中的 psdk_index 字段需要上一步监听到的 psdk_index值。如果没有监听到就要逐个尝试。
- mode 为开关模式 传 1 为探照灯打开常亮。传 0 为关闭探照灯。其他模式有需要可以自行尝试。
到此为止就可以正常打开大疆机场3的探照灯了。
4、关闭探照灯
关闭探照灯,不再详细描述。
4.1、关闭探照灯。
- 开灯指令 中的 mode 改为 0 其他不变,即可关闭探照灯
4.2、退出DRC-心跳💓。
- 停止 DRC-心跳💓 主题消息的发送即可停止心跳
4.3、 退出指令飞行控制模式
Topic: thing/product/{gateway_sn}/services
Direction: down
Method: drc_mode_exit
Data: null
Example:
{
"bid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"data": {},
"tid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"timestamp": 1654070968655,
"method": "drc_mode_exit"
}
Topic: thing/product/{gateway_sn}/services_reply
Direction: up
Method: drc_mode_exit
Data:
Column | Name | Type | constraint | Description |
---|---|---|---|---|
result | 返回码 | int | 非 0 代表错误 |
Example:
{
"bid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"data": {
"result": 0
},
"tid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"timestamp": 1654070968655,
"method": "drc_mode_exit"
}
- 根据文档下行接口,直接粘贴指令即可 退出指令飞行控制模式
自此文档结束。
这个功能是试了好久才做出来了。希望大家可以好好利用这篇文章。完成大疆机场3探照灯的开关功能。——2025年4月20日