大疆机场3机探照灯开关流程

大疆机场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:

ColumnNameTypeconstraintDescription
mqtt_brokerBroker 连接信息struct获取 MQTT 中继服务的地址与认证信息
»address服务器连接地址text服务器连接地址,例如:192.0.2.1:8883, mqtt.dji.com:8883
»client_id客户端 IDtext可自定义的 MQTT 客户端 ID。建议使用设备的 SN 码,也可以与具有语义的前缀组合,例如,drc-4J4R101
»username用户名text建立连接时使用的用户名
»password密码text建立连接时认证所需要的密码
»expire_time认证信息过期时间int{“unit_name”:“秒 / s”}在有效期内认证信息可以重复使用,另外认证信息过期后,并不会影响已建立连接的设备
»enable_tls是否启用 TLSbool启用 TLS 即对 MQTT 链路开启加密
osd_frequencyOSD 频率int{“max”:30,“min”:1,“unit_name”:“赫兹 / Hz”}设置 OSD 上报频率
hsi_frequencyHSI 频率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:

ColumnNameTypeconstraintDescription
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:

ColumnNameTypeconstraintDescription
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:

ColumnNameTypeconstraintDescription
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:

ColumnNameTypeconstraintDescription
psdk_indexpsdk 负载设备索引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:

ColumnNameTypeconstraintDescription
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:

ColumnNameTypeconstraintDescription
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日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值