距离传感器、加速计和蓝牙

1、距离传感器

1738688-6633eebabdca7394.png
 // 1.开启距离传感器(注意: 默认情况距离传感器是关闭的)
//    [UIApplication sharedApplication].proximitySensingEnabled = YES;
    // 只要开启之后, 就开始实时监听
    [UIDevice currentDevice].proximityMonitoringEnabled = YES;
    
    // 2.当监听到有物体靠近设备时系统会发出通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange:) name:UIDeviceProximityStateDidChangeNotification object:nil];

// 当监听到有物体靠近设备时调用 
- (void)proximityStateDidChange:(NSNotification *)note
{
//    NSLog(@"%@", note);
   if( [UIDevice currentDevice].proximityState)
   {
       NSLog(@"有物体靠近");
   }else
   {
       NSLog(@"物体离开");
   }
}

2、加速计 CoreMotion

加速计的经典应用场景
  • 摇一摇
  • 计步器

方法1 push (一直在采集)

- (void)push
{
    // 1.创建coreMotion管理者
    //    CMMotionManager *mgr = [[CMMotionManager alloc] init];
    self.mgr = [[CMMotionManager alloc] init];
    
    // 2.判断加速计是否可用
    if (self.mgr.isAccelerometerAvailable) {
        /*
         isAccelerometerActive 是否正在采集
         accelerometerData 采集到得数据
         startAccelerometerUpdates  pull
         startAccelerometerUpdatesToQueue  push
         stopAccelerometerUpdates 停止采集
         accelerometerUpdateInterval 采样时间
         */
        // 3.设置采样时间
        self.mgr.accelerometerUpdateInterval = 1 / 30.0;
        // 4.开始采样
        
        [self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
            // 这个block是采集到数据时就会调用
            if (error) return ;
            CMAcceleration acceleration = accelerometerData.acceleration;
            NSLog(@"x = %f y = %f z = %f", acceleration.x, acceleration.y , acceleration.z);
        }];
    }else
    {
        NSLog(@"加速计不可用");
    }
}

方法2 pull (需要时才采集)

// 1.创建coreMotion管理者
    self.mgr = [[CMMotionManager alloc] init];
    
     if (self.mgr.isAccelerometerAvailable) {
          // 3.开始采样
         [self.mgr startAccelerometerUpdates]; // pull
     }else
     {
         NSLog(@"加速计不可用");
     }

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    CMAcceleration acceleration = self.mgr.accelerometerData.acceleration;
    
     NSLog(@"x = %f y = %f z = %f", acceleration.x, acceleration.y , acceleration.z);
}

3、蓝牙

iOS中提供了4个框架用于实现蓝牙连接

1、GameKit.framework(用法简单)

  • 只能用于iOS设备之间的连接,多用于游戏(比如五子棋对战),从iOS7开始过期(仅限于沙盒)
  • 只能用于iOS设备之间的连接
  • 只能用于同一个应用程序之间的连接
  • 最好别利用蓝牙发送比较大的数据
- (IBAction)connect {
    // 1.创建选择其他蓝牙设备的控制器
    GKPeerPickerController *peerPk = [[GKPeerPickerController alloc] init];
    // 2.成为该控制器的代理
    peerPk.delegate = self;
    // 3.显示蓝牙控制器
    [peerPk show];
}

#pragma mark - GKPeerPickerControllerDelegate
// 4.实现dialing方法
/**
 *  当蓝牙设备连接成功就会调用
 *
 *  @param picker  触发时间的控制器
 *  @param peerID  连接蓝牙设备的ID
 *  @param session 连接蓝牙的会话(可用通讯), 以后只要拿到session就可以传输数据
 */
- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session
{
    NSLog(@"%@", peerID);
    // 1.保存会话
    self.session = session;
    
    // 2.设置监听接收传递过来的数据
    /*
     Handler: 谁来处理接收到得数据
     withContext: 传递数据
     */
    [self.session setDataReceiveHandler:self withContext:nil];
    
    
    // 2.关闭显示蓝牙设备控制器
    [picker dismiss];
}
/**
 *  接收到其它设备传递过来的数据就会调用
 *
 *  @param data    传递过来的数据
 *  @param peer    传递数据设备的ID
 *  @param session 会话
 *  @param context 注册监听时传递的数据
 */
- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context
{
//    NSLog(@"%s", __func__);
    // 1.将传递过来的数据转换为图片(注意: 因为发送的时图片, 所以才需要转换为图片)
    UIImage *image = [UIImage imageWithData:data];
    self.customIV.image = image;
}

- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker
{

}

 #pragma mark —- 发送数据
- (IBAction)send {
    // 利用session发送图片数据即可
    // 1.取出customImageView上得图片, 转换为二进制
    UIImage *image =  self.customIV.image;
    NSData *data = UIImagePNGRepresentation(image);
    
    /*
     GKSendDataReliable, 数据安全的发送模式, 慢
     GKSendDataUnreliable, 数据不安全的发送模式, 快
     */
    
    /*
     data: 需要发送的数据
     DataReliable: 是否安全的发送数据(发送数据的模式)
     error: 是否监听发送错误
     */
    [self.session sendDataToAllPeers:data withDataMode:GKSendDataReliable error:nil];
}

2、MultipeerConnectivity.framework
只能用于iOS设备之间的连接,从iOS7开始引入,主要用于文件共享(仅限于沙盒的文件)用法跟GameKit类似
3、ExternalAccessory.framework
可用于第三方蓝牙设备交互,但是蓝牙设备必须经过苹果MFi认证(国内较少)
4、CoreBluetooth.framework(时下热门)

  • 可用于第三方蓝牙设备交互,必须要支持蓝牙4.0
  • 硬件至少是4s,系统至少是iOS6
  • 蓝牙4.0以低功耗著称,一般也叫BLE(Bluetooth Low Energy)
  • 目前应用比较多的案例:运动手坏、嵌入式设备、智能家居

每个蓝牙4.0设备都是通过服务(Service)和特征(Characteristic)来展示自己的
一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征
特征是与外界交互的最小单位
比如说,一台蓝牙4.0设备,用特征A来描述自己的出厂信息,用特征B来收发数据
服务和特征都是用UUID来唯一标识的,通过UUID就能区别不同的服务和特征
设备里面各个服务(service)和特征(characteristic)的功能,均由蓝牙设备硬件厂商提供,比如哪些是用来交互(读写),哪些可获取模块信息(只读)等

Core Bluetooth的开发步骤:

  1. 建立中心设备
  2. 扫描外设(Discover Peripheral)
  3. 连接外设(Connect Peripheral)
  4. 扫描外设中的服务和特征(Discover Services And Characteristics)
  5. 利用特征与外设做数据交互(Explore And Interact)
    断开连接(Disconnect)
#import "ViewController.h"
#import <CoreBluetooth/CoreBluetooth.h>

@interface ViewController ()<CBCentralManagerDelegate, CBPeripheralDelegate>
/**
 *  外设
 */
@property (nonatomic, strong) NSMutableArray *peripherals;
/**
 *  中心管理者
 */
@property (nonatomic, strong) CBCentralManager *mgr;
@end

@implementation ViewController

- (NSMutableArray *)peripherals
{
    if (!_peripherals) {
        _peripherals = [NSMutableArray array];
    }
    return _peripherals;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 1.创建中心设备
    CBCentralManager *mgr = [[CBCentralManager alloc] init];
    self.mgr = mgr;
    
    
    // 设置代理
    mgr.delegate = self;
    
    // 2.利用中心设备扫描外部设备
    /*
     如果指定数组代表只扫描指定的设备
     */
    [mgr scanForPeripheralsWithServices:nil options:nil];
}
#pragma mark - CBCentralManagerDelegate
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{

    // 保存扫描到得外部设备
    // 判断如果数组中不包含当前扫描到得外部设置才保存
    if (![self.peripherals containsObject:peripheral]) {
        
        peripheral.delegate = self;
        [self.peripherals addObject:peripheral];
    }
}

/**
 *  模拟点击, 然后连接所有的外设
 */
- (void)start
{
    for (CBPeripheral *peripheral in self.peripherals) {
        /**
         *  连接外设
         */
        [self.mgr connectPeripheral:peripheral options:nil];
    }
}
/**
 *  连接外设成功调用
 */
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    // 扫描外设中得服务
    [peripheral discoverServices:nil];
}
/**
 *  连接外设失败调用
 */
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    
}

#pragma makr - CBPeripheralDelegate
/**
 *  只要扫描到服务就会调用
 *
 *  @param peripheral 服务所在的外设
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
    
    // 获取外设中所有扫描到得服务
    NSArray *services = peripheral.services;
    for (CBService *service in services) {
        // 拿到需要的服务
        if ([service.UUID.UUIDString isEqualToString:@"123"])
        {
            // 从需要的服务中查找需要的特征
            // 从peripheral中得service中扫描特征
            [peripheral discoverCharacteristics:nil forService:service];
        }
    }
}

/**
 *  只要扫描到特征就会调用
 *
 *  @param peripheral 特征所属的外设
 *  @param service    特征所属的服务
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    
    // 拿到服务中所有的特征
    NSArray *characteristics =  service.characteristics;
    // 遍历特征, 拿到需要的特征处理
    for (CBCharacteristic * characteristic in characteristics) {
        if ([characteristic.UUID.UUIDString isEqualToString:@"8888"]) {
            NSLog(@"设置闹钟");

        }
    }
}

4、陀螺仪与方向感应器

1738688-282c3f1bd6b4a7e1.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 这部影片我一共看过两遍,都是在腾讯视频上,没能去影院支持一下票房,挺遗憾的。一般我去影院看电影,主要还是为...
    Good明阅读 187评论 0 0
  • 坐在电脑前的那一刹那,我还是没想好写什么。今天不知怎么回事,有点偏头痛了。这是个老朋友,只是最近不太常见。要不今天...
    Luckymay阅读 177评论 0 0
  • http://lyjh.net/2015/09/06/Git使用教程/http://www.debugrun.co...
    愛我你就抱抱我阅读 113评论 0 0