`

WWDC 2013 Session笔记 - iOS7中的多任务

    博客分类:
  • ios
 
阅读更多

iOS7的后台多任务特性

这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览。本文仅作为个人记录使用,也欢迎在许可协议范围内转载或使用,但是还烦请保留原文链接,谢谢您的理解合作。如果您觉得本站对您能有帮助,您可以使用RSS邮件方式订阅本站,这样您将能在第一时间获取本站信息。

本文涉及到的WWDC2013 Session有

  • Session 204 What's New with Multitasking
  • Session 705 What’s New in Foundation Networking

iOS7以前的Multitasking

iOS的多任务是在iOS4的时候被引入的,在此之前iOS的app都是按下Home键就被干掉了。iOS4虽然引入了后台和多任务,但是实际上是伪多任务,一般的app后台并不能执行自己的代码,只有少数几类服务在通过注册后可以真正在后台运行,并且在提交到AppStore的时候也会被严格审核是否有越权行为,这种限制主要是出于对于设备的续航和安全两方面进行的考虑。之后经过iOS5和6的逐渐发展,后台能运行的服务的种类虽然出现了增加,但是iOS后台的本质并没有变化。在iOS7之前,系统所接受的应用多任务可以大致分为几种:

  • 后台完成某些花费时间的特定任务
  • 后台播放音乐等
  • 位置服务
  • IP电话(VoIP)
  • Newsstand

在WWDC 2013的keynote上,iOS7的后台多任务改进被专门拿出来向开发者进行了介绍,到底iOS7里多任务方面有什么新的特性可以利用,如何使用呢?简单来说,iOS7在后台特性方面有很大改进,不仅改变了以往的一些后台任务处理方式,还加入了全新的后台模式,本文将针对iOS7中新的后台特性进行一些学习和记录。大体来说,iOS7后台的变化在于以下四点:

  • 改变了后台任务的运行方式
  • 增加了后台获取(Background Fetch)
  • 增加了推送唤醒(静默推送,Silent Remote Notifications)
  • 增加了后台传输(Background Transfer Service)

iOS7的多任务

后台任务

首先看看后台任务的变化,先说这方面的改变,而不是直接介绍新的API,是因为这个改变很典型地代表了iOS7在后台任务管理和能耗控制上的大体思路。从上古时期开始(其实也就4.0),UIApplication提供了-beginBackgroundTaskWithExpirationHandler:方法来使app在被切到后台后仍然能保持运行一段时间,app可以用这个方法来确保一些很重很慢的工作可以在急不可耐的用户将你的应用扔到后台后还能完成,比如编码视频,上传下载某些重要文件或者是完成某些数据库操作等,虽然时间不长,但在大多数情况下勉强够用。如果你之前没有使用过这个API的话,它使用起来大概是长这个样子的:

- (void) doUpdate

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [self beginBackgroundUpdateTask];

        NSURLResponse * response = nil;
        NSError  * error = nil;
        NSData * responseData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];

        // Do something with the result

        [self endBackgroundUpdateTask];
    });
}

- (void) beginBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void) endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}    

beginBackgroundTaskWithExpirationHandler:里写一个超时处理(系统只给app分配了一定时间来进行后台任务,超时之前会调用这个block),然后进行开始进行后台任务处理,在任务结束或者过期的时候call一下endBackgroundTask:使之与begin方法配对(否则你的app在后台任务超时的时候会被杀掉)。同时,你可以使用UIApplication实例的backgroundTimeRemaining属性来获取剩余的后台执行时间。

具体的执行时间来说,在iOS6和之前的系统中,系统在用户退出应用后,如果应用正在执行后台任务的话,系统会保持活跃状态直到后台任务完成或者是超时以后,才会进入真正的低功耗休眠状态。

iOS6之前的后台任务处理

而在iOS7中,后台任务的处理方式发生了改变。系统将在用户锁屏后尽快让设备进入休眠状态,以节省电力,这时后台任务是被暂停的。之后在设备在特定时间进行系统应用的操作被唤醒(比如检查邮件或者接到来电等)时,之前暂停的后台任务将一起进行。就是说,系统不会专门为第三方的应用保持设备处于活动状态。如下图示

iOS7的后台任务处理

这个变化在不减少应用的后台任务时间长度的情况下,给设备带来了更多的休眠时间,从而延长了续航。对于开发者来说,这个改变更多的是系统层级的变化,对于非网络传输的任务来说,保持原来的用法即可,新系统将会按照新的唤醒方式进行处理;而对于原来在后台做网络传输的应用来说,苹果建议在iOS7中使用NSURLSession,创建后台的session并进行网络传输,这样可以很容易地利用更好的后台传输API,而不必受限于原来的时长,关于这个具体的我们一会儿再说。

后台获取(Background Fetch)

现在的应用无法在后台获取信息,比如社交类应用,用户一定需要在打开应用之后才能进行网络连接,获取新的消息条目,然后才能将新内容呈现给用户。说实话这个体验并不是很好,用户在打开应用后必定会有一段时间的等待,每次皆是如此。iOS7中新加入的后台获取就是用来解决这个不足的:后台获取干的事情就是在用户打开应用之前就使app有机会执行代码来获取数据,刷新UI。这样在用户打开应用的时候,最新的内容将已然呈现在用户眼前,而省去了所有的加载过程。想想看,没有加载的网络体验的世界,会是怎样一种感觉。这已经不是smooth,而是真的amazing了。

那具体应该怎么做呢?一步一步来:

启用后台获取

首先是修改应用的Info.plist,在UIBackgroundModes中加入fetch,即可告诉系统应用需要后台获取的权限。另外一种更简单的方式,得益于Xcode5的Capabilities特性(参见可以参见我之前的一篇WWDC2013笔记 Xcode5和ObjC新特性),现在甚至都不需要去手动修改Info.plist来进行添加了,打开Capabilities页面下的Background Modes选项,并勾选Background fetch选项即可(如下图)。

在Capabilities中开启Background Modes

笔者写这篇文章的时候iOS7还没有上市,也没有相关的审核资料,所以不知道如果只是在这里打开了fetch选项,但却没有实现的话,应用会不会无法通过审核。但是依照苹果一贯的做法来看,如果声明了需要某项后台权限,但是结果却没有相关实现的话,被拒掉的可能性还是比较大的。因此大家尽量不要拿上线产品进行实验,而应当是在demo项目里研究明白以后再到上线产品中进行实装。

设定获取间隔

对应用的UIApplication实例设置获取间隔,一般在应用启动的时候调用以下代码即可:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

如果不对最小后台获取间隔进行设定的话,系统将使用默认值UIApplicationBackgroundFetchIntervalNever,也就是永远不进行后台获取。当然,-setMinimumBackgroundFetchInterval:方法接受的是NSTimeInterval,因此你也可以手动指定一个以秒为单位的最小获取间隔。需要注意的是,我们都已经知道iOS是一个非常霸道为我独尊的系统,因此自然也不可能让一介区区第三方应用来控制系统行为。这里所指定的时间间隔只是代表了“在上一次获取或者关闭应用之后,在这一段时间内一定不会去做后台获取”,而真正具体到什么时候会进行后台获取,那~完全是要看系统娘的心情的~我们是无从得知的。系统将根据你的设定,选择比如接收邮件的时候顺便为你的应用获取一下,或者也有可能专门为你的应用唤醒一下设备。作为开发者,我们应该做的是为用户的电池考虑,尽可能地选择合适自己应用的后台获取间隔。设置为UIApplicationBackgroundFetchIntervalMinimum的话,系统会尽可能多尽可能快地为你的应用进行后台获取,但是比如对于一个天气应用,可能对实时的数据并不会那么关心,就完全不必设置为UIApplicationBackgroundFetchIntervalMinimum,也许1小时会是一个更好的选择。新的Mac OSX 10.9上已经出现了功耗监测,用于让用户确定什么应用是能耗大户,有理由相信同样的东西也可能出现在iOS上。如果不想让用户因为你的应用是耗电大户而怒删的话,从现在开始注意一下应用的能耗还是蛮有必要的(做绿色环保低碳的iOS app,从今天开始~)。

实现后台获取代码并通知系统

在完成了前两步后,只需要在AppDelegate里实现-application:performFetchWithCompletionHandler:就行了。系统将会在执行fetch的时候调用这个方法,然后开发者需要做的是在这个方法里完成获取的工作,然后刷新UI,并通知系统获取结束,以便系统尽快回到休眠状态。获取数据这是应用相关的内容,在此不做赘述,应用在前台能完成的工作在这里都能做,唯一的限制是系统不会给你很长时间来做fetch,一般会小于一分钟,而且fetch在绝大多数情况下将和别的应用共用网络连接。这些时间对于fetch一些简单数据来说是足够的了,比如微博的新条目(大图除外),接下来一小时的天气情况等。如果涉及到较大文件的传输的话,用后台获取的API就不合适了,而应该使用另一个新的文件传输的API,我们稍后再说。类似前面提到的后台任务完成时必须通知系统一样,在在获取完成后,也必须通知系统获取完成,方法是调用-application:performFetchWithCompletionHandler:的handler。这个CompletionHandler接收一个UIBackgroundFetchResult作为参数,可供选择的结果有UIBackgroundFetchResultNewData,UIBackgroundFetchResultNoData,UIBackgroundFetchResultFailed三种,分别表示获取到了新数据(此时系统将对现在的UI状态截图并更新App Switcher中你的应用的截屏),没有新数据,以及获取失败。写一个简单的例子吧:

//File: YourAppDelegate.m
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    UINavigationController *navigationController = (UINavigationController*)self.window.rootViewController;

    id fetchViewController = navigationController.topViewController;
    if ([fetchViewController respondsToSelector:@selector(fetchDataResult:)]) {
        [fetchViewController fetchDataResult:^(NSError *error, NSArray *results){
            if (!error) {
                if (results.count != 0) {
                    //Update UI with results.
                    //Tell system all done.
                    completionHandler(UIBackgroundFetchResultNewData);
                } else {
                    completionHandler(UIBackgroundFetchResultNoData);
                }
            } else {
                completionHandler(UIBackgroundFetchResultFailed);
            }
        }];
    } else {
        completionHandler(UIBackgroundFetchResultFailed);
    }
}

当然,实际情况中会比这要复杂得多,用户当前的ViewController是否合适做获取,获取后的数据如何处理都需要考虑。另外要说明的是上面的代码在获取成功后直接在appDelegate里更新UI,这只是为了能在同一处进行说明,但却是不正确的结构。比较好的做法是将获取和更新UI的业务逻辑都放到fetchViewController里,然后向其发送获取消息的时候将completionHandler作为参数传入,并在fetchViewController里完成获取结束的报告。

另一个比较神奇的地方是系统将追踪用户的使用习惯,并根据对每个应用的使用时刻给一个合理的fetch时间。比如系统将记录你在每天早上9点上班的电车上,中午12点半吃饭时,以及22点睡觉前会刷一下微博,只要这个习惯持续个三四天,系统便会将应用的后台获取时刻调节为9点,12点和22点前一点。这样在每次你打开应用都直接有最新内容的同时,也节省了电量和流量。

后台获取的调试

既然是系统决定的fetch,那我们要如何测试写的代码呢?难道是将应用退到后台,然后安心等待系统进行后台获取么?当然不是...Xcode5为我们提供了两种方法来测试后台获取的代码。一种是从后台获取中启动应用,另一种是当应用在后台时模拟一次后台推送。

对于前者,我们可以新建一个Scheme来专门调试从后台启动。点击Xcode5的Product->Scheme->Edit Scheme(或者直接使用快捷键⌘<)。在编辑Scheme的窗口中点Duplicate Scheme按钮复制一个当前方案,然后在新Scheme的option中将Background Fetch打上勾。从这个Scheme来运行应用的时候,应用将不会直接启动切入前台,而是调用后台获取部分代码并更新UI,这样再点击图标进入应用时,你应该可以看到最新的数据和更新好的UI了。

更改Scheme的选项为从后台获取事件中启动

另一种是当应用在后台时,模拟一次后台获取。这个比较简单,在app调试运行时,点击Xcode5的Debug菜单中的Simulate Background Fetch,即可模拟完成一次获取调用。

推送唤醒(Remote Notifications)

远程推送(Remote Push Notifications)可以说是增加用户留存率的不二法则,在iOS6和之前,推送的类型是很单一的,无非就是显示标题内容,指定声音等。用户通过解锁进入你的应用后,appDelegate中通过推送打开应用的回调将被调用,然后你再获取数据,进行显示。这和没有后台获取时的打开应用后再获取数据刷新的问题是一样的。在iOS7中这个行为发生了一些改变,我们有机会使设备在接收到远端推送后让系统唤醒设备和我们的后台应用,并先执行一段代码来准备数据和UI,然后再提示用户有推送。这时用户如果解锁设备进入应用后将不会再有任何加载过程,新的内容将直接得到呈现。

实装的方法和刚才的后台获取比较类似,还是一步步来:

启用推送唤醒

和上面的后台获取类似,更改Info.plist,在UIBackgroundModes下加入remote-notification即可开启,当然同样的更简单直接的办法是使用Capabilities。

更改推送的payload

在iOS7中,如果想要使用推送来唤醒应用运行代码的话,需要在payload中加入content-available,并设置为1。

aps {  
     content-available: 1
     alert: {...}
   }



实现推送唤醒代码并通知系统

最后在appDelegate中实现-application:didReceiveRemoteNotification:fetchCompletionHandle:。这部分内容和上面的后台获取部分完全一样,在此不再重复。

一些限制和应用的例子

因为一旦推送成功,用户的设备将被唤醒,因此这类推送不可能不受到限制。Apple将限制此类推送的频率,当频率超过一定限制后,带有content-available标志的推送将会被阻塞,以保证用户设备不被频繁唤醒。按照Apple的说法,这个频率在一小时内个位数次的推送的话不会有太大问题。

Apple给出了几个典型的应用情景,比如一个电视节目类的应用,当用户标记某些剧目为喜爱时,当这些剧有更新时,可以给用户发送静默的唤醒推送通知,客户端在接到通知后检查更新并开始后台下载(注意后台下载的部分绝对不应该在推送回调中做,而是应该使用新的后台传输服务,后面详细介绍)。下载完成后发送一个本地推送告知用户新的内容已经准备完毕。这样在用户注意到推送并打开应用的时候,所有必要的内容已经下载完毕,UI也将切换至用户喜爱的剧目,用户只需要点击播放即可开始真正使用应用,这绝对是无比顺畅和优秀的体验。另一种应用情景是文件同步类,比如用户标记了一些文件为需要随时同步,这样用户在其他设备或网页服务上更改了这些文件时,可以发送静默推送然后使用后台传输来保持这些文件随时是最新。

如果您是一路看下来的话,不难发现其实后台获取和静默推送在很多方面是很类似的,特别是实现和处理的方式,但是它们适用的情景是完全不同的。后台获取更多地使用在泛数据模式下,也即用户对特定数据并不是很关心,数据应该被更新的时间也不是很确定,典型的有社交类应用和天气类应用;而静默推送或者是推送唤醒更多地应该是用户感兴趣的内容发生更新时被使用,比如消息类应用和内容型服务等。根据不同的应用情景,选择合适的后台策略(或者混合使用两者),以带给用户绝佳体验,这是Apple所期望iOS7开发者做到的。

后台传输(Background Transfer Service)

iOS6和之前,iOS应用在大块数据的下载这一块限制是比较多的:只有应用在前台时能保持下载(用户按Home键切到后台或者是等到设备自动休眠都可能中止下载),在后台只有很短的最多十分钟时间可以保持网络连接。如果想要完成一个较大数据的下载,用户将不得不打开你的app并且基本无所事事。很多这种时候,用户会想要是在下载的时候能切到别的应用刷刷微博或者玩玩游戏,然后再切回来的就已经下载完成了的话,该有多好。iOS7中,这可以实现了。iOS7引入了后台传输的相关方式,用来保证应用退出后数据下载或者上传能继续进行。这种传输是由iOS系统进行管理的,没有时间限制,也不要求应用运行在前台。

想要实现后台传输,就必须使用iOS7的新的网络连接的类,NSURLSession。这是iOS7中引入用以替代陈旧的NSURLConnection的类,著名的AFNetworking甚至不惜从底层开始完全重写以适配iOS7和NSURLSession(参见这里),NSURLSession的重要性可见一斑。在这里我主要只介绍NSURLSession在后台传输中的一些使用,关于这个类的其他用法和对原有NSURLConnection的加强,只做稍微带过而不展开,有兴趣深入挖掘和使用的童鞋可以参看Apple的文档(或者更简单的方式是使用AFNetworking来处理网络相关内容,而不是直接和CFNetwork框架打交道)。

步骤和例子

后台传输的的实现也十分简单,简单说分为三个步骤:创建后台传输用的NSURLSession对象;向这个对象中加入对应的传输的NSURLSessionTask,并开始传输;在实现appDelegate里实现-application:handleEventsForBackgroundURLSession:completionHandler:方法,以刷新UI及通知系统传输结束。接下来结合代码来看一看实际的用法吧~

首先我们需要一个用于后台下载的session:

- (NSURLSession *)backgroundSession
{
    //Use dispatch_once_t to create only one background session. If you want more than one session, do with different identifier
    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.yourcompany.appId.BackgroundSession"];
        session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    });
    return session;
}

这里创建并配置了NSURLSession,将其指定为后台session并设定delegate。

接下来向其中加入对应的传输用的NSURLSessionTask,并启动下载。

//@property (nonatomic) NSURLSession *session;
//@property (nonatomic) NSURLSessionDownloadTask *downloadTask;

- (NSURLSession *)backgroundSession
{
    //...
}

- (void) beginDownload
{
    NSURL *downloadURL = [NSURL URLWithString:DownloadURLString];
    NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL];
    self.session = [self backgroundSession];
    self.downloadTask = [self.session downloadTaskWithRequest:request];
    [self.downloadTask resume];
}

最后一步是在appDelegate中实现-application:handleEventsForBackgroundURLSession:completionHandler:

//AppDelegate.m
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier
  completionHandler:(void (^)())completionHandler
{
    //Check if all transfers are done, and update UI
    //Then tell system background transfer over, so it can take new snapshot to show in App Switcher
    completionHandler();

    //You can also pop up a local notification to remind the user
    //...
}

NSURLSession和对应的NSURLSessionTask有以下重要的delegate方法可以使用:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                              didFinishDownloadingToURL:(NSURL *)location;
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                           didCompleteWithError:(NSError *)error;

一旦后台传输的状态发生变化(包括正常结束和失败)的时候,应用将被唤醒并运行appDelegate中的回调,接下来NSURLSessionTask的委托方法将在后台被调用。虽然上面的例子中直接在appDelegate中call了completionHandler,但是实际上更好的选择是在appDelegate中暂时持有completionHandler,然后在NSURLSessionTask的delegate方法中检查是否确实完成了传输并更新UI后,再调用completionHandler。另外,你的应用到现在为止只是在后台运行,想要提醒用户传输完成的话,也许你还需要在这个时候发送一个本地推送(记住在这个时候你的应用是可以执行代码的,虽然是在后台),这样用户可以注意到你的应用的变化并回到应用,并开始已经准备好数据和界面。

一些限制

首先,后台传输只会通过wifi来进行,用户大概也不会开心蜂窝数据的流量被后台流量用掉。后台下载的时间与以前的关闭应用后X分钟的模式不一样,而是为了节省电力变为离散式的下载,并与其他后台任务并发(比如接收邮件等)。另外还需要注意的是,对于下载后的内容不要忘记写到应用的目录下(一般来说这种可以重复获得的内容应该放到cache目录下),否则如果由于应用完全退出的情况导致没有保存到可再次访问的路径的话,那可就白做工了。

后台传输非常适合用于文件,照片或者追加游戏内容关卡等的下载,如果配合后台获取或者静默推送的话,相信可以完全很多很有趣,并且以前被限制而无法实现的功能。

分享到:
评论

相关推荐

    WWDC:您没有时间亲自观看所有WWDC会话视频吗? 没问题,我和许多贡献者都为您提取了要点:partying_face:

    5. **tvOS**:Apple TV的操作系统tvOS也有可能得到升级,可能涉及更好的多任务处理、更多定制化选项,以及对第三方应用的进一步支持。 6. **watchOS**:针对Apple Watch的watchOS更新,可能会包含新的健康追踪功能...

    Swift语言指南.pdf

    对于想要深入了解Swift的开发者,可以参考WWDC14Session402的学习笔记以及Swift与Objective-C混编的高级教程,这些内容覆盖了创建和调用混编框架的方法,有助于理解Swift与Objective-C之间的互操作性。同时,通过...

    实训商业源码-单个商品销售系统源码-毕业设计.zip

    实训商业源码-单个商品销售系统源码-毕业设计.zip

    基于KEALC编程的变压器智能温度监控系统设计与实现

    内容概要:本文详细介绍了基于KEALC编程的变压器温度实时检测与报警系统的开发过程。系统采用51单片机为核心控制器,利用DS18B20传感器测量变压器顶层油温和绕组温度,并通过LCD显示屏实时显示温度值。当温度超过设定阈值时,系统将触发报警机制,包括点亮LED灯和启动蜂鸣器。若温度达到危险水平,则自动切断继电器进行保护。文中还讨论了Proteus仿真的具体步骤、Altium Designer (AD)绘制电路图的注意事项以及实际部署中的优化措施。此外,文章强调了温度阈值的可配置性和防误报的设计思路。 适合人群:具有一定电子电路和嵌入式系统基础知识的技术人员,特别是从事电力设备维护和自动化控制系统开发的专业人士。 使用场景及目标:适用于需要对变压器温度进行精确监控的应用场合,确保变压器安全稳定运行,预防因温度过高引发的安全事故。目标是提供一种高效可靠的温度监控解决方案,保障电力设备的长期可靠运行。 其他说明:文中提供的代码片段展示了关键的报警逻辑和温度采集算法,有助于读者理解和实现类似项目。同时,文中提到的实际部署经验和优化建议对于提高系统的稳定性和可靠性具有重要指导意义。

    nacos-server-2.2.2.tar包及使用

    环境准备:Nacos 依赖 Java 环境运行,需确保安装了 64 位 JDK 1.8+。 解压安装包:在 Linux 系统中,使用命令 tar -zxvf nacos-server-2.2.2.tar.gz 解压到指定目录,如 /usr/local/nacos

    Advanced RF Board Skills in ADS.pdf

    Advanced RF Board Skills in ADS

    你好你好是多少多少多少多少多少

    你好你好是多少多少多少多少多少

    地球物理勘探基于MATLAB的射线追踪算法实现:地质结构正向建模与数据保存系统设计

    内容概要:本文档主要描述了一个基于MATLAB的射线追踪实验流程。首先定义了射线追踪结果的输出文件名为'synthetic_rays.mat',并加载了必要的观测点几何数据和正向模型数据。接着设置了射线追踪的相关参数,包括标志位、步长以及最大追踪步数等。然后通过调用mFAST_raytracing函数执行射线追踪操作,获取计算时间、成功索引和射线轨迹等结果。最后将射线追踪结果保存为.mat文件,并将射线传播时间分别保存为.mat文件和文本文件。; 适合人群:具备一定MATLAB基础,从事地质勘探、地球物理等相关领域的科研人员或学生。; 使用场景及目标:①进行地下结构成像研究;②模拟地震波传播路径;③验证正向模型准确性。; 阅读建议:此文档详细记录了射线追踪实验的具体步骤,在阅读时应重点关注参数设置部分,并结合实际应用场景调整相关参数值,同时注意保存结果的不同格式以满足不同需求。

    实训商业源码-城市生活服务分类手机页面模板-毕业设计.zip

    实训商业源码-城市生活服务分类手机页面模板-毕业设计.zip

    三菱FX5U PLC四轴定位控制系统设计与实现:涵盖参数设定、触摸屏集成及多模式控制

    内容概要:本文详细介绍了三菱FX5U PLC在四轴定位控制项目中的应用,涵盖了从参数设定到触摸屏程序整合的完整流程。首先,项目概述了使用三菱FX5U PLC作为核心控制器,负责四个轴的定位控制,并通过威纶通触摸屏实现人机交互。接下来,文章逐步讲解了公共参数设定、回原点功能、JOG手动控制、绝对和相对定位控制、多种控制模式(手动、自动、暂停)、IO表与电气选型清单、威纶通触摸屏程序开发以及电路图(EPLAN)绘制。每个环节都体现了PLC在工业自动化中的关键作用。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要深入了解PLC编程和四轴定位控制的人群。 使用场景及目标:适用于需要设计和实现四轴定位控制系统的工程项目,帮助工程师掌握PLC编程技巧,提高系统稳定性和精度。同时,也为实际项目提供了一个完整的参考模板。 其他说明:本文不仅提供了理论指导,还包括具体的实现细节和实例,有助于读者更好地理解和应用相关技术。

    蓝牙技术蓝牙4.2无线连接技术升级:速度、距离、功耗与安全性能提升及应用场景扩展综述

    内容概要:本文详细介绍了蓝牙4.2技术的发展背景、主要性能提升及其广泛应用场景。蓝牙技术自1994年由爱立信公司启动探索,经历了多个版本的迭代升级。蓝牙4.2在2014年底发布,在数据传输速度、传输距离、功耗和安全性能四个方面实现了显著提升,最大传输速度达到2.5Mbps,传输距离扩展到50米,功耗进一步降低,并引入了AES-CCM算法和数字签名等安全功能。这些改进使得蓝牙4.2在智能穿戴设备、智能家居、物联网等多个领域得到广泛应用。此外,文章还对比了蓝牙4.2与蓝牙4.0、蓝牙5.0及更高版本的差异,指出了如何挑选合适的蓝牙4.2设备,并展望了其未来在智能家居、工业物联网、虚拟现实等领域的应用前景。; 适合人群:对无线通信技术感兴趣的科技爱好者、智能家居和物联网从业者、以及希望了解蓝牙技术发展历程和最新进展的普通用户。; 使用场景及目标:①了解蓝牙技术的历史和发展趋势;②掌握蓝牙4.2相较于其他版本的具体改进;③学习如何根据需求选择合适的蓝牙4.2设备;④探索蓝牙4.2在不同领域的应用潜力。; 其他说明:蓝牙4.2虽然在某些性能上不如后续版本,但在许多对性能要求适中的场景中仍具有重要地位。未来,蓝牙4.2将继续在智能家居、工业物联网等领域发挥重要作用,并随着技术进步不断拓展新的应用场景。

    .1- 2025-5-09

    .1- 2025-5-09

    【嵌入式系统】STM32F407ZET6 GPIO接口详解:输入输出模式与应用实例介绍文档的主要内容

    内容概要:本文档详细介绍了STM32F407ZET6的GPIO(通用输入输出接口)。GPIO在输出模式下能控制端口输出高低电平,适用于驱动LED、控制蜂鸣器等;在输入模式下可读取端口的高低电平或电压,如读取按键输入、ADC电压采集等。每个通用I/O端口包含多个32位配置寄存器、数据寄存器等。文档列举了GPIO的八个功能模式,重点解析了输出状态中的推挽输出和开漏输出,以及输入状态中的下拉电阻和上拉电阻的概念与工作原理。推挽输出可输出高低电平,由两个互补的晶体管提供较大电流驱动;开漏输出通常只能输出低电平,适合电平转换。输入状态方面,下拉电阻将信号初始化为低电平,上拉电阻则初始化为高电平,其本质分别是输出和注入电流。; 适合人群:嵌入式系统开发人员、电子工程师、对STM32微控制器有兴趣的学习者。; 使用场景及目标:①帮助开发者理解STM32F407ZET6的GPIO工作机制;②为实际项目中GPIO的应用提供理论指导,如控制外部设备、读取传感器数据等。; 其他说明:文档提供了详尽的寄存器配置信息和功能模式介绍,有助于深入理解和灵活运用GPIO接口。建议读者结合实际硬件操作进行学习,以加深理解。

    PHP编程PHP语言教程与项目实战:从基础语法到进阶开发全流程指南

    内容概要:本文全面介绍了PHP语言,涵盖从基础知识到项目实战的多个方面。首先概述了PHP的特点及其在Web开发领域的应用,接着详细讲解了环境搭建的方法,包括Web服务器、PHP安装和数据库配置。文档深入浅出地阐述了PHP的基础语法,如变量、数据类型、控制结构、函数和数组操作。通过用户登录系统和数据展示页面两个实战案例,展示了PHP在实际项目中的应用,涉及数据库交互、会话管理和页面渲染。进一步探讨了进阶项目的开发流程,强调了需求分析、技术选型、MVC模式的重要性,并介绍了部署与优化的技巧。最后,推荐了主流框架(如Laravel、Symfony)、开发工具以及学习资源,帮助读者提升PHP开发技能。 适合人群:初学者以及有一定编程经验、希望深入学习PHP的开发者。 使用场景及目标:①快速搭建PHP开发环境,掌握PHP基础语法;②通过实战案例理解PHP在Web开发中的具体应用;③学习项目开发流程,提高代码质量和开发效率;④了解PHP框架和工具,拓宽技术视野。 阅读建议:阅读时应结合实际操作练习,按照文档步骤搭建环境、编写代码,同时参考提供的学习资源,逐步深入理解PHP的各项特性。

    智能车竞赛学习资料:机器人操作系统ROS原理与应用.pdf

    智能车竞赛学习资料:机器人操作系统ROS原理与应用.pdf

    实训商业源码-WordPress主题-图片摄影作品展示自适应主题-毕业设计.zip

    实训商业源码-WordPress主题-图片摄影作品展示自适应主题-毕业设计.zip

    小程序 叮咚活动报名高级版V5.2.8+前端.zip

    叮咚活动报名高级版小程序V5.2.8 前端 版本号:5.2.8 – 普通版 备注:需要重新上传小程序 1、修复票券上地址显示错误问题 2、修复其他小的BUG

    威纶通MT6103IP触摸屏与台达VFD-M变频器Modbus RTU通讯实现及操作指南

    内容概要:本文详细介绍了威纶通MT6103IP触摸屏与两台台达VFD-M变频器通过Modbus RTU进行通讯的具体实现方法和操作步骤。首先讲解了硬件连接方式,强调了正确的接线对于确保通讯正常的重要性。接着阐述了通讯参数的设置,包括波特率、数据位、停止位以及校验方式的选择,并指出这些参数在所有设备间的一致性至关重要。随后提供了具体的编程实例,如读取运行频率和发送启动命令的关键代码片段,同时解释了Modbus地址到实际寄存器地址之间的转换规则。此外还讨论了一些常见的调试技巧,例如解决RS485信号衰减的方法,在触摸屏界面上添加通讯状态监测等功能,以及针对台达变频器特有的参数写入机制进行了说明。 适用人群:工业自动化领域的工程师和技术人员,特别是那些负责PLC编程、人机界面(HMI)开发以及现场设备维护工作的专业人士。 使用场景及目标:适用于希望深入了解并掌握如何将威纶通触摸屏与台达变频器集成在一起的应用场合。主要目的是帮助用户顺利完成两者间的通信配置,确保能够可靠地监控和控制变频器的工作状态。 其他说明:文中不仅包含了理论性的指导,还有大量实用的操作提示和经验分享,有助于提高工作效率,减少调试过程中可能出现的问题。

    MATLAB R2019a中两级式三相LCL并网逆变器谐振抑制策略的Simulink仿真研究

    内容概要:本文详细介绍了基于MATLAB R2019a的两级式三相LCL并网逆变器谐振抑制策略的Simulink仿真研究。首先,文中描述了系统的整体架构,包括前级BOOST升压电路配合扰动观察法MPPT实现最大功率跟踪控制,以及后级三相桥式逆变器中LCL滤波器采用无源或有源阻尼的方法。接着,针对LCL滤波器容易出现的谐振问题,提出了双闭环控制策略,即电压外环和电流内环控制,确保直流侧电压稳定并实现单位功率因数控制。此外,还探讨了不同阻尼方式的效果,如无源阻尼导致约1.5%的效率损失,而有源阻尼则通过虚拟阻抗实现更好的性能。最后,通过PWM生成模块中的死区补偿进一步优化了系统性能,使得总谐波失真(THD)控制在1.5%以内,远低于国家标准。 适合人群:电力电子工程师、科研人员、高校师生等对并网逆变器及其谐振抑制策略感兴趣的群体。 使用场景及目标:适用于需要进行并网逆变器设计与仿真的场合,旨在解决LCL滤波器带来的谐振问题,提高并网质量,降低THD值,满足并网标准。 其他说明:文中提供了具体的MATLAB/Simulink代码片段和参数设置,有助于读者理解和复现实验结果。同时提醒实际硬件调试时还需考虑更多因素,如采样延时、开关管非线性等。

    COMSOL模拟铌酸锂波导倍频PPLN技术解析及实操经验分享

    内容概要:本文详细介绍了利用COMSOL进行铌酸锂波导倍频(PPLN)仿真的方法和技术难点。首先讨论了材料设置中非线性系数d33的空间调制方式,推荐使用tanh函数代替sign函数以提高收敛性。接着阐述了波导结构的选择和模式分析的关键步骤,强调了正确设置边界条件的重要性。对于网格划分提出了在极化周期交界处局部加密的方法,并解释了分步求解策略以节省内存。最后,作者提醒注意相位匹配条件以及考虑实际器件制造中的工艺误差对转换效率的影响。 适合人群:从事非线性光学研究、光子学器件设计的研究人员和工程师。 使用场景及目标:帮助读者掌握COMSOL软件中针对PPLN结构的仿真技巧,优化仿真流程,提升仿真准确性,解决实际项目中可能遇到的问题。 阅读建议:由于文中涉及大量具体的操作细节和技术要点,建议读者结合自己的项目背景仔细研读每个部分的内容,并尝试将所学应用到实践中去。

Global site tag (gtag.js) - Google Analytics