【大疆】MSDK实现电子围栏,自定义飞行区,上云api使用官方提供的接口即可
开发平台:大疆MSDK
开发工具:okHttp等
开发语言:Kotlin
0. 整体思路
无人机飞行时需要占用宽带(直播以及飞控等),所以对于媒体文件(拍照、录像)我们采用落地回传的形式来实现。首先,获取无人机状态,当无人机落地时调用落地回传方法,在方法内我们先将媒体文件从无人机中下载到遥控器(RC)中,然后再将RC中的文件以此传输到服务器中。
1. 获取无人机状态
可以通过以下代码获取无人机的飞行状态,如果飞行状态由true 到 false 则说明无人机降落。
val flyStatus : Boolean = KeyTools.createKey(FlightControllerKey.KeyIsFlying).get() == true
2. 回传媒体文件
大致逻辑如下,由于大疆msdk无法获取文件的文件夹信息,所以我们可以采取文件索引来获取当此飞行所产生的飞行媒体文件。
注意:大疆拍摄的高清视频源文件较大,可以采用自带的压缩进行拍摄以及降低画面质量等。亦可采用分段上传优化。
private fun passBackMedia(startIndex: Int, endIndex: Int) {
"文件回传开始".eLog()
OsdSender.instance.setPassBackStatus(1)
MediaDataCenter.getInstance().mediaManager.pullMediaFileListFromCamera(
PullMediaFileListParam.Builder().mediaFileIndex(endIndex).count(50).build(),
object : CommonCallbacks.CompletionCallback {
override fun onSuccess() {
// 获取当前任务回传
val mediaFileList = mediaVM.getMediaFileList().filter { mediaFile -> mediaFile.fileIndex > startIndex }
for (mediaFile in mediaFileList) {
mediaFile.fileName.iLog()
}
"任务 $taskExecuteId 回传文件数量 : ${mediaFileList.size}".eLog()
if (mediaFileList.isNotEmpty()) {
val downloadFileList = ArrayList<File>()
val downloadMediaFileList = ArrayList<MediaFile>()
"文件开始下载".iLog()
val deferredList = mediaFileList.map { mediaFile ->
CompletableDeferred<Unit>().also { deferred ->
timerScope.launch(Dispatchers.IO) {
try {
downloadFile(mediaFile, downloadFileList, downloadMediaFileList, deferred)
} catch (e: Exception) {
deferred.completeExceptionally(e)
}
}
}
}
timerScope.launch {
deferredList.forEach { it.await() } // 等待所有下载完成
OsdSender.instance.setPassBackStatus(0)
"文件下载完成,成功数量 ${downloadFileList.size}".iLog()
val uploadUrl = ""
for ((index, value) in downloadFileList.withIndex()) {
uploadFile(uploadUrl, value, mediaFileList[index])
}
}
}
}
override fun onFailure(error: IDJIError) {
"文件回传失败 $error".eLog()
}
})
}
1万+

被折叠的 条评论
为什么被折叠?



