第九章:使用CoreLocation定位

CoreLocation框架(CoreLocation.framework)可用于定位设备当前的经纬度,通过该框架,应用程序可通过附近的蜂窝基站、WIFI信号或者GPS等信息计算用户位置。

iOS SDK提供了CLLocationManager、CLLocationManagerDelegate来处理设备的定位信息,包括获取设备的方向以及进行方向检测等。其中CLLocationManager是整个CoreLocation框架的核心,定位、方向检测、区域检测等都由该API完成;而CLLocationManagerDelegate是一个协议,实现该协议的对象可作为CLLocationManager的delegate对象,负责处理CLLocationManager的定位、方向检测、区域检测等相关事件。除此之外,iOS还提供了CLLocation(代表位置信息)、CLLHeading(代表设备方向)、CIRegion(代表区域)等API,这些API与CLLocationManager、CLLocationManagerDelegate共同组成了iOS的CoreLocation框架。

一、iOS的定位支持

1、GPS卫星定位

GPS是英文:Global Positioning System(全球定位系统)的简称;该定位系统由3部分组成,即由GPS卫星组成的空间部分、若干地面站的控制部分和普通用户手中的接收机这3部分。

与基站、WIFI定位相比,GPS定位耗电量最大,速度最慢,但是精度最高。

2、基站定位

每个手机基站都有一个标识符,iOS设备可以搜集周围所有收到信号的基站和它们的标识符,通过联网发送到苹果云端服务器,再由服务器根据这些基站的位置信息查询并计算出当前位置,然后把该定位信息返回到手机。

3、WIFI定位

iOS设备通过无线卡搜集周围所有的WIFI热点,获得它们的MAC地址,然后通过Apple的云端服务器查询该WiFi热点是否已经登记,如果已经登记,即可获取该WiFi热点的位置,最后通过对多个WiFi热点折中计算得到当前位置并返给iOS设备。

二、获取定位信息

iOS开发者使用CoreLocation.framework框架进行定位非常简单,CoreLocation框架的常用API主要有如下几个:

  • (1)、CLLocationManager:定位管理器类;
  • (2)、CLLocationManagerDelegate:该协议代表定位管理器的delegate协议。实现该协议的对象可负责处理CLLocationManager的定位事件;
  • (3)、CLLocation:该对象代表位置。该对象包含了当前设备的经度、纬度、高度、速度、路线等信息,还包含了该定位信息的水平精确度、垂直精确度以及时间戳信息;
  • (4)、CLHeading:该对象代表设备的移动方向;
  • (5)、CLRegion:该对象代表一个区域。一般程序不会直接使用该类,而是使用它的两个子类,即CLCircularRegion(圆形区域)和CLBeaconRegion(蓝牙信号区);

除此之外,CoreLocation框架还涉及一个CLLocationCoordinate2D结构体变量,该几诶够提变量包含经度、纬度两个值,其中CLLocation对象的coordinate属性就是一个CLLocationCoordinate2D结构体变量。

1、获取位置信息

 使用CoreLocation.framework进行定位如下步骤:
  • ①、创建CLLocationManager对象,该对象负责获取定位相关信息。并为该对象设置一些必要的属性;
  • ②、为CLLocationManager指定delegate属性,该属性必须是一个实现CLLocationManagerDelegate协议的对象。实现CLLocationManagerDelegate协议时刻根据需要实现协议中特定的方法;
  • ③、调用CLLocationManager的startUpdatingLocation方法获取定位信息。定位结束时,可调用stopUpdatingLocation方法结束获取定位信息。

提示:为了在iOS应用中使用CoreLocation.framework,需要完成两件事情:

①、为应用添加CoreLocation.framework框架;

②、在需要使用定位服务及相关类的源文件重使用#import < CoreLocation/CoreLocation.h >导入CoreLocation.framework的头文件。

CoreLocationManager提供了如下类方法判断当前设备的定位相关服务状态:

(1)、 + (BOOL)locationServicesEnabled __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);//返回当前定位服务是否可用;
(2)、 + (BOOL)deferredLocationUpdatesAvailable __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);//返回延迟定位更新是否可用;
(3)、 + (BOOL)significantLocationChangeMonitoringAvailable __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);//返回重大位置监听是否可用;
(4)、 + (BOOL)headingAvailable
__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);//返回该设备是否支持磁力计计算方向;
(5)、 + (BOOL)isRangingAvailable __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);//返回蓝牙信号范围是否可用。

除此之外,在使用CLLocationManager开始定位之前,还可为该对象设备如下属性:

  • (1)、 @property(assign, nonatomic) BOOL pausesLocationUpdatesAutomatically __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);设置iOS设备是否可暂停定位来节省电池的电量;如果该属性设为『YES』,则当iOS设备不再需要定位数据时,iOS设备可以自动暂停定位;
  • (2)、 @property(assign, nonatomic) CLLocationDistance distanceFilter;设置CLLocationManager的自动过滤距离。也就是说,只有当设备在水平方向的位置改变超过该数值(以米为单位)指定的距离时才会生成一次位置变化的信号;
  • (3)、 @property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;设置定位服务的静度。该属性值支持
extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);(导航级的最佳精确度);
extern const CLLocationAccuracy kCLLocationAccuracyBest;(最佳精确度);
extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;(10米误差);
extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;(百米误差);
extern const CLLocationAccuracy kCLLocationAccuracyKilometer;(千米误差);
extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;(1三千米误差)

等常量值。当然,也可直接指定一个浮点数作为定位服务允许的误差;

  • (4)、 @property(assign, nonatomic) CLActivityType activityType __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);设置定位数据的用途。该属性支持
{
    CLActivityTypeOther = 1,(定位数据作为普通用途)
    CLActivityTypeAutomotiveNavigation,(定位数据作为车辆导航使用)
    CLActivityTypeFitness,(定位数据作为步行导航使用)
    CLActivityTypeOtherNavigation(定位数据作为其他导航使用)
};

注意:iOS8中使用CoreLocation定位

  • (1)、在使用CoreLocation需要调用如下函数

    iOS8对定位进行了一些修改,其中包括定位授权的方法,CLLocationManager增加了如下两个方法:

①、始终允许访问位置信息

- (void)requestAlwaysAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);

②、使用应用程序期间允许方位位置数据

- (void)requestWhenInUseAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);
  • (2)、在Info.plist文件中添加如下配置:

①、NSLocationAlwaysUsageDescription

②、NSLocationWhenInUseUsageDescription

这两个键的值就是授权alert的描述,实例配置如下:

Demo如下:

- (void)clickBtn{
    //如果定位服务可用
    if ([CLLocationManager locationServicesEnabled]) {
        NSLog(@"开始执行定位服务");
        //设置定位精度:最佳精度
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        //设置距离过滤器为50米,表示每移动50米更新一次位置
        self.locationManager.distanceFilter = 50;
        //将试图控制器自身设置为CLLocationManager的delegate
        //因此该试图控制器需要实现CLLocationManagerDelegate协议
        self.locationManager.delegate = self;
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
        {
            [self.locationManager requestWhenInUseAuthorization];
            [self.locationManager requestAlwaysAuthorization];
        }
        //开始监听定位信息
        [self.locationManager startUpdatingLocation];
    }else{
        NSLog(@"无法使用定位服务!!!");
    }
}
#pragma mark -- CLLocationManagerDelegate
//成功获取定位数据后将会激发该方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    //获取最后一个定位数据
    CLLocation* location = [locations lastObject];
    //依次获取CLLocation中封装的经度、纬度、高度、速度、方向等信息
    NSLog(@"经度:%g,纬度:%g,高度:%g,速度:%g,方向:%g",location.coordinate.latitude,location.coordinate.longitude,location.altitude,location.speed,location.course);
}
//定位失败时激发的方法
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    NSLog(@"定位失败:%@",error);
}

CLLocation对象包含如下属性,这些属性包含了定位相关信息:

(1)、 @property(readonly, nonatomic) CLLocationDistance altitude;//该属性表示当前设备的海拔高度,单位是米;
(2)、 @property(readonly, nonatomic) CLLocationCoordinate2D coordinate;//该属性返回一个CLLocationCoordinate2D结构体变量,该结构体变量中包含经度、纬度信息;
(3)、 @property(readonly, nonatomic) CLLocationDirection course __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_2_2);//该属性表示当前设备前进的方向。该值为0°表示向北,90°表示向东,180°表示向南,270°表示向西;
(4)、 @property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;//该属性表明定位信息的水平精确度。将返回的坐标作为圆心,并将水平精确度视为半径。真正的设备位置落在此圆内的某处。此圆越小,位置就越精确;此圆越大,则位置越不精确。如果精确度为负值,则表明测量精确度失败;
(5)、 @property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;//该属性标明定位信息的垂直精确度。也就是说,iOS设备的实际高度在该定位信息的高度加或减该属性值的范围内;
(6)、 @property(readonly, nonatomic, copy) NSDate *timestamp;//该属性返回定位信息的返回时间;
(7)、 @property(readonly, nonatomic) CLLocationSpeed speed __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_2_2);//该属性表示返回设备的移动速度,单位是米/秒。实际上,该属性适用于行车减速,而不太适用于步行速度。

2、使用iOS模拟器模拟位置

  • ①、自定位置:开发者可以自行输入位置的经度值、纬度值;
  • ②、City Bicycle Ride:模拟设备携带者在城市中骑车移动;
  • ③、City Run:模拟设备携带者在城市中跑步;
  • ④、Freeway Drive:模拟设备携带者再告诉公路中驾车;

3、监控行车速度和行车距离

如果开发者希望计算平均移动速度,则只要不断的累计设备的移动距离和移动时间,再用距离除以时间即可得到设备的平均移动速度。

例如:

#pragma mark -- CLLocationManagerDelegate
//成功获取定位数据后将会激发该方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    //获取最后一个定位数据
    CLLocation* newLocation = [locations lastObject];
    if (newLocation.horizontalAccuracy < kCLLocationAccuracyHundredMeters) {
        if (self.prevLocation) {
            //计算本次定位数据与上次定位数据之间的时间差
            NSTimeInterval dTime = [newLocation.timestamp timeIntervalSinceDate:self.prevLocation.timestamp];
            //累计行车时间
            self.sumTime += dTime;
            CGFloat distance = [newLocation distanceFromLocation:self.prevLocation];
            //如果距离小于1米。则忽略本次数据,直接返回该方法
            if (distance < 1.f) {
                return;
            }
            self.sumDistance += distance;
            //计算移动速度,将米/秒换算成千米/小时,需要乘以3.6
            CGFloat speed = distance/dTime*3.6;
            //计算平均速度
            CGFloat avgSpeed = self.sumDistance/self.sumTime*3.6;
            NSString* speedFeedback = [NSString stringWithFormat:@"当前速度为:%g千米/小时,平均速度为:%g千米/小时。合计移动:%g前面",speed,avgSpeed,self.sumDistance/1000];
            NSLog(@"%@",speedFeedback);
        }
        self.prevLocation = newLocation;
    }
}

三、方向监测

拥有GPS硬件的设备可以生成设备的当前方向(couse属性)和速度信息。iPhone设备携带的定位管理器可以返回一个已经计算好的course值,通过这个值我们可以获得当前前进的方向,course值是0~360之间的浮点数,0°值表示正北方向,90°值表示正东方向,180°值表示正南方向,270°值表示正西方向,程序可以通过course值来检测用户位置的移动方向。

使用CLLocationManager获取设备方向的步骤如下:

  • ①、创建CLLocationManager对象,该对象负责获取定位相关信息。并为该对象设备一些必要的属性;
  • ②、为CLLocationManager指定delegate属性,该属性必须是一个实现CLLocationManagerDelegate协议的对象。实现CLLocationManagerDelegate协议时刻根据需要实现协议中特定的方法。
  • ③、调用CLLocationManager的starUpdatingHeading方法获取方向信息。获取方向结束时,可调用stopUpdatingHeading方法结束获取方向信息。

当设备的方向改变时,iOS系统将会自动激发CLLocationManager的delegate对象的

- (void)locationManager:(CLLocationManager *)manager
       didUpdateHeading:(CLHeading *)newHeading __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);

方法,而程序可通过重写该方法来获取设备方向;

iOS允许为检测方向改变设置如下属性:

  • ①、CLLocationDegrees headingFilter:设置只有当设置方向的改变值超过该属性值时才激发delegate方法;
  • ②、CLDeviceOrientation headingOrientation:设置设备当前方向;

监听方向时返回的是一个CLHeading对象,该对象包含如下属性:

(1)、 @property(readonly, nonatomic) CLLocationDirection magneticHeading;//该属性返回设备与磁北的相对方向;
(2)、 @property(readonly, nonatomic) CLLocationDirection trueHeading;//该属性返回设备与真北的相对方向;
(3)、 @property(readonly, nonatomic) CLLocationDirection headingAccuracy;//该属性返回方向值的错误范围;
(4)、 @property(readonly, nonatomic, copy) NSDate *timestamp;//该属性返回方向值的生成时间;
(5)、 @property(readonly, nonatomic) CLHeadingComponentValue x;//获取该设备在X方向上监听得到的原始磁力值,该磁力值的强度单位是微特斯拉;
(6)、 @property(readonly, nonatomic) CLHeadingComponentValue y;//获取该设备在Y方向上监听得到的原始磁力值,该磁力值的强度单位是微特斯拉;
(7)、 @property(readonly, nonatomic) CLHeadingComponentValue z;//获取该设备在Z方向上监听得到的原始磁力值,该磁力值的强度单位是微特斯拉;

实例:指南针

#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
{
    CALayer* znzLayer;
}
@property (nonatomic ,strong) CLLocationManager* locationManager;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    //如果磁力计可用,则开始监听方向改变;
    if ([CLLocationManager headingAvailable]) {
        //创建显示方向的指南针Layer
        znzLayer = [[CALayer alloc]init];
        NSInteger screenHeight = [UIScreen mainScreen].bounds.size.height;
        NSInteger screenWidth = [UIScreen mainScreen].bounds.size.width;
        NSInteger y = (screenHeight - 320)/2;
        NSInteger x = (screenWidth - 320)/2;
        znzLayer.frame = CGRectMake(x, y, 320, 320);
        //设置znzLayer显示的照片
        znzLayer.contents = (id)[[UIImage imageNamed:@"znz.png"]CGImage];
        //将znzLayer添加刀系统的UIView中
        [self.view.layer addSublayer:znzLayer];
        //创建CLLocationManager对象
        self.locationManager = [[CLLocationManager alloc]init];
        self.locationManager.delegate = self;
        [self.locationManager startUpdatingHeading];
    }else{
        //如果磁力计不可用告知
        NSLog(@"设备不支持磁力计");
    }
}
#pragma mark -- CLLocationManagerDelegate --
//当成功获取设备的方向值激发该方法
- (void)locationManager:(CLLocationManager *)manager
       didUpdateHeading:(CLHeading *)newHeading{
    //以北为0°顺时针增加
    NSLog(@"%g",newHeading.magneticHeading);
    //将设备的方向角度换算成弧度
    CGFloat headings = -1.0f*M_PI*newHeading.magneticHeading/180.0f;
    //创建不断改变CALayer的transform属性的属性动画
    CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"transform"];
    CATransform3D formValue = znzLayer.transform;
    //设置动画开始的属性值
    anim.fromValue = [NSValue valueWithCATransform3D:formValue];
    //绕z轴旋转heading弧度的变换矩阵
    CATransform3D toValue = CATransform3DMakeRotation(headings, 0, 0, 1);
    anim.toValue = [NSValue valueWithCATransform3D:toValue];
    anim.duration = 0.1;
    //动画完成后是否移除
    anim.removedOnCompletion = YES;
    //设置动画结束后znzLayer的变换矩阵
    znzLayer.transform = toValue;
    //为znzLayer添加动画
    [znzLayer addAnimation:anim forKey:nil];
}
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager{
    return YES;
}

四、区域监测

如果希望iOS设备进入某个区域发出通知,那么这种区域监测的功被称为临近警告;用户设备不断地临近固定点,当与该固定点的距离小于指定范围时,系统可以触发相应的处理。用户设备离开指定固定点,当与该固定点的距离大于指定范围时,系统也可以出发相应的处理。

iOS的区域监测同样可以使用CLLocationManager来实现,监听设备是否进入/离开某个区域的步骤如下:

  • ①、创建CLLocationManager对象,该对象负责获取定位相关信息,并为该对象设置一些必要的属性。对于区域监测而言,CLLocationManager对象需要设置monitoredRegions属性,该属性值用于设置该设备监听的多个区域;
  • ②、为CLLocationManager指定delegate属性,该属性值必须是一个实现CLLocationManagerDelegate协议的对象。实现

    CLLocationManagerDelegate协议时刻根据需要实现协议中特定的方法;

  • ③、调用CLLocationManager的startMonitoringForRegion:方法进行区域监测,区域监测结束时,可调用stopMonitoringForRegion:方法结束区域监测。

区域检测

#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
@property (nonatomic ,strong) CLLocationManager* locationManager;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    if ([CLLocationManager locationServicesEnabled]) {
        self.locationManager = [[CLLocationManager alloc]init];
        self.locationManager.delegate = self;
        //定义一个CLLocationCoordinate2D作为区域的圆心
        CLLocationCoordinate2D companyCenter;
        companyCenter.latitude = 23.126272;
        companyCenter.longitude = 113.395568;
        //使用CLCircularRegion创建一个圆形区域,半径为500米
        CLRegion* fkit = [[CLCircularRegion alloc]initWithCenter:companyCenter radius:10000000000 identifier:@"fkit"];
        //开始监听fkit区域
        [self.locationManager startMonitoringForRegion:fkit];
    }else{
        NSLog(@"该设备不支持定位");
    }
}
#pragma mark -- CLLocationManagerDelegate --
//进入指定区域以后将弹出提示框提示用户
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
    [[[UIAlertView alloc]initWithTitle:@"区域监测提示" message:@"您已经【进入】区域" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]show];
}
//离开指定区域以后将弹出提示框提示用户
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{
    [[[UIAlertView alloc]initWithTitle:@"区域监测提示" message:@"您已经【离开】区域" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]show];
}
时间: 2024-10-08 08:31:31

第九章:使用CoreLocation定位的相关文章

第九章心得体会

通过第九章的学习,我学到了如下知识点: 第九章:硬件抽象层:HAL 9.1为什么要在Android中加入HAL 1.HAL并不是Linux内核的一部分,而是位于Android的系统运行库层 2.为Android加入HAL主要目的:统一硬件的调用借口,解决了GPL的版权问题,针对一些特殊的要求. 9.2Android HAL架构 9.3为LED驱动增加HAL 1.编写一款支持HAL的Linux驱动程序的步骤 第一步:编写Linux驱动 Linux驱动代码要尽量的简洁,尽可能将业务逻辑放到HAL L

第九章 当寂寞的男人遇到寂寞的女

道哥说酒吧是男人的战场,女人便是俘虏,我却觉得,酒吧是女人的猎场,男人就是猎物.在这个自由开放的时代,男人寻欢,女人作乐,谁又能主宰得了谁.道哥曾经最大的噩梦是第二天醒来发现女人离去,却留下了一沓钱,道哥像发疯的野兽一样的看着,仿佛那不是钱,而是耻辱.第一次,道哥对于送上门的钱视之如粪土,弃之如敝屐. 这天晚上,明羽和小凡都没有加班,之前道哥说我和小凡不够主动,这样不好,要果断出手,关键时刻敢于亮剑,才可常胜.于是今晚我们三个不再是坐在那里喝酒聊天,而是主动出击,各自寻找目标.道哥说了如果今晚我

第九章 读书笔记

第九章 硬件抽象层 HAL 在传统的Linux.系统中Linux驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑有码.对于访问硬件寄存器的代码,并没有什么秘密可言,因为这都是调用的 Linux 内核的标准函数进行的标准操作4 而Linux驱动的业务逻辑部分对击有些企业或个人并不想将源代码公开.尽管这些Lipux.驱动都是免费给用户使用的,由于这些Linux 驱动的实现涉及一些,技术专利或商业秘窑,如果公开源代码会有很大麻烦.但作为Linux.驱动,又不得不公开源代码.这 是由于Linux

《Android深度探索》卷1 第九章笔记 1314 王宁

第九章 本章主要学习了HAL.Android的硬件抽象层,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节.把对硬件的支持分成了两层,一层放在用户空间,一层放在内核空间,其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间.为LED驱动增加 HAL 第 1 步 编写 Linux 驱动 “编写 Linux 驱动”,从表明上看是废话,但如果要为 Linux 驱动添加 HAL,而且想尽量保护敏感数据. Linux 驱动的代码就要尽量简洁,尽可能将业务逻辑放到 HA

Laxcus大数据管理系统2.0(11)- 第九章 容错

第九章 容错 在当前,由于集群庞大的组织体系和复杂性,以及用户普遍要求低成本硬件,使得集群在运行过程中发生的错误概率,远远高于单一且性能稳定的小型机服务器,并且集群在运行过程中几乎是不允许停止的,这就更需要提供比单机环境复杂得多的错误管理方案.实际上,我们在产品设计.开发.运营的各个阶段,有相当大一部分精力,都是用来获取各种故障,和解决各种故障发生后的错误处理问题.对于这些错误处理,我们整体遵循这样一个思路来解决:首先由软件感知来发现和定位故障点,然后进行判断,如果属于软件可以解决的故障,那么通

第九章感想

第九章章介绍了——HAL(硬件抽象层),建立在linux驱动之上的一套程序库.它并不属于linux内核,而是属于linux内核层之上的应用层.Google为Android加入HAL主要有如下的目的.Google为了满足这些不想开源的linux驱动作者的要求,在android层次结构中的运行库层增加了一个HAL,从而统一硬件的调用接口,解决了GPL版权问题并且针对一些特殊的要求.统一硬件的调用接口.由于HAL 有标准的调用接口,所以可以利用HAL屏蔽Linux 驱动复杂.不统一的接口.解决了GPL

现代软件工程讨论第九章-十七章

第九章 9.5.1  PM们的故事 9.5.2  我是做PM 的料么? 在校学生如何为成为PM做准备 你是否觉得你的长处不在于写代码和debug,而是协调.沟通,让一个团队或组织有效运转起来?你是否喜欢表达,善于和各种专业背景的人沟通?你是否经常思考如何改进生活中点点滴滴的小问题?你会思考这样的问题么:新浪微博.豆瓣.qq.微信都可以社交,它们的定位.产品特性.用户群.解决的需求,有什么不同?你是否对以下领域感兴趣,甚至自己找过相关的书来看:心理学.社会学.组织行为学.统计学.商业模式? 如果你

《觉醒之后》第九章 当觉醒穿透头脑、心脏与腹部时

http://blog.sina.com.cn/s/blog_6431fb990102x3tp.html 第九章 当觉醒穿透头脑.心脏与腹部时 只有在我们彻底释放之后,真相的光明才能毫无扭曲地投射出来. 25岁那一年,在获得我前面描述过的最初的觉醒经验之后,我本来可以认为,“哦,这便是觉醒,这便是觉醒的全部了.我已经见过实相的绝对本性了.”我本来可以忙着向世界宣扬我发现的真理,但幸运的是,我内在有一个小小的声音对我说,"这并不是真正的觉醒,这并不是觉醒的全部,你得继续前进.” 从某种意义上来说,

数据库学习笔记:第九章 存储数据:磁盘和文件

第九章 数据以磁盘块为单位存储在磁盘上.块分布于一张或多张盘片的同心环形磁道上.磁道可以在盘片的单面或双面上录制. 同一直径的所有磁道的集合称为柱面. 磁盘块的大小在磁盘初始化时可以被设置成扇区大小的倍数. 每一个记录的表面都有一个磁盘头阵列.读写一块时,磁头必须定位在块头位置. 不能并行读写的主要原因是很难保证所有磁头被精确定位在相应的磁道上. 磁盘控制器是磁盘驱动器与计算机的接口. 当数据被写到扇区时,需要计算校验和并存储在扇区上,当扇区上的数据被独处时,需要再次校验和. 寻道时间是用于移动