服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

用 .NET 启动你的 DJI Ryze Tello 无人机

日期: 来源:微软开发者MSDN收集编辑:Kinfey Lo

点击上方蓝字

关注我们

(本文阅读时间:15分钟)


大疆的 DJI Ryze Tello 是入门级的无人机,不仅在 STEM 教育中有非常广泛的应用,也可以作为编程入门的首选。通过 UDP 协议调用 DJI Ryze Tello SDK 可以让 DJI Ryze Tello 无人机执行起飞,降落,转向以及不同的花式动作。本文将会通过 .NET 创建应用控制 DJI Ryze Tello。




.NET UDP 编程

什么是 UDP

“UDP(用户数据报协议)是一个与IP 协议一起使用的长期协议,用于在传输速度和效率比安全性和可靠性更重要的场合下发送数据。UDP 使用一个简单的、具有最小协议机制的无连接通信模型。UDP 使用校验和保证数据完整性,使用端口号以区分数据发送方和接收方中不同的应用程序。它无需握手会话,即将不可靠的底层网络直接暴露给了用户的应用程序:不保证消息交付、不保证交付顺序也不保证消息不重复。如果需要网络接口层面的纠错功能,则应用程序可以使用为此目的设计的传输控制协议(TCP)或者流控制传输协议(SCTP)。”

在现场实时测控领域,如果有实时、抗干扰性、安全性等要求,都可以采用 UDP 传输数据。我想这也是 DJI Ryze Tello 为何使用 UDP 协议通信的原因。

C# 调用 UDP Client
在 System.Net.Sockets 下你可以通过类 UdpClient 来完成 UDP 协议的相关调用。这是官方给我们的例子。
UdpClient 类提供了在阻塞同步模式下发送和接收无连接 UDP 数据报的简单方法。因为 UDP 是一种无连接的传输协议,所以在发送和接收数据之前不需要建立远程主机连接。但是,您确实可以选择通过以下两种方式之一建立默认远程主机:
  • 使用远程主机名和端口号作为参数创建 UdpClient 类的实例
  • 创建 UdpClient 类的实例,然后调用 Connect 方法

您可以使用 UdpClient 中提供的任何发送方法将数据发送到远程设备。使用 Receive 方法从远程主机接收数据。




用 .NET Polyglot Notebook 连接 DJI Ryze Tello

用 .NET 封装 DJI Ryze Tello SDK 之前我们可以用 Notebooks 连接 DJI Ryze Tello 做相关原型测试。
要连通 DJI Ryze Tello SDK ,需要通过 UDP 连通 192.168.10.1 以及端口 11111.
通过 C# 调用 UDPClient 连接的方式如下:
string telloIP = "192.168.10.1";

int telloPort = 8889;

UdpClient udpClient = new UdpClient();

udpClient.Connect(telloIP,telloPort);


并封装好指令执行的方法
public void Command(UdpClient udpClient,string cmd)
{

Byte[] sendCmdBytes = null;

sendCmdBytes = Encoding.UTF8.GetBytes(cmd);

udpClient.Send(sendCmdBytes, sendCmdBytes.Length);
}
完成上面的设置,你就可以执行对应的指令完成控制 DJI Ryze Tello 的操作
Command(udpClient,"command");

Command(udpClient,"takeoff");

Command(udpClient,"land");
结合 .NET Polyglot Notebook 就可以完成对 DJI Ryze Tello 的操作以及相关技术测试。以下视频是 Notebooks 控制 DJI Ryze Tello 的具体效果:




用 .NET MAUI 构建 DJI Ryze Tello 应用

.NET MAUI 是跨平台,跨设备的前端应用技术,开发团队使用一种编程语言 C# 就可以完成 iOS / Android / macOS / Windows 的应用开发。现在是多终端的年代,通过不同设备控制你手上的 DJI Ryze Tello , 搭建多应用场景是非常棒的。本系列主要通过 iOS 和 Android 移动设备控制 DJI Ryze Tello, 以下是一些关键步骤:

通过 .NET Comet 构建前端 UI

Comet 是⼀种编写跨平台 UI 的现代⽅式 ( https://github.com/dotnet/Comet )。基于 .NET MAUI,它采⽤Model - Views - Update (MVU) 模式,和传统的 XAML 相⽐ , 它有⼏个显著的特点:

  • 基于函数式编程;

  • Comet 参考了 SwiftUI 和 Flutter 描述界面的方式,更容易去编写页面层次逻辑,如:

  • 用 Comet 开发 .NET MAUI 应用不仅可以在 Visual Studio 上开发 ,也可以在 Visual Studio Code 上开发。

注意:如果需要在 Visual Studio Code 调试 .NET MAUI 应用,请安装 C# 和 .NET Comet 组件

绑定 iOS/Android 原生库的技巧
一个好的应用需要整合非常多的场景,如支付,电商,地图等,作为开发团队不需要重复造车,直接可以调用不同的 SDK 来完成相关的操作。.NET MAUI 解决了跨平台应用界面和绝大多数页面逻辑以及业务逻辑的问题。但当我们使用第三方 SDK 时你会发现缺少相关 .NET MAUI 的原生库,通过 Binding 可以让 .NET MAUI 绑定 iOS / Android 的原生库。
从 DJI Ryze Tello SDK 文档可知通过 UDP 可以控制 DJI Ryze Tello , 也可以通过 UDP 实时图传 DJI Ryze Tello 的摄像头信号。这个时候我们需要通过 libVLC 库对 DJI Ryze Tello 摄像头提供的 UDP 信号进行 H264 编码解码的服务并显示在移动应用的界面上。
在 .NET MAUI 上,我一般通过命令行创建 iOS / Android 原生绑定项目,如下:
dotnet new iosbinding -o VLCSharp.iOS

dotnet new android-bindinglib -o VLCSharp.Droid

绑定 iOS/Android 原生库的技巧

  • 用 Sharpie 做初次转换
我们通过安装 Sharpie 针对 iOS 的 libVLC 库 MobileVLCKit.framework 进行绑定,通过执行以下命令可以快速转换 libVLC 的库。
sharpie bind -framework ./MobileVLCKit.framework --namespace MobileVLCKit -sdk iphoneos16.1

注意:iOS 原生库对应的 iOS 版本,否则你是没办法进行转换。
转换后替换项目中的 StructsAndEnums.cs 和 ApiDefinitions.cs 以及把 MobileVLCKit.framework 添加到 iOS 绑定的项目 VLCSharp.iOS 中
  • 修改 csproj 文件,把原生库依赖的库都需要添加进去
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0-ios</TargetFramework>
<RootNamespace>MobileVLCKit</RootNamespace>
<Nullable>enable</Nullable>
<ImplicitUsings>true</ImplicitUsings>
<IsBindingProject>true</IsBindingProject>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoBindingEmbedding>false</NoBindingEmbedding>
</PropertyGroup>

<ItemGroup>
<ObjcBindingApiDefinition Include="ApiDefinition.cs" />
<ObjcBindingCoreSource Include="StructsAndEnums.cs" />
</ItemGroup>

<ItemGroup>
<NativeReference Include="MobileVLCKit.framework">
<Kind>Framework</Kind>
<IsCxx>True</IsCxx>
<ForceLoad>True</ForceLoad>
<SmartLink>True</SmartLink>
<Frameworks>MediaPlayer Accelerate AssetsLibrary AVFoundation CoreMedia AudioToolbox CoreData CoreMedia CoreSpotlight MobileCoreServices CoreAudio OpenGLES CFNetwork CoreText QuartzCore CoreGraphics UIKit Security StoreKit SystemConfiguration VideoToolbox</Frameworks>
<LinkerFlags>-lbz2 -liconv -lstdc++</LinkerFlags>
</NativeReference>
</ItemGroup>
</Project>

  • 编译,请从 GitHub(https://github.com/kinfey/dotNETMauiHOL/tree/main/code/apps/02.Binding/TelloApp.Bindings/VLCSharp.iOS)下载并替换 StructsAndEnums.cs 和 ApiDefinitions.cs。

替换后编译就成功了

如果希望了解更多 iOS Binding 的知识和相关技巧,你可以通过该链接了解:https://github.com/kinfey/AMapMAUIControls/blob/main/tutorial/cn/01.iOSBinding.md

Android 绑定 libVLC 库相关技巧
  • 创建 Jars 文件夹,把 Android 的 libVLC 的库 org.videolan.libvlc.aar 添加到绑定的项目 Jars 文件夹中

  • 修改 .csproj 文件

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0-android</TargetFramework>
<SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
<LibraryProjectZip Include="Jars\org.videolan.libvlc.aar" />
</ItemGroup>

<ItemGroup>
<TransformFile Include="Transforms\Metadata.xml" />
<TransformFile Include="Transforms\EnumFields.xml" />
<TransformFile Include="Transforms\EnumMethods.xml" />
</ItemGroup>
</Project>

  • 编译,和 iOS ⼀样编译出错,请从 GitHub

(https://github.com/kinfey/dotNETMauiHOL/tree/main/code/apps/02.Binding/TelloApp.Bindings/VLCSharp.Droid)下载并替换 EnumMethods.xml。
替换后,编译成功了。
如果希望了解更多 Android Binding 的知识和相关技巧,你可以通过该链接了解:

https://github.com/kinfey/AMapMAUIControls/blob/main/tutorial/cn/02.DroidBinding.md




自定义界面控件

.NET MAUI 可以通过 Handler 构建自定义界面控件,我们通过 Handler 绑定 LibVLC 实现图传,而且和一般自定义页面控件不同虽然用的都是 libVLC 库,但在不同平台上调用方式以及构建方式是不同的,所以在 Platforms 上需要针对不同的控件来完成定义,分别定义 iOS 文件夹新增 VideoPlayerView.ios.cs , Android 文件夹新增 VideoPlayerView.android.cs。
之后再通过继承 Handler 的类分别调用来完成自定义 VLC 控件的定义。
我们可以无缝把自定义的 VLC 控件添加到我们的应用中,和 Commet UI 是无缝对接的。
new VStack{
new VlcUI().Padding(20).Alignment(Alignment.TopLeading)
}.Frame(width:400,height:300).Alignment(Alignment.Center),
我们可以看看那安卓上的实现效果,通过图传可以实时在应用端获取 DJI Ryze Tello 的摄像头信号
当我们完成页面逻辑和业务逻辑构建后,我们就可以用 .NET MAUI 构建的 iOS / Android 应用快速启动 DJI Ryze Tello ,下图是在 iPhone 控制 DJI Ryze Tello 起降的效果,以及实时图传。




小结

这就是通过 .NET 控制 DJI Ryze Tello 的主要步骤,如果⼤家希望了解更多细节和更详细内容,请访问 https://github.com/kinfey/dotNETMauiHOL , 这⾥⾯包括了完整的学习内容,还有具体细节,希望各位能更好地掌握⽤ .NET MAUI 跨平台应⽤的技巧,做更多有趣的应⽤。你可以按照以下顺序,依次学习相关内容

学习

主题

相关

内容

链接

开发环境配置

开发环境搭建技巧,包括 .NET MAUI 环境的安装 ,开发⼯具的配置以及基于 iOS / Android 应⽤开发要准备的条

https://github.com/kinfey/dotNETMauiHOL/blob/main/cn/01.UDPwithCSharp.md

C# UDP 编程基础

学习 C# UDP 编程 ,以及通过 Notebooks 连接 DJI Ryze Tello ,完成原型开发的搭建

https://github.com/kinfey/dotNETMauiHOL/blob/main/cn/01.UDPwithCSharp.md

.NET MAUI 基础学习

学习 .NET MAUI 的相关知识,包括 iOS / Android 开发的相关知识

https://github.com/kinfey/dotNETMauiHOL/blob/main/cn/02.dotNETMAUIIntro.md

.NET MAUI Comet UI 构建应⽤界⾯

学习 .NET MAUI Comet 的相关知识 , 使⽤ .NET MAUI

Comet构建应⽤界⾯

https://github.com/kinfey/dotNETMauiHOL/blob/main/cn/03.dotNETMAUIComet.md

.NET MAUI 绑定移动应⽤的原⽣库

学习把移动应⽤原⽣库迁移到 .NET MAUI

https://github.com/kinfey/dotNETMauiHOL/blob/main/cn/04.dotNETMAUIBinding.md

.NET MAUI 构建⼀个完整的项⽬技巧

⽤ .NET MAUI 构建⼀个完整项⽬的技巧,包括不同平台的设定以及⾃定义控件等知识

https://github.com/kinfey/dotNETMauiHOL/blob/main/cn/05.dotNETMAUIApps.md



相关文档:

1. ⽤ .NET MAUI 构建 DJI Ryze Tello ⽆⼈机应⽤系列

https://github.com/kinfey/dotNETMauiHOL

2. 学习 .NET MAUI

https://aka.ms/mauiBlog.Learn

3. 关于 .NET Polyglot Notebook

https://aka.ms/mauiBlog.Notebook

4. .NET MAUI 绑定 iOS 原⽣库

https://aka.ms/mauiBlog.iOSBinding

5. .NET MAUI 绑定 Android 原⽣库

https://aka.ms/mauiBlog.DroidBinding

6. .NET MAUI ⾃定义⻚⾯控件

https://aka.ms/mauiBlog.CustomUI

7. C# 调⽤ UDP
https://aka.ms/mauiBlog.UDP

*未经授权请勿私自转载此文章及图片。

谢谢你读完了本文!欢迎在评论区留言分享你的想法,并且转发到朋友圈

长按识别二维码

关注微软开发者MSDN


喜欢记得分享哦~

相关阅读

  • MySQL 与 Redis 缓存的同步方案

  • 「 关注“石杉的架构笔记”,大厂架构经验倾囊相授 」来源:dongshao.blog.csdn.net/article/details/107190925本文介绍MySQL与Redis缓存的同步的两种方案方案1:通过MySQL自动同
  • 笑出腹肌的注释,都是被代码耽误的诗人!

  • 「 关注“石杉的架构笔记”,大厂架构经验倾囊相授 」来源:网络,部分出自 Quora 网友1、这是一个被代码耽误的诗人2、来一份 1987 年的代码看看3、产品经理要对此负责4、不敢看,
  • 华荣紧急驰援内蒙古坍塌露天煤矿

  •   2月22日13时许,内蒙古自治区阿拉善盟阿拉善左旗新井煤业有限公司露天煤矿发生大面积坍塌。事故救援现场  事故发生后,华荣照明立即启动救援一级应急预案,由内蒙古二办事
  • MS-TTS更新:同步官网角色数据、增加全局旁白

  • “设为星标”第一时间获取各类实用干货!主界面v1.9.6.7更新内容更新角色数据:增加多个中文方言角色全局旁白功能:老版本在合成内容,指定角色必须全文指定,否则未指定角色内容不会
  • 免费开源Windows系统错误代码查询工具!

  • “设为星标”第一时间获取各类实用干货!前言大家在使用Windows系统过程中,或多或少都遇到过一些错误,有些错误系统会给出解释,有些错误则只给出对应的错误代码,而这些错误代码代
  • 秘密武器:轻松提高操作效率,快速完成任务!

  • “设为星标”第一时间获取各类实用干货!QuickTextPasteQuickTextPaste 是一款免费、轻量、便携的文本剪贴工具,大小仅几百KB,旨在帮助用户快速、方便地粘贴常用的文本,同时,工具
  • 病毒?不用怕,顶级杀软Plus护你周全!

  • “设为星标”第一时间获取各类实用干货!前言杀毒软件大家都不陌生,最常见的应该就是Win10开始,系统自带的Windows Defender,然后就是非常出名的三六零,或者是近几年势头迅猛的火
  • ChatGPT安卓免注册无限制版,晚了就没了~!

  • “设为星标”第一时间获取各类实用干货!前言这段时间ChatGPT热度一直居高不下,用户数飙升,OpenAI官方已经开始对普通用户使用ChatGPT作出限制,且同时推出了付费会员的PLUS版本,每
  • 那个谁要的,文Ku下载工具,赶紧拿走~!

  • “设为星标”第一时间获取各类实用干货!前言后台有小伙伴私信,想找个文Ku下载工具,小编很早前在公众号给大家推荐过,不过时间过去这么久,应该都不能用了,所以就去网上转了一圈,找到

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 用 .NET 启动你的 DJI Ryze Tello 无人机

  • 点击上方蓝字关注我们(本文阅读时间:15分钟)大疆的 DJI Ryze Tello 是入门级的无人机,不仅在 STEM 教育中有非常广泛的应用,也可以作为编程入门的首选。通过 UDP 协议调用 DJI R
  • 用 Visual Studio 升级 .NET 项目

  • 点击上方蓝字关注我们(本文阅读时间:10分钟)现在,你已可以使用 Visual Studio 将所有 .NET 应用程序升级到最新版本的 .NET!这一功能可以从 Visual Studio 扩展包中获取,它会升级
  • 微软徐明强:谈谈ChatGPT及对技术的重新思考

  • 点击上方蓝字关注我们(本文阅读时间:6分钟)是2023 Microsoft Azure中国区年度技术峰会启幕之际,Azure 云科技推出的专栏。我们邀请了业界富有前瞻视野的技术、业务专家,畅谈行业
  • 紧急提醒:千万不要吃!

  • 吃花季到了!2月27日云南省市场监管局最新提醒谨慎选择食用鲜花不熟悉的花卉千万不要吃!“云南市场监管”微公号↑详情如下:谨慎选择食用鲜花注意食品安全,不识不买。食用鲜花应
  • 正式发布Linux 6.2,支持龙芯 LoongArch 架构

  • 点击上方蓝字 ● 关注Linux公社 这是一个短暂的分支,将仅在几个月内得到错误和安全修复的支持。Linus Torvalds 今天宣布发布 Linux 6.2,这是一个主要的新内核系列,带有新