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 {// 获取到的homesNSLog(@"已经获取到的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的基本使用就结束了。。。

iOS之HomeKit相关推荐

  1. [第一步]homekit智能家居,homebridge与homebridge-aqara通信协议

    根据这个就可以使用iphone控制灯与开关. 折腾了3个晚上,终于将homebridge安装好,安装之前需要安装一堆的库,比如node.js运行环境等,因为网上资料大部分都是在树莓派上面运行,我是直接 ...

  2. 小米网关接入Homekit完整教程

    Hi 米娜桑,通过我艰苦不懈的追踪发现,绿米智能家庭产品现在也是可以部分支持Homekit啦~ 起因是我发现了这个: https://github.com/snOOrz/homebridge-aqar ...

  3. 智能记忆功能nest_Nest,Ecobee3和Honeywell歌词:您应该购买哪个智能恒温器?

    智能记忆功能nest When it comes to smart thermostats, there's a handful to choose from, but the big three t ...

  4. 智能家庭本周锋闻:暴风领头打造虚拟人生

    本周的智能家庭锋闻主题系虚拟人生: 1. 暴风发布魔镜二代 继续9月份一代发布和销售之后,暴风魔镜在这周二又发布二代产品. 硬件上主要的更新系:增加瞳距调节.物距调节.改良散热设计.改良光学设计.前盖 ...

  5. 小米r2d做nas_零基础也可以打造智能家居,利用群晖docker将小米全家桶接入ios Homekit...

    零基础也可以打造智能家居,利用群晖docker将小米全家桶接入ios Homekit 2018-04-21 20:15:00 419点赞 4150收藏 143评论 小编注:此篇文章来自即可瓜分10万金 ...

  6. iOS中文件连接群晖服务器,教你使用群晖怎么在ios的“家庭‘’App(HomeKit)里添加Hom...

    教你使用群晖HomeKit 怎么在ios的"家庭"App(HomeKit)里添加HomeBridge设备 此篇作为<群晖Docker快速搭建HomeBridge和HomeAs ...

  7. iOS HomeKit 使用及介绍

    HomeKit介绍 苹果Homekit智能家居平台是智慧家庭控制中心,让用户能够通过一个应用对所有智能家居类硬件产品进行统一管理  HomeKit框架 HomeKit框架 是App用来沟通和控制家庭自 ...

  8. 李洪强iOS经典面试题153- 补充

    李洪强iOS经典面试题153- 补充   补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...

  9. 史上最强最贵Mac Pro诞生,iPadOS和iOS分家!WWDC19全面总结

    作者 | 俞佳兴.胡巍巍 转载自CSDN(ID:CSDNnews) 图片&视频 | 余佳兴摄自美国圣何塞WWDC现场 一年一度的WWDC终于来了!43岁的苹果,产品经验位居世界前列.一个迈入中 ...

  10. 苹果又魔改安卓? iOS 15 正式发布、可跨设备移动文件,这届 WWDC21 带来了什么?...

    作者 | 苏宓 出品 | CSDN(ID:CSDNnews) 还记得在 2007 年 iPhone 首次发布会上,乔布斯曾引用了 SmallTalk 之父.图灵奖获得者 Alan Kay 的一句话来分 ...

最新文章

  1. JVM性能调优监控工具专题二:VisualVM基本篇之监控JVM内存,CPU,线程
  2. 十个jQuery的幻灯片图片轮播切换插件[转]
  3. 接口Interface和抽象类abstract class的区别
  4. [CF600E]Dsu on tree
  5. Vue学习--MVVM模型
  6. esp8266实验:搭建最小系统,刷nodemcu固件,dht11温度读取并上传服务器
  7. Dynamips GNS3
  8. 一文读懂OSI七层网络模型与TCP-IP模型和对等网络通信协议
  9. steam密码查看_如何查看和清除Steam中的先前别名
  10. 联想ThinkPad SL410(28428KC)与2842-EWC区别
  11. 读书笔记——晶体管电路设计
  12. cad墙线打断lisp_[求助]很多相交线快速打断 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  13. 高通 Camx debug log控制
  14. python中如何打开csv文件_Python对CSV文件的处理
  15. Staking来袭,10亿级市场打开! | 火星总编时刻NO.31
  16. 2020-09-22关于dialog 问题
  17. 贝塞尔曲线 弯曲动画ios_用贝塞尔曲线弯曲
  18. UML图解和UML代码范例
  19. 用vb.net写一个简易的RSS阅读器
  20. 批处理登陆邮箱代码分析

热门文章

  1. mysql超卖问题处理_高并发下超卖问题及如何解决
  2. (SEED-Lab) DNS_Local Attack Lab
  3. android 周月切换,SuperCalendar: @Deprecated android 自定义日历控件 支持左右无限滑动 周月切换 标记日期显示 自定义显示效果跳转到指定日期...
  4. 【归档】Kata Containers 2.0 介绍
  5. 营销科学学会2021年年会揭晓玫琳凯博士论文奖得主
  6. C#学习笔记8 事件
  7. 趋势科技安全威胁病毒预警(本周十大病毒排名)
  8. 趋势科技笔试记录和补充
  9. ST188光电式传感器的应用
  10. 修改el-pagination分页样式