iOS之HomeKit

1、HomeKit

homekit这个框架是用来沟通和控制我们的家庭智能硬件的。这些智能硬件都是支持HomeKit Accessory Protocol的。homekit应用程序可以让用户去发现并且配置家庭里的这些兼容硬件的。它支持远程访问,支持多个用户和多个用户设备!

2、创建HomeKit之前的工作

  1. Xcode创建一个APP Demo
  2. 启用homekit,在控制面板里找到homekit,并打开开关。如图所示这里写图片描述
  3. .如果没有智能硬件设备的话可以去下载一个模拟器。点击上上图中的Download homekit simulator会跳转到苹果网站的下载界面
    这里写图片描述
  4. 点击下载图中的Hardware IO Tools(下载for7.3的就行)。这里有好多工具,找到homekit模拟器(就是黄色的那个)拖到你的应用程序中,等到测试APP的时候,双击打开就可以使用了
    这里写图片描述

3、相关的类的概念

  1. home(HMhome):homeKit允许用户有多个home,每一个home代表一个有智能设备的住所。用户拥有Home的数据并可通过自己的任何一台iOS设备进行访问。在用户的所有home中,会有一个常用的home,即为primary home。我们可以通过创建一个HMHomeManager对象去管理home。使用这个HMHomeManager对象的访问home、room、配件、服务以及其他HomeKit对象。
  2. room(HMroom):每个Home一般有多个room,并且每个room一般会有多个智能配件。在home中,每个房间是独立的room,并具有一个有意义的名字,这个名字是唯一的。
  3. accessory(HMAccessory):一个accessory代表一个家庭中的自动化设备,例如智能灯具
  4. sevice(HMService):一个sevice是accessory提供的一个实际服务,例如打开或者关闭灯泡,这里和蓝牙开发中的服务的意义基本是一样的。每个sevice中也会有多个特征(characteristic)

上码:

@implementation MyHomeKit

- (void)initMyHomeKit {
    self.homeManager = [[HMHomeManager alloc] init];
    self.homeManager.delegate = self;
}

#pragma mark  这些都是home的操作方法
- (void)addHome:(NSString *)homeName {
    [self.homeManager addHomeWithName:homeName completionHandler:^(HMHome * _Nullable home, NSError * _Nullable error) {
        NSLog(@"%@", homeName);
    }];
}

- (void)removeHome:(HMHome *)home {
    [self.homeManager removeHome:home completionHandler:^(NSError * _Nullable error) {
        NSLog(@"%@", home);
    }];
}
#pragma mark homeKitManager的四个代理方法

// 其中第一个方法是homeManager初始化之后的回调,我们对数据进行操作的时候,应该再其初始化之后进行。
// 初始化之后我们在其回调方法中可以获取到manager.homes,这是一个数组,里边是用户的全部HMhome对象,我们可以遍历这个数组获取到全部的home,通过home.name得到home的名字。
// 获取所有的home资源
- (void)homeManagerDidUpdateHomes:(HMHomeManager *)manager {
    // 获取到的homes
    NSLog(@"已经获取到的homes资源 %@", manager.homes);
    [[NSNotificationCenter defaultCenter] postNotificationName:@"get homes" object:nil userInfo:nil];
}

// add
- (void)homeManager:(HMHomeManager *)manager didAddHome:(HMHome *)home {
    NSLog(@"已经添加的home: %@", home);
    NSLog(@"%@", home.name);
}

// remove
- (void)homeManager:(HMHomeManager *)manager didRemoveHome:(HMHome *)home {
    NSLog(@"已经移除的home:%@", home);
    NSLog(@"%@", home.name);
}

在这里的对应的每一个add,都有一个与之对应的remove,相关操作方法可以点进去详细看了解一下,在这里不一一赘述了

// 获取到HMhome对象之后可以通过home.rooms获取到该home的全部room。同样通过遍历这个数组获取到全部的HMroom对象,然后通过room.name获取到room的名字。

#pragma mark home的代理方法
- (void)homeDidUpdateName:(HMHome *)home {
    NSLog(@"已经更换了home的名字: %@",home);
}
- (void)home:(HMHome *)home didAddAccessory:(HMAccessory *)accessory {
    NSLog(@"已经添加的智能设备: %@", accessory);
}
- (void)home:(HMHome *)home didAddUser:(HMUser *)user {
    NSLog(@"%@", user);
}
- (void)home:(HMHome *)home didUpdateRoom:(HMRoom *)room forAccessory:(HMAccessory *)accessory {
    NSLog(@"一个房间新添了一个设备 :%@",accessory);
}
- (void)home:(HMHome *)home didAddRoom:(HMRoom *)room {
    NSLog(@"新添加一个房间 %@", room);
}
- (void)home:(HMHome *)home didAddZone:(HMZone *)zone {
    NSLog(@" 已经添加了一个空间 %@", zone);
}
- (void)home:(HMHome *)home didAddRoom:(HMRoom *)room toZone:(HMZone *)zone {
    NSLog(@"已经添加了一个房间到一个空间");
}
- (void)home:(HMHome *)home didAddServiceGroup:(HMServiceGroup *)group {
    NSLog(@"已经添加了一个 服务组");
}
...
...
...

5、获取room中的智能硬件对象

  1. 找到一个新的accessory
 self.accBrowser = [[HMAccessoryBrowser alloc] init];
 self.accBrowser.delegate = self;

 #pragma mark - HMAccessoryBrowserDelegate
- (void)accessoryBrowser:(HMAccessoryBrowser *)browser didFindNewAccessory:(HMAccessory *)accessory {
    NSLog(@"搜索新设备结束 : %@", accessory);
    [self.accArray addObject:accessory];
    [self.accTableView reloadData];
}

- (void)accessoryBrowser:(HMAccessoryBrowser *)browser didRemoveNewAccessory:(HMAccessory *)accessory {
    NSLog(@"移除了设备 %@", accessory);
}
  1. 为accessory指定room
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    int num = self.scrollView.contentOffset.x / self.view.bounds.size.width;
    HMAccessory *acc = self.accArray[indexPath.row];
    __block HMHome *home = self.home;
    __block HMRoom *room = self.roomArray[num];
    [self.home addAccessory:acc completionHandler:^(NSError * _Nullable error) {
        if (!error) {
            if (acc.room != room) {
                [home assignAccessory:acc toRoom:room completionHandler:^(NSError * _Nullable error) {
                    if (!error) {
                        NSLog(@"已经将设备放入 %@", room.name);
                    } else {
                        NSLog(@"放入失败 %@", error);
                    }
                }];
            } else {
                NSLog(@"硬件添加home失败 %@",error);
            }
        }
    }];
   }
  1. 改变设备名称、移除一个accessory
HMAccessory *accName = self.accArray[indexPath.row];
    [accName updateName:@"更该设备名字" completionHandler:^(NSError * _Nullable error) {
        if (!error) {
            NSLog(@"更改设备名字成功 %@",accName.name);
        } else {
            NSLog(@"%@", error);
        }
    }];
}

HMAccessory *removeAcc = self.accArray[indexPath.row];
    __block HMHome *accHome = self.home;
    [accHome removeAccessory:removeAcc completionHandler:^(NSError * _Nullable error) {
        if (!error) {
            NSLog(@"移除设备成功 %@", removeAcc);
        } else {
            NSLog(@"移除失败 %@",error);
        }

6、操作硬件

打开APP设置一个按钮,在room中添加一个硬件设备,选择进行操作

 // 拿到智能硬件,首先 获取硬件,开启所有服务
    HMAccessory *serviceAcc = self.accArray[indexPath.row];
    NSArray *serviceArr = serviceAcc.services;
    serviceAcc.delegate = self;
    for (HMService *service in serviceArr) {
        // 获取服务中的所有特征
        NSArray *chaArr = service.characteristics;
        for (HMCharacteristic *cha in chaArr) {
            // 判断得到的属性是读写属性:开始赋值
            if ([cha isEqual:HMCharacteristicPropertyReadable]) {
                self.chaTX = cha;
            } else {
                // 通过打印这个值发现,chaTX 这个值既可以读又可以写,所以接下来不管是写入还是读取都用这个值
                self.chaRX = cha;
                [self.chaRX enableNotification:YES completionHandler:^(NSError * _Nullable error) {
                    NSLog(@"这个通知可以用来接受外设的notify,类似于蓝牙BLE开发中的通知");
                }];
            }
        }

        // 判断这个读写特征,就读写它的值
        if (self.chaRX) {
            [self.chaRX readValueWithCompletionHandler:^(NSError * _Nullable error) {
                if (!error) {
                    // 判断value的状态来控制开关
                    id value = self.chaRX.value;
                    // 如果当前状态是0那么就是关闭,写入一个1打开
                    if ([value integerValue] == 0) {
                        [self.chaRX writeValue:@(1) completionHandler:^(NSError * _Nullable error) {
                            if (!error) {
                                NSLog(@"写入成功");
                            } else {
                                NSLog(@"写入失败 %@", error);
                            }
                        }];

                    } else {
                        [self.chaRX writeValue:@(1) completionHandler:^(NSError * _Nullable error) {
                            if (!error) {
                                NSLog(@"转变成功");
                            } else {
                                NSLog(@"%@",error);
                            }
                        }];
                    }
                }
            }];
        }
    }

最后根据产品要求,在HMAccessoryDelegate回调中更新判断显示状态!

#pragma mark - HMAccessoryDelegate
- (void)accessory:(HMAccessory *)accessory service:(HMService *)service didUpdateValueForCharacteristic:(HMCharacteristic *)characteristic {
    NSLog(@"%@", characteristic.value);
}

到这里,关于HomeKit的基本使用就结束了。。。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值