大疆的 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

通过 Polyglot Notebook 可以完成 .NET 的交互式编程。在用 .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 Notebooks 控制 DJI 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 的现代方式 ( GitHub - dotnet/Comet: Comet is an MVU UIToolkit written in C# )。 基于 .NET MAUI,它采用 Model - Views - Update (MVU) 模式. 和传统的 XAML 相比 , 它有几个显著的特点

  1. 基于函数式编程

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

3. 用 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 绑定 libVLC 库相关技巧

  1. 用 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 中

2. 修改 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>

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

替换后编译就成功了

如果希望了解更多 iOS Binding 的知识和相关技巧,你可以通过该连接了解 AMapMAUIControls/01.iOSBinding.md at main · kinfey/AMapMAUIControls · GitHub

Android 绑定 libVLC 库相关技巧

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

  2. 修改 .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>
  3. 编译,和 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 MAUI 搭建无人机应用

小结

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

学习主题 相关内容 进入
开发环境配置 开发环境搭建技巧,包括 .NET MAUI 环境的安装 ,
开发工具的配置以及基于 iOS / Android 应用开发要准备的条件
进入
C# UDP 编程基础 学习 C# UDP 编程 ,以及通过 Notebooks 连接 DJI Ryze Tello ,
完成原型开发的搭建
进入
.NET MAUI 基础学习 学习 .NET MAUI 的相关知识,包括 iOS / Android 开发的相关知识 进入
.NET MAUI Comet UI 构建应用界面 学习 .NET MAUI Comet 的相关知识 , 使用 .NET MAUI Comet
构建应用界面
进入
.NET MAUI 绑定移动应用的原生库 学习把移动应用原生库迁移到 .NET MAUI 进入
.NET MAUI 构建一个完整的项目技巧 用 .NET MAUI 构建一个完整项目的技巧,包括不同平台的设定
以及自定义控件等知识
进入

相关资源

  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

用 .NET 启动你的 DJI Ryze Tello 无人机相关推荐

  1. 用 .NET 启动你的 大疆 Ryze Tello 无人机

    目录 1..NET UDP 编程 1.什么是 UDP 2.C# 调用 UDP Client 2.用 .NET Polyglot Notebook 连接 DJI Ryze Tello 3.用 .NET ...

  2. Tello无人机马达更换

    在3楼玩这个小飞机的时候作死让它飞出了窗外,然后回来时候没弄好撞墙跳楼了.万幸是只坏了一个马达,打算自己修.逛了一圈淘宝,发现所谓原装的Tello马达要35~39元一个,我觉得有点贵.但是而其他的要同 ...

  3. 通过PC获取Tello无人机视频图像和发送控制命令

    一直想使用电脑控制tello无人机飞行,研究了一天,参考了一下其他博主的方法,系统使用的是Windows 10,需要安装的软件列表如下,运行起来以后发现UDP视频流延时至少半分钟,所以不能通过看视频来 ...

  4. Tello无人机开发

    改造成穿越机, youtube:  https://www.youtube.com/watch?v=EugsZKwPnWg https://github.com/dji-sdk/Tello-Pytho ...

  5. Tello无人机飞控(Python)程序设计

    Tello无人机飞控(Python)程序设计总结 1.py飞控库介绍 tello的几个不同的飞控库有什么区别吗,用哪个好些? Tello的几个不同飞控库主要是针对Python开发者提供的控制无人机的工 ...

  6. 超级简单的大疆tello无人机视频实现(很少代码)

    大疆tello无人机出来有1年时间了,使用pc查看视频的功能也只是今年才开放,经过2天的摸索,终于用简单的方法实现,不敢独享,分享出来. 1.连接tello的wifi: 2.使用udp组件发送打开视频 ...

  7. tello通信_鸿蒙HarmonyOS and 大疆Tello 无人机 BUILD SUCCESS

    鸿蒙HarmonyOS and 大疆Tello 无人机 BUILD SUCCESS 发布于 2020-11-19 18:55 3028浏览 3收藏 利用鸿蒙Hispark WIFI IOT 套件控制大 ...

  8. ROS环境下大疆tello无人机源码安装驱动代码解读

    大疆tello无人机是一款微小型无人机,可以支持多种开发模式.这里用的是ROS1的kinetic版本进行开发.参考文档来自http://wiki.ros.org/tello_driver 1)kine ...

  9. Python 探索 Tello 无人机的奇妙世界

    介绍: 如果您希望使用 Tello 无人机拍摄照片并将其传输到您的 PC,那么您走运了! 只需几行 Python 代码,您就可以轻松控制您的 Tello 拍照,然后将 JPEG 图片传输到您的计算机. ...

最新文章

  1. 城市规划理论1 选址理论
  2. python while循环和双重循环
  3. express登录例子
  4. python operator __gt___Python operator.gt方法代码示例
  5. 安装windows服务提示输入用户名和密码
  6. NLP --- 条件随机场CRF详解
  7. 【Python读csv文件】'gbk' codec can't decode byte 0xb3 in position 73: illegal multibyte sequence
  8. 利用c语言在屏幕上打印出窗口,南开19春学期(1709、1803、1809、1903)《计算机应用基捶在线作业...
  9. python cad模块_Python cad包_程序模块 - PyPI - Python中文网
  10. /etc/rc.d/init.d/leds
  11. Web Proxy Auto-Discovery Service
  12. vue.js中的created()与activated()的用法
  13. 2023年3月份隐私计算市场洞察
  14. 哔哩哔哩2020校园招聘前端笔试卷(一)
  15. O32 对接 交易所报盘软件_沈阳企业“新”社保报盘软件(下载地址)!
  16. 《C#零基础入门之百识百例》(九)位和赋值运算符 -- 2的n次幂
  17. 智能网联汽车 自动驾驶地图数据质量规范
  18. 7628刷breed_自制各类路由原厂直刷Breed的文件,无需修改mac无需重刷无线
  19. JS实现轮播图特效(带二级导航)
  20. 北京2016计算机应用自考,02316自考全国2016年4月计算机应用技术试题.doc

热门文章

  1. 【分享】《小强升职记》读书笔记分享5
  2. Photoshop学习(二十三):文字凸起效果
  3. Python GUI 之 Treeview 学习
  4. 裸辞3个月没工作,害怕面试,害怕HR问我的问题,怎么办?
  5. 搜索框自动补全(模糊匹配)功能实现
  6. Java架构师:概述
  7. 河北大学网络空间安全与计算机学院研究生,河北大学网络空间安全考研难吗
  8. verilog学习 | HDLBits:在线学习答案
  9. 计算机网络(十二)IPv6介绍
  10. ChatGPT指令大全