2.1 移动应用开发与Mobile SDK
移动应用开发就是在移动终端上开发应用程序。2010年左右,以智能手机为代表的移动终端设备迅速崛起,并催生了Android、iOS、Windows Phone等移动操作系统。根据Statista全球统计数据库,2020年7月Android和iOS占全球操作系统份额的74.60%和24.82%,而其他所有操作系统的全球份额总和不超过1%。相应地,Mobile SDK针对这两个操作系统分别推出了Android Mobile SDK和iOS Mobile SDK。
虽然本书尽可能详细地介绍Mobile SDK应用程序的开发流程,但是如果读者没有Android或iOS的相关语言编程和应用开发基础的话,那么首先还是建议读者选购一本移动开发的基础性教程,然后再回过头来继续阅读本书。这样做会更加高效!即使如此,本书尽可能用到最少的Android和iOS应用开发的知识,以便于适合于移动开发入门者阅读。所以,本书中给出的例程并不代表最佳的技术实践,读者可以根据具体需求进行一些适当的调整。例如,在Android开发中,本书并没有使用Fragment,只使用了Activity组织代码,读者可以根据需要将控制代码放入Fragment中,以便于应用的扩展和管理。
本节将首先对移动开发基础知识进行简要的介绍,读者可选择性地阅读并回忆相关内容;然后介绍Mobile SDK及其重要的学习资源,包括官方API文档的结构和查阅方法。
2.1.1 Android应用开发
2008年,Google发布了专为移动设备设计的Android 1.0系统。随后发布的Android 2.x版本迅速崛起,占据了相当一部分移动设备操作系统市场。随后,Android几乎每年都会推出一个新版本,到了2020年,Android的版本已经发展到了Android 11。
Android操作系统自下而上分为Linux内核、硬件抽象层、Android运行时、原生C/C++库、Java API框架和系统应用层等多个层级,如图2-1所示。Android应用程序包括Activity、Service、BroadcastReceiver和ContentProvider四大组件。其中,最为重要的就是Activity,用于控制和显示各种布局与视图。
图2-1 Android操作系统的架构
1. Android应用开发的编程语言
Android应用程序原本只能通过Java语言编写逻辑代码。Java语言起源于1995年,由Sun公司研发并推出,其前身是Oak语言。Java语言最重要的特性就是跨平台性,即“一次编译,处处运行”,这主要得益于Java语言是通过JVM(Java虚拟机)实现的。正因为这一特性,Java语言伴随着互联网的兴起而广泛被人熟知。目前,Java语言主要应用在Web服务器、移动终端和大数据技术。2009年,随着Sun公司被Oracle公司收购,Java这一语言也带上了Oracle的标志。
由于Java语言编写的应用程序需要通过虚拟机才能运行,其效率远低于C、C++等语言。为了提高Android系统的性能,Android底层针对有限内存、低处理器速度对虚拟机进行了优化,并使用了Dalvik虚拟机。即使如此,在Android发展的初期,其性能效率常常被用户诟病。在Android 4.4以来,Google又进一步推出了Art虚拟机,避免了Dalvik在每次运行应用时通过即时编译器转换为机器码的过程,使得其运行效率大大提高,可获得更好的用户体验,并提高了Android系统的性能和续航。
随后,Android的开发语言又加入了Kotlin新成员。Kotlin语言是由JetBrains推出的,参照并兼容Java语言,提高了语言的安全性、简洁性,是一种静态编程语言。目前,Kotlin已经成为Android开发的官方首推的编程语言,并在国际上广为流行。Kotlin不仅仅可以编译成Java字节码,也可以编译成JavaScript,以便于在没有JVM设备上运行。但是,可能是由于项目历史和学习成本的原因,国内开发者对Kotlin语言使用较少。
2. Android集成开发环境
从开发环境的角度来说,Android的开发环境经历了从Eclipse到Android Studio的转变。Android Studio基于Intellij IDEA,相比Eclipse拥有更好的性能与用户体验,成为当今主流的Android IDE。
在本书中,Android无人机应用程序采用Android Studio开发环境,使用Java作为逻辑代码的编程语言。
2.1.2 iOS应用开发
iOS系统应用在苹果公司的iPhone、iPad、iPod等移动设备中,于2007年首次提出(当时称为iPhone OS),在2010年的WWDC大会上将其名称更改为iOS。相对于Android操作系统,iOS操作系统的架构要简单许多,其由Cocoa Touch、Media Layer、Core Services和Core OS四个部分组成,如图2-2所示。
图2-2 iOS操作系统的架构
其中,Foundation框架和UIKit框架最为重要。Foundation框架来源于NEXTSTEP操作系统,因此该框架内部的类都以“NS”开头。常见的类包括字符串类(NSString)、数组类(NSArray)、字典类(NSDictionary)等,其基类都是NSObject类。UIKit框架包含了iOS系统中多种视图和控件,包括文本标签(UILabel)、文本框(UITextField)、按钮(UIButton)等,其类名都以“UI”开头。
1. iOS应用开发的编程语言
Objective-C语言(简称OC语言)诞生于1986年,是一个古老的面向对象编程语言,源于SmallTalk,一度是iOS开发的首选语言。由于Objective-C是C语言的扩充(C语言的严格超集),因此几乎可以与C语言无缝融合。在iOS设备流行之时,Objective-C的占有率一度攀升。
Swift语言于WWDC 2014发布,是可用于iOS应用开发的全新编程语言。为了和Objective-C语言的有效融合,Swift语言建立在Objective-C的基础之上,但是Swift更加简练、易学、高效,并且Swift的执行速度比Objective-C更快。
2. iOS集成开发环境
虽然在GNU/Linux操作系统中gcc包含了Objective-C的编译器,但是由于苹果公司的移动设备都处在闭源的生态系统中,完整的iOS应用开发几乎只能在MacOS系统下的Xcode开发环境中进行。
在本书中,iOS无人机应用程序采用Xcode开发环境,使用Objective-C作为逻辑代码的编程语言。
2.1.3 Mobile SDK及其学习资源
Mobile SDK(MSDK)是用于监测与控制大疆无人机(或手持云台相机)的移动应用程序开发工具包,是大疆SDK中使用最多、对无人机兼容性最强的SDK之一。Mobile SDK包括Android Mobile SDK和iOS Mobile SDK两个组成部分,分别用于在Android和iOS操作系统下搭建无人机应用程序。由于Android Mobile SDK和iOS Mobile SDK的功能与设计理念相似,且均针对大疆无人机而设计,因此其体系结构与类库设计也基本相同。
由于本书重点介绍无人机的二次开发,因此后文在不特别说明的情况下,各项功能均是对无人机的二次开发进行描述。对于大疆手持相机而言,其SDK的使用方式基本类似,在相机类、云台类等的使用上本书也具有一定的参考价值。
1. Mobile SDK的版本历史
Mobile SDK的重要更新历史如下。
• 2016年年初,大疆发布Mobile SDK 3.0版本,其基本架构和类库设计基本定型,移除了对精灵2 Vision+的支持,开始支持精灵3以来的大疆无人机。
• 2017年3月,大疆发布Mobile SDK 4.0版本。一方面提供了UI Library类库(UX SDK的前身),用于快速构建移动应用程序;另一方面重构了任务管理方式,并引入了任务控制(Mission Control)、时间线(Timeline)、触发器(Trigger)等新的概念,提高任务管理的易用性与健壮性。
• 2018年4月,大疆发布Mobile SDK 4.5版本,将UI Library从Mobile SDK剥离,成为单独的UX SDK。
2. Mobile SDK的特点
Mobile SDK具有以下3个重要的特点。
1)需要复杂的无人机理论知识即可着手开发
由于Mobile SDK是建立在移动终端平台基础上的SDK,因此封装并隐藏了大量的控制细节,将最为简单直接的控制代码暴露在基于Android和iOS平台之上的类与方法中。因此,对于移动应用开发者而言,只需要简单地学习一些无人机基础常识即可着手开发,非常适合于不具有无人机开发背景的移动开发工程师。
2)充分体现了面向对象思想
Mobile SDK主要用于大疆无人机的监测与控制,而无人机是真实世界中由人类创造的具有一定结构的机械设备。大疆无人机具有功能分明的组件和结构,因此其非常利于抽象,自然而然地形成Mobile SDK中的类与实例。不同于其他纯软件的SDK,大疆Mobile SDK中许多类并不是冷冰冰的,而是触手可及的物件。例如,无人机类(Aircraft)、相机类(Camera)和云台类(Gimbal)等这些名词我们一说就知道是什么,属于无人机上的什么组件。而其中的起飞方法、拍照方法也非常容易理解。面向对象的程序设计思想在Mobile SDK中表现得淋漓尽致。
3)大量的异步与回调
Mobile SDK所控制的飞行器硬件与我们的移动设备之间存在着物理距离,信息和指令均通过无线电信号传递,因而容易受到电磁干扰、环境遮挡等因素的影响。因此,当我们调用一个Mobile SDK方法时并不一定能够实时响应,这个特点有点类似于网络开发:调用程序所返回的结果往往通过异步的方式传递回来。例如,在Android中,Mobile SDK通过回调接口与方法的手段隐藏了大量的异步方法;在iOS中,Mobile SDK通过定义代理(Delegate)和Block语句传递回调结果。另外,为了实时获取无人机的状态参数,Mobile SDK包含了非常多的监听器设计模式,以便于开发和调试。
3. Mobile SDK的学习资源
Mobile SDK的学习资源包括Mobile SDK API文档、Mobile SDK官方教程、大疆开发者论坛、DJI SDK Github、DJI SDK StackOverflow等。
1)Mobile SDK API文档
为了更好地掌握Mobile SDK,学会使用大疆官方的API文档是非常重要的。在使用Mobile SDK中,如果读者对某些类或方法出现了疑问,那么绝大多数情况下都可以在大疆官方的API文档中找到(见图2-3和图2-4)。这里介绍这些API文档的组织方法和查阅方法。
图2-3 Android Mobile SDK的API文档
图2-4 iOS Mobile SDK的API文档
❀ Android Mobile SDK的在线API文档地址如下:
https://developer.dji.com/api-reference/ios-api/index.html
iOS Mobile SDK的在线API文档地址如下:
https://developer.dji.com/api-reference/android-api/index.html
Mobile SDK的类按照以下几个部分进行组织。
• MANAGER CLASSES:管理器类,用于软件注册、用户认证、禁飞区解锁等全局性的操作。
• BASE CLASSES:基本类库,包括产品基类和组件基类。
• PRODUCT CLASSES:产品类,包括无人机产品类和手持云台相机产品类。
• COMPONENT CLASSES:组件类,包括产品的各种组件类。
• MISSION CLASSES:任务类,包括各种任务类和任务控制器类。
• MISC CLASSES:其他类,Mobile SDK所涉及的其他类。
在每一个类的页面中,介绍了类的基本信息、成员属性和方法,以及相关的其他类等。在类描述介绍的最上方灰色框中展示了类的基本定义签名,其他的内容如下。
• Package:所在包名(仅Android)。
• Header:头文件名称(仅iOS)。
• Inherits From:该类的父类。Mobile SDK中所有的类均为单继承,因此只能有一个父类。在iOS中,绝大多数的类的基类为NSObject。
• Description:类的描述说明。
• Class Members:类成员,包括属性(property)和方法(method)等。单击成员即可查看到该成员的具体签名和使用说明。
• Inherited Methods:继承父类的方法。
• Related:与该类相关的其他类(class)、接口(interface)、枚举(enum)等。
2)Mobile SDK官方教程
Mobile SDK官方教程包括了Mobile SDK的基本用法和若干例程,是提供给具备iOS或Android平台开发经验的开发者的基础性知识内容,包含概览、马上开始构建应用、开发流程指引、基本概念与组件介绍和平台开发教程等。除详细说明如何使用Mobile SDK外,本文档还介绍并对比了各产品的特性,以及可以运用的关键技术。Mobile SDK官方教程的页面地址如下:https://developer.dji.com/cn/document/564303df-00e8-446f-a468-b75aa5d4eacc。
在Mobile SDK官方教程中,平台开发教程目前仅包括英文版本,其主要的内容如下。
• 应用程序激活与无人机绑定。
• 拍照录像功能实现。
• 照片视频回放功能实现(仅iOS)。
• Media Manager功能实现。
• 地图与航点任务功能实现。
• 指点飞行与主动跟随功能实现。
• Simulator模拟器功能实现。
• GEO地理围栏系统介绍与功能实现。
• DJI Bridge调试应用介绍(仅iOS)。
• 远程调试工具介绍(仅iOS)。
• 全景应用功能实现(仅iOS)。
3)大疆开发者论坛
在使用Mobile SDK的过程中,如果出现上述API文档和官方教程无法解决的较为复杂和个性化的问题,可尝试在开发者论坛中进行讨论。大疆开发者论坛包括中文和英文两个版本,其网站地址分别如下。
• 大疆开发者中文论坛:https://bbs.dji.com/forum-79-1.html?from=developer
• 大疆开发者英文论坛:https://forum.dji.com/forum-139-1.html?from=developer
4)DJI SDK Github与DJI SDK StackOverflow
在大疆的Github仓库中,可以找到Mobile SDK的官方示例工程(Sample code),以及在Mobile SDK官方教程中所完成的工程代码。读者也可尝试在大疆的Github仓库中提出issue以解决问题。大疆的Github仓库的地址为https://github.com/dji-sdk。
在大疆的StackOverflow中,读者也可以尝试提出Mobile SDK相关的问题与官方和其他开发者共同讨论。读者可在以下网址中找到DJI SDK的相关问题:https://stackoverflow.com/questions/tagged/dji-sdk。
另外,读者可以直接将学习中所遇到的问题通过大疆开发者官方邮箱(dev@dji.com)进行沟通和处理。